我发现自己无法正确读取零标志(ZF)位。我很困惑,因为这种方法似乎适用于其他标志,如进位标志(CF)或溢出标志(OF)。我的策略是使用指令EFLAGS
将pushf
寄存器压入堆栈,然后使用按位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"