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