0
extern putchar
extern exit
section .data

section .text
global main
main:

push 's'

mov eax, 2

cmp eax, 2

point:
call putchar
jz point

push 0
call exit

在控制台上,我只看到一个 's' 字符。

编译并运行:

nasm -f elf ./prog.asm
gcc -m32 -o prog ./prog.o
./prog
4

2 回答 2

5

cmp “等于 0”(也就是说,它确实设置了 ZF 标志)。但是,call putchar下一行中的 正在丢弃由 设置的标志cmp,因此您jz不起作用(或多或少是偶然的)。如果您想保存标志以供以后比较,您可以使用pushfand popf,但是这在您的情况下不会真正起作用,因为putchar会期望堆栈中的字符,而不是标志。

现在,回答您没有说明的实际问题。我假设你想打印 's' 两次。以下是如何正确执行此操作:

  mov eax, 2 ; init counter

print_loop:
  push eax; save the counter since it will be trashed by putchar
  push 's'
  call putchar
  add esp, 4 ; restore the stack pointer since putchar is cdecl
  pop eax ; restore the saved counter
  dec eax ; decrement it
  jnz print_loop ; if it's not yet zero, do another loop

add esp, 4可以用另一个pop eax稍短的代码替换。

于 2013-03-13T00:02:34.560 回答
2

执行 a 的结果cmp是标志被设置zf为零,等等。然后,您可以根据是否设置了标志进行分支,或者使用其中一条set?指令al根据是否设置了标志来设置值,例如寄存器。

于 2013-03-12T22:26:35.090 回答