在汇编中使用fgets接收输入



我在使用汇编中使用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)

编辑:我尝试使用get,现在可以使用!有人可以向我解释为什么?

编辑 - 5年后 - 我不敢相信我知道这么多的组装

fgets也将终端线存储在缓冲区中,并且由于您将4个字节加载到ecx中,因此您还将看到。

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

(请记住,X86是小endian。)

相关内容

  • 没有找到相关文章