2015-05-17 2 views
0

У меня возникла проблема с чтением в буфер с использованием fgets в assemmbly. Я знаю, что цифры равны ASCII-значению ATM, и это не проблема. Я не могу получить реальную ценность ввода пользователя. Перед использованием fgets мне нужно напечатать строку: «calc:», и я думаю, что она возится с моим реальным входом.получение ввода с использованием fgets в сборке

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) 

EDIT: я судимый используя вместо этого получает, и теперь он работает! может кто-нибудь ПОЖАЛУЙСТА, объясните мне почему ?!

ответ

2

fgets также хранит финишную линию в буфере, а так как вы загружаете 4 байта в ecx, вы также увидите это.

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

(Помните, что x86 мало младшему.)

+0

привет, цистерны для ответа, это помогает, – lolu

+0

но вы можете объяснить, почему он сделал работу с получает? – lolu

+0

Да, потому что 'gets' не помещает фид строки в буфер :) См.' Man gets': _gets() читает строку из stdin в буфер, на который указывает s, до тех пор, пока не будет завершающая новая строка или EOF, которую она заменяет с нулевым байтом – Jester

Смежные вопросы