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