MIPS |
I8086 |
RISC |
CISC |
- conjunto de instruções reduzido |
- conjunto de instruções alargado |
- instruções simples |
- inclui instruções complexas |
- h/w simplificado |
- h/w complexo |
32 registos (32 bits) |
8 registos (16 bits) AX, BX, CX, DX SI, DI, BP, SP (BP e SP são para a stack) (BX, SI, DI indexação) |
Conjunto de modos de endereçamento limitado |
Conjunto de modos de endereçamento alargado (reg1 + reg2 + Imm) |
Operandos sempre em registos (load/store) |
1 operando pode estar em memória |
3 operandos Dest = op1 Å op2 |
2 operandos op1 = op1 Å op2 |
ADD $s0, $s1, $s2 |
ADD [BX], AX |
Exemplo: I8086 (sintaxe a la MIPS)
struct elem {
int valor;
int tipo; }
void main () {
int i, a0, a1, a2, a3;
struct elem arr[100];
a0 = a1 = a2 = a3 = 0;
for (i=0 ; i<100 ; i++)
if arr[i].tipo = 0 a0++;
else if arr[i].tipo = 1 a1++;
else if arr[i].tipo = 2 a2++;
else a3++;
}
.data
arr: .space 400 # int = 2 bytes
a3: .word 0 # a3 em memória
.text
main:
li $cx, 0 # $cx --> a0
li $dx, 0 # $dx --> a1
li $si, 0 # $si --> a2
li $ax, 0 # $ax --> i
ciclo:
cmp $ax, 100
bge fim
la $bx, arr
move $di, $ax
shl $di, 2 # $di =i*4 - apenas 2 operandos
cmp ($bx+$di+2), 0
bne else1
add $cx, 1 # a0++
b fimif
else1:
cmp ($bx+$di+2), 1
bne else2
add $dx, 1 # a1++
b fimif
else2:
cmp ($bx+$di+2), 2
bne else3
add $si, 1 # a2++
b fimif
else3:
la $bx, a3
add ($bx), 1 # a3++
fimif:
add $ax, 1
b ciclo
fim:
ret
Exercício: Codifique em assembly do I8086
(sintaxe a la MIPS)
struct elem {
int tipo;
int valor; }
main () {
struct elem str, arr[100];
int i;
i = 0;
while (i<100) && (arr[i].valor<str.valor)
{
arr[i].valor = arr[i].valor+1;
i++;
}
}