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++;

}

}