在我的汇编程序中,我想测试标准输入是否达到其EOF
segment .data
.fmt_read db "%80s", 0 ; 79 bytes of actual string + terminating 0
segment .text
lea rdi, [.fmt_read]
lea rsi, [buf_str] ; buffer to fill in
xor eax, eax ; no floating-point parameters are passed
call scanf
cmp rax, -1 ; did we reach EOF(-1)
je .done ; yes? End the program
当我在gdb中调试它时,按 Ctrl-D 使scanf识别EOF。 然后在rax中测试返回值,希望找到一个EOF指标(-1)。
(gdb) p $rax
$5 = 4294967295
(gdb) p/x $rax
$6 = 0xffffffff
我知道二进制二补码中的值为-1。
虽然,我不明白为什么cmp rax, -1
没有设置ZF(因为它们是相同的)。
如何确定EOF?
答案 0 :(得分:3)
没有CMP r/m64, imm64
(或CMP RAX, imm64
)。将CMP RAX, imm32
符号扩展为立即操作数为64位,即-1
(0xffffffff
)将符号扩展为0xffffffffffffffff
。
如果您想将RAX
与0xffffffff
进行比较,可以使用以下内容:
mov ebx, -1
cmp rax, rbx
或者您可以在比较中使用EAX
而不是RAX
:
cmp eax, -1