AC2 P Aula01
AC2 P Aula01
AC2 P Aula01
# int main(void)
# {
# printStr("AC2 – DETPIC32\n"); // system call
# return 0;
# }
.equ PRINT_STR,8
.data
msg: .asciiz "AC2 - DETPIC32\n"
.text
.globl main
main: la $a0,msg
ori $v0,$0,PRINT_STR
syscall # printStr("AC2 – DETPIC32\n");
ori $v0,$0,0 # return 0;
jr $ra
1 https://en.wikipedia.org/wiki/Intel_HEX
José Luís Azevedo, Arnaldo Oliveira, Tomás Oliveira e Silva, Pedro Lavrador
Arquitetura de Computadores II, DETI/UA – 2016/17 2
NOTA: O código que escrever vai ser executado numa arquitetura pipelined de 5 fases com
delayed branches. Ou seja, em todas as instruções que alteram o fluxo de execução (beq,
bne, j, jal, jr, jalr) a instrução que vem imediatamente a seguir é sempre executada,
independentemente do comportamento da instrução de salto. Apesar disso, não necessita
de ter em conta este comportamento, uma vez que o assembler efetua, de forma
automática, a reordenação das instruções de modo a preencher, sempre que possível o
delayed slot. Nos casos em que o assembler deteta que não pode reordenar as instruções
devido a dependência(s) de dados, o delayed slot é preenchido com a instrução "nop". Este
comportamento deve ser verificado através da análise do ficheiro produzido pelo programa
hex2asm (por exemplo "prog1.hex.s").
2 Se está a usar o seu computador pessoal, é provável que tenha que realizar a seguinte configuração:
1) Verificar que o utilizador pertence ao grupo dialout: comando groups
2) Adicionar o utilizador ao grupo dialout: comando sudo adduser $USER dialout
3 Os 3 comandos normalmente usados (pcompile, ldpic32 e pterm) podem ser encadeados numa
única linha de comando, do seguinte modo (usando como exemplo o ficheiro "prog1.s"):
pcompile prog1.s && ldpic32 prog1.hex && pterm
José Luís Azevedo, Arnaldo Oliveira, Tomás Oliveira e Silva, Pedro Lavrador
Arquitetura de Computadores II, DETI/UA – 2016/17 3
*************************************************************************
// Programa 2 – teste do system call "inkey()"
//
int main(void)
{
char c;
while (1)
{
while ((c = inkey()) == 0);
if (c == '\n')
break;
printStr("Key pressed\n");
}
return 0;
}
*************************************************************************
// Programa 3 – teste dos system calls "getChar()" e "putChar()"
//
int main(void)
{
char c;
while (1)
{
c = getChar();
if (c == '\n')
break;
putChar(c);
}
return 1;
}
*************************************************************************
// Programa 4 – teste dos system calls de leitura e impressão de inteiros
//
void main(void)
{
int value;
while (1)
{
printStr("\nIntroduza um numero (sinal e módulo): ");
value = readInt10();
printStr("\nValor lido em base 2: ");
printInt(value, 2);
printStr("\nValor lido em base 16: ");
printInt(value, 16);
printStr("\nValor lido em base 10 (unsigned): ");
printInt(value, 10);
printStr("\nValor lido em base 10 (signed): ");
printInt10(value);
}
}
José Luís Azevedo, Arnaldo Oliveira, Tomás Oliveira e Silva, Pedro Lavrador
Arquitetura de Computadores II, DETI/UA – 2016/17 4
*************************************************************************
// Programa 5 – teste do system call "readStr()" e manipulação de strings
//
#define STR_MAX_SIZE 20
int main(void)
{
static char str1[STR_MAX_SIZE + 1];
static char str2[STR_MAX_SIZE + 1];
static char str3[2 * STR_MAX_SIZE + 1];
*************************************************************************
// String length
//
int strlen(char *s)
{
int len;
for(len = 0; *s != 0; len++, s++);
return len;
}
*************************************************************************
// String concatenate
//
char *strcat(char *dst, char *src)
{
char *rp = dst;
*************************************************************************
// String copy
//
char *strcpy(char *dst, char *src)
{
char *rp = dst;
José Luís Azevedo, Arnaldo Oliveira, Tomás Oliveira e Silva, Pedro Lavrador
Arquitetura de Computadores II, DETI/UA – 2016/17 5
*************************************************************************
// String compare (alphabetically).
// Returned value is:
// < 0 string "s1" is less than string "s2"
// = 0 string "s1" is equal to string "s2"
// > 0 string "s1" is greater than string "s2"
//
int strcmp(char *s1, char *s2)
{
for(; (*s1 == *s2) && (*s1 != 0); s1++, s2++);
return(*s1 - *s2);
}
Elementos de apoio
• Tabela com resumo do conjunto de instruções da arquitetura MIPS, na versão adaptada a
Arquitetura de Computadores II (disponível no moodle de AC2).
• Slides das aulas teóricas de Arquitetura de Computadores I.
• David A. Patterson, John L. Hennessy, Computer Organization & Design – The
Hardware/Software Interface, Morgan Kaufmann Publishers.
José Luís Azevedo, Arnaldo Oliveira, Tomás Oliveira e Silva, Pedro Lavrador