我从汇编(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
未被采纳。我在ebx
之后用gdb检查dec
等于0x00,但是test
指令没有改变EFLAGS。这里发生了什么?此外,欢迎任何其他有关代码的建议。感谢。
答案 0 :(得分:2)
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