Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在汇编中使用FGET接收输入_Assembly_Io_X86_User Input_Fgets - Fatal编程技术网

Assembly 在汇编中使用FGET接收输入

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

我在assemmbly中使用FGET读取缓冲区时遇到问题。 我知道这些数字等于ATM的ASCII值,这不是问题所在。我无法获得用户输入的真实值。 在使用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是little endian。)

嗨,答案是肯定的,因为
gets
不会将换行放入缓冲区:)请参见
man gets
:gets()将stdin中的一行读入s指向的缓冲区,直到终止换行符或EOF,并用空字节替换