我从汇编(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
我在上面的代码有两个问题:
jne
不被采取。 我用gdb检查过dec
之后ebx
等于0x00,但是EFLAGS没有被test
指令改变。 这里发生了什么事? 还有关于代码的任何其他build议将受到欢迎。 谢谢。
test
指令按位执行and
不改变寄存器操作数。
test ebx,1
执行: flags = (ebx and 1)
。 或者ZF = IsEven(ebx)
。
如果你想测试ebx = 1,你需要使用一个cmp
。
cmp
执行减法而不改变寄存器操作数。
cmp ebx,1
执行flags = ebx - 1
或ZF = (ebx = 1)
。
系统调用退出
你有exit()
的错误参数。
正确的代码是:
exit: mov ebx,0 mov eax,1 <<-- int 0x80