关于linux:不采取条件跳转

Conditional jump not taken

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 检查了 ebxdec 之后等于 0x00,但是 EFLAGS 不会被 test 指令更改。
  • 退出系统调用不退出!因此,我没有退出,而是在无限循环中打印了我的消息,因为 print_string 正在调用 exit 并且退出后 print_string 一遍又一遍地进行。
  • 这里发生了什么?还欢迎关于代码的任何其他建议。谢谢。


    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() 设置了错误的参数。

    正确的代码是:

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