Considere o código em assembler x86 listado a seguir:
movdx, 3
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:
  1. 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
  2. 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
  3. 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

Exercícios relacionados