没有采取条件跳转

我从汇编(x86,linux)开始,只是为了好玩。 这是我的第一个小程序,它只是检查我是否通过命令行传递了一个参数,如果没有,它会打印一条消息,然后退出:

section .text global _start _start: pop ebx ;argc dec ebx test ebx,1 jne print_string exit: mov ebx,0 mov eax,0 int 0x80 print_string: mov edx,len mov ecx,msg mov ebx,1 mov eax,4 int 0x80 call exit section .data msg db "Ok, no arg was passed",0xa len equ $ - msg 

我在上面的代码有两个问题:

  1. jne不被采取。 我用gdb检查过dec之后ebx等于0x00,但是EFLAGS没有被test指令改变。
  2. 退出系统调用不退出! 所以不是退出,我只是让我的消息打印在无限循环中,因为print_string正在调用exit退出print_string一遍又一遍。

这里发生了什么事? 还有关于代码的任何其他build议将受到欢迎。 谢谢。

test指令按位执行and不改变寄存器操作数。
test ebx,1执行: flags = (ebx and 1) 。 或者ZF = IsEven(ebx)

如果你想测试ebx = 1,你需要使用一个cmp
cmp执行减法而不改变寄存器操作数。

cmp ebx,1执行flags = ebx - 1ZF = (ebx = 1)

系统调用退出
你有exit()的错误参数。

正确的代码是:

 exit: mov ebx,0 mov eax,1 <<-- int 0x80