Considere o código em assembler x86 listado a seguir:
movax, 0
LOOP1: dec dx
jz FORA
inc ax
mov cx,5
LOOP2: dec cx
inc ax
jnz LOOP2
jmp LOOP1
FORA: …
O valor de ax, ao final da execução, é
Escolha uma:
a. 18
(b) b. 12
c. 15
d. 10
e. 13
movax, 0
LOOP1: dec dx
jz FORA
inc ax
mov cx,5
LOOP2: dec cx
inc ax
jnz LOOP2
jmp LOOP1
FORA: …
O valor de ax, ao final da execução, é
Escolha uma:
a. 18
(b) b. 12
c. 15
d. 10
e. 13
Passo 1
Beleza, vamos lá! Temos um código em assembler x86 que manipula alguns registradores e usa loops para contar até o final. A pergunta quer saber qual será o valor final do registrador ax depois que o código terminar de rodar. Para resolver isso, a gente vai precisar entender como os loops funcionam no assembly e como os registradores dx, ax e cx estão sendo modificados ao longo do código.
Passo 2
Primeiro, vamos ver o que cada linha do código está fazendo no início:
mov dx, 3
mov ax, 0
mov dx, 3
: Isso coloca o valor 3 no registrador dx.mov ax, 0
: Isso coloca o valor 0 no registrador ax.
Então, no começo, temos:
- dx = 3
- ax = 0
Passo 3
Agora, entraremos no primeiro loop, chamado LOOP1:
LOOP1: dec dx
jz FORA
dec dx
: Isso decrementa (subtrai 1) o valor de dx.jz FORA
: “Jump if Zero” – se o resultado do decremento deixou dx igual a zero, o programa pula para a etiqueta FORA e sai do loop.
Então, a cada vez que entramos no LOOP1, dx diminui em 1. Vamos ver quantas vezes isso acontece.
Passo 4
Se dx não for zero depois de
dec dx
, continuamos:inc ax
mov cx, 5
inc ax
: Incrementa ax em 1.mov cx, 5
: Coloca o valor 5 no registrador cx.
Agora:
- ax aumenta em 1.
- cx é resetado para 5 para o próximo loop interno.
Passo 5
Entramos no segundo loop, chamado LOOP2:
LOOP2: dec cx
inc ax
jnz LOOP2
dec cx
: Decrementa cx em 1.inc ax
: Incrementa ax em 1.jnz LOOP2
: “Jump if Not Zero” – se cx ainda não é zero, volta para LOOP2.
Esse loop interno vai rodar 5 vezes (já que cx começa em 5), e a cada vez, ax aumenta em 1.
Passo 6
Depois de completar o LOOP2, voltamos para o LOOP1:
jmp LOOP1
jmp LOOP1
: Pula de volta para o início do LOOP1.
Isso vai continuar até que dx seja decrementado para zero, saindo do loop.
Passo 7
Vamos simular as iterações:
-
Primeira iteração de LOOP1:
- dx = 3 → decrementar → dx = 2
- ax = 0 → incrementar → ax = 1
- LOOP2 roda 5 vezes:
- ax vai de 1 a 6
-
Segunda iteração de LOOP1:
- dx = 2 → decrementar → dx = 1
- ax = 6 → incrementar → ax = 7
- LOOP2 roda 5 vezes:
- ax vai de 7 a 12
-
Terceira iteração de LOOP1:
- dx = 1 → decrementar → dx = 0
- Como dx agora é zero, o
jz FORA
faz o código sair do loop.
Resposta
b. 12