未采取条件跳转

时间:2017-09-02 14:26:04

标签: linux assembly x86

我从汇编(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未被采纳。我在ebx之后用gdb检查dec等于0x00,但是test指令没有改变EFLAGS。
  2. 退出系统调用不会退出!所以不是退出我只是在无限循环中打印我的消息,因为 print_string 正在调用退出并且在退出之后会出现 print_string 一遍又一遍。
  3. 这里发生了什么?此外,欢迎任何其他有关代码的建议。感谢。

1 个答案:

答案 0 :(得分:2)

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