Assembly 04
2.15 Loops: a utilização de vetores com índice variável
Exemplo: Seja o loop programado na linguagem C:
Loop: g = g + A[ i ]; i = i + j; if (i != h) go to Loop;
Suponha que A seja um vetor de 100 posições e para g, h, i e j são associados os regs. $s1--$s4. O vetor base está armazenado em $s5.
Loop:add $t1, $s3, $s3 add $t1, $t1, $t1 add $t1, $t1, $s5 lw $t0, 0( $t1)
# t1 Å 2* i
# t1Å 4 *i
# t1Å endereço de A[ i ]
# t0Å A[ i ]
add $s1, $s1, $t0 add $s3, $s3, $s4
# g Å g + A[ i ]
# i Å i + j
bne $s3, $s2, Loop
# desvia para o Loop se i != j
2.16 Loop While:
____________________________________________________________
Exemplo: while (save [ i ] == k i = i + j;
Suponha que as variáveis estão associadas com os regs. $s3, $s4 e $s5 e que o endereço base do vetor save está em $s6.
Loop:add $t1, $s3, $s3 add $t1, $t1, $t1 add $t1, $t1, $s6 lw $t0, 0( $t1)
# t1 Å 2* i
# t1Å 4 *i
# t1Å endereço de save[ i ]
# t0Å save[ i ]
bne $t0, $s5, Exit
# desvia para Exit se save[ i ]
add $s3, $s3, $s4
# i Å i + j
!= k j Loop
Exit:
# desvia para Loop
47
COM 168 - Arquitetura de Computadores – Capítulo 3
2.17 Compilação do testes Menor do que.
A instrução usada para testar dois valores é conhecida como set on less than ou slt.
Esta instrução compara valores de dois registradores e atribui o valor 1 a um terceiro se o valor do primeiro registrador for menor que o segundo; caso contrário atribui zero. slt $t0, $s3, $s4 # Se $s3 < $s4 Æ $t0 = 1
Para criar facilidades de programação um registrador denominado de
$zero é mapeado no registrador 0.
____________________________________________________________
Exemplo:
Teste se uma variável a associada ao registrador $s0 é menor que b (reg.
$s1) e desvie para Less se a condição for verdadeira. slt $t0, $s0, $s1 # Se a < b Æ $t0 = 1 bne $t0, $zero, Less # desvia para Less se $t0 != 0
# isto se a < b
Comando Case/Switch:
Switch (k) {
Case 0: f = i + j; break; Case 1: f = g + h;