В моей сборке программы я хочу, чтобы проверить, что стандартный ввод достиг EOFПочему чтение EOF делает scanf return 4294967295?
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 сделать зсапЕ признать EOF. Затем проверьте возвращаемое значение в rax, надеясь найти индикатор EOF (-1).
(gdb) p $rax
$5 = 4294967295
(gdb) p/x $rax
$6 = 0xffffffff
Я понимаю, что это значение -1 в дополнении двоичного кода. Хотя, я не понял, почему cmp rax, -1
не установил ZF (поскольку они равны).
Как определить EOF?
64-бит -1 будет be '0xffffffffffffffff' – Michael
Zapping EAX при входе и тестировании RAX по возвращении - намеренно? –
@ Тому, да, я объяснил это в комментариях кода. –