为什么读取EOF会使scanf返回4294967295?

时间:2016-09-14 06:22:13

标签: assembly scanf x86-64

在我的汇编程序中,我想测试标准输入是否达到其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?

1 个答案:

答案 0 :(得分:3)

没有CMP r/m64, imm64(或CMP RAX, imm64)。将CMP RAX, imm32符号扩展为立即操作数为64位,即-10xffffffff)将符号扩展为0xffffffffffffffff

如果您想将RAX0xffffffff进行比较,可以使用以下内容:

mov ebx, -1
cmp rax, rbx

或者您可以在比较中使用EAX而不是RAX

cmp eax, -1