Assembly 在汇编中使用FGET接收输入
我在assemmbly中使用FGET读取缓冲区时遇到问题。 我知道这些数字等于ATM的ASCII值,这不是问题所在。我无法获得用户输入的真实值。 在使用fgets之前,我需要打印字符串:“calc:”,我认为这会干扰我的实际输入Assembly 在汇编中使用FGET接收输入,assembly,io,x86,user-input,fgets,Assembly,Io,X86,User Input,Fgets,我在assemmbly中使用FGET读取缓冲区时遇到问题。 我知道这些数字等于ATM的ASCII值,这不是问题所在。我无法获得用户输入的真实值。 在使用fgets之前,我需要打印字符串:“calc:”,我认为这会干扰我的实际输入 section .rodata CALC: DB "calc:" , 10 , 0 ;format string section .bss buffer: resb 80
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是little endian。)嗨,答案是肯定的,因为
gets
不会将换行放入缓冲区:)请参见man gets
:gets()将stdin中的一行读入s指向的缓冲区,直到终止换行符或EOF,并用空字节替换