Lab 13: saltos (jump)
Ao final desse lab você deve ser capaz de:
- Escrever programas complexos em assembly que envolvem acesso a memória e saltos (condicionais e incondicionais)
Note
Dúvidas sobre assembly? Z01->Resumo Assembly
Esse lab deve ser feito no Z01Simulador, para abrir o programa basta executar o script Z01simulador.py
dentro da pasta do projeto f_Assembly
Incondicional
lcd1.nasm
f_Assembly/src/labs/lcd1.nasm
Preencha todos os px do LCD de preto!
Irei usar o RAM[0] para salvar o contador, que será incrementado a partir do endeço base do LCD 16384
até a onde o programa executar.
Neste exemplo, o valor final do loop não está sendo controlado!!
leaw $16384, %A
movw %A, %D
leaw $0, %A
movw %D, (%A)
LOOP:
leaw $0, %A
movw (%A), %D
addw $1, %D, (%A)
movw %D, %A
movw $-1, (%A)
leaw $LOOP, %A
jmp
nop
Condicional
Saltos condicionais são utilizados para verificarmos condições no programa, vamos trabalhar um pouco com isso.
jmp1.nasm
f_Assembly/src/labs/jmp1.nasm
Implemente o pseudo código a seguir em nasm:
if RAM[1] == 0:
RAM[0] = 1
else
RAM[0] = 2
Teste o programa com diferentes valores na RAM[1]:
- Teste 1: RAM[1] = 3
- Teste 2: RAM[1] = 0
- Teste 1: RAM[0] = 2
- Teste 2: RAM[0] = 1
Podemos reescrever o código para ficar:
RAM[0] = 2
if RAM[1] == 0:
RAM[0] = 1
leaw $2, %A
movw %A, %D
leaw $0, %A
movw %D, (%A) ; RAM[0] = 2
leaw $1, %A
movw (%A), %D ; busca valor verificar (RAM[1])
leaw $END, %A ; prepara salto
jne ; RAM[1] == 0?
nop
leaw $1, %A
movw $1, (%A) ; RAM[=] = 1
END:
jmp3.nasm
f_Assembly/src/labs/jmp3.nasm
Implemente o pseudo código a seguir em nasm:
if RAM[1] == 3:
RAM[0] = 1
else
RAM[0] = 2
Teste o programa com diferentes valores na RAM:
- Teste 1: RAM[1] = 3
- Teste 2: RAM[1] = 0
- Teste 1: RAM[0] = 1
- Teste 2: RAM[0] = 2
Não temos uma instrução de jmp que verifica se o valor de %D
é igual a 3, porém podemos subtrair 3 do calor salvo em RAM[1] e verificar se o resultado é igual a 0:
RAM[0] = 2
if RAM[1] - 3 == 0:
RAM[0] = 1
leaw $1, %A
movw (%A), %D
leaw $3, %A
subw %D, %A, %D ; %D = RAM[1] - 3
jmp4.nasm
- Criar o arquivo
f_Assembly/src/labs/jmp4.nasm
Implemente o pseudo código a seguir em nasm:
if RAM[1] + RAM[2] >= 3:
RAM[0] = 1
else
RAM[0] = 2
Teste o programa com diferentes valores na RAM:
- Teste 1: RAM[1] = 1 / RAM[2] = 4
- Teste 2: RAM[1] = 1 / RAM[2] = 1
- Teste 1: RAM[0] = 1
- Teste 2: RAM[0] = 2