Linux 为什么CMP2,2是';t等于0

Linux 为什么CMP2,2是';t等于0,linux,assembly,nasm,Linux,Assembly,Nasm,在控制台上,我只看到一个“s”字符 编译并运行: 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 执行cmp的结果是设置标志,zf为零,依此类推。然后,您可以根据是否设置了标志进行分支,也可以使用set?指令中的一条指令来设置一个值,

在控制台上,我只看到一个“s”字符

编译并运行:

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

执行
cmp
的结果是设置标志,
zf
为零,依此类推。然后,您可以根据是否设置了标志进行分支,也可以使用
set?
指令中的一条指令来设置一个值,例如
al
寄存器,该寄存器根据是否设置了标志进行设置。

cmp等于0(即,它设置了ZF标志)。但是,下一行中的
调用putchar
破坏了
cmp
设置的标志,因此您的
jz
不起作用(或多或少是偶然的)。如果您想保存标志以供以后比较,可以使用
pushf
popf
,但是这在您的情况下并不起作用,因为
putchar
需要堆栈上的字符,而不是标志

现在,回答你没有提到的实际问题。我假设您要打印两次“s”。下面是如何正确地执行此操作:

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

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

如果您希望
子eax,2
而不是
cmp eax,2
处理程序集,则需要说明体系结构。即使人们可以从链接器的参数中找到它。@BenVoigt:标记确实提到了“linux”。
  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