在汇编中使用 fgets 接收输入

receiving input using fgets in assembly

我在汇编中使用 fgets 读取缓冲区时遇到问题。 我知道这些数字等于 ASCII 值 ATM ,这不是问题所在。我无法获得用户输入的真正价值。 在使用 fgets 之前,我需要打印字符串:"calc:",我认为它会干扰我的真实输入。

section .rodata

        CALC:   DB "calc:" , 10 , 0         ;format string 

section .bss
        buffer:         resb 80             ;store my input

;....更多数据,不相关

push CALC                       ;push string to stuck
call printf             
add esp, 4                      ;remove pushed argument

push dword [stdin]              ;fgets need 3 param
push dword 80                   ;max lenght
push dword buffer               ;input buffer
call fgets
add esp, 12                     ;remove 3 push from stuck

mov ecx, [buffer]              ;THIS IS FOR GDB
stop_here:

现在,问题是缓冲区中的值不是用户输入的值。当我使用 GDB 调试器来更好地理解时,我得到了以下结果:

input 0  --> ecx value is: 2608  (should be 48)
input 1  --> ecx value is: 2609  (should be 49)
input 10 --> ecx value is: 667697 (should be 48+49)
input 34 --> ecx value is: 668723 (should be 51+52)

编辑: 我尝试使用 gets 代替,现在可以了! 有人可以向我解释为什么吗?!

编辑 - 5 年后 - 我简直不敢相信我当时知道这么多集会

fgets 也将终止换行符存储到缓冲区中,并且由于您将 4 个字节加载到 ecx,您也会看到它。

2608 = 0A30 hex = '0' LF
667697 = 0A3031 hex = '1' '0' LF

(记住 x86 是小端。)