无法正确读取ZF?

时间:2016-10-27 18:47:58

标签: assembly x86 gas

我发现自己无法正确读取零标志(ZF)位。我很困惑,因为这种方法似乎适用于其他标志,如进位标志(CF)或溢出标志(OF)。我的策略是使用指令EFLAGSpushf寄存器压入堆栈,然后使用按位AND选择ZF位。

在下面的代码中,我将EAX设置为0xFFFFFFFE,因此在递增一次后它应该是0xFFFFFFFF并且ZF应该为零。如果我的理解是正确的,那么在将它递增两次之后,EAX应该是0x0并且ZF应该是1。但是,我的程序输出:

Value of Zero Flag: 0
Value of Zero Flag: 0

我期望它输出:

Value of Zero Flag: 0
Value of Zero Flag: 64

我的代码是:

.text
.global main

main:

    movl    $0xfffffffe, %eax

    addl    $1, %eax

    pushf
    pop     %ebx
    andl    $0x40, %ebx
    pushl   %ebx
    pushl   $strzf
    pushl   $string
    call    printf
    pop     %ebx
    pop     %ebx
    pop     %ebx


    addl    $1, %eax

    pushf
    pop     %ebx
    andl    $0x40, %ebx
    pushl   %ebx
    pushl   $strzf
    pushl   $string
    call    printf
    pop     %ebx
    pop     %ebx
    pop     %ebx

    leave
    ret

.section        .rodata
    string:
        .string "Value of %s: %d\n"
    strzf:
        .string "ZF"

0 个答案:

没有答案