2016-04-10 3 views
-2

Я пытаюсь прочитать целое число из stdin и после его написания в stdout, но единственное, что я выполняю, это написать просто мир привет. Это код, который у меня есть:Чтение и запись и целое число в сборке ATT

.global _start 
_start: 
push %ebp 
movl %esp,%ebp 
subl $4,%esp 


#Read 
mov $3,%eax #READ 
mov $0,%ebx #STDIN 
mov -4(%ebp),%ecx 
mov $1,%edx 
int $0x80 

#Write call 
mov $4,%eax #WRITE 
mov $1,%ebx #STDOUT 
mov -4(%ebp),%ecx 
mov $1,%edx 
int $0x80 

mov $1,%eax #exit 
mov $0,%ebx # exit code 
int $0x80 

Спасибо заранее и не быть слишком сильно на меня, потому что это мои первые шаги в сборке :)

+0

Хотя ответ сделок Нейта с одним вопросом, а другая на самом деле сводится к тому, что вы собираетесь do.You должны знать, что 'sys_read' системного вызова через 'int 0x80' ** не преобразует ** символ ASCII, представляющий числа, и сохраняет целое число в целевом элементе. Буквально, что хранится в -4 (% ebp), будут символы ASCII, которые составляют число, а не целочисленное значение. Если вам нужно, чтобы он преобразовывался в целое число, чтобы вы могли выполнить некоторую операцию и вычисления на нем, а затем записать его тогда вам понадобится код для преобразования ASCII в целое число при чтении и целое число в ASCII перед записью –

+0

Эффективно 'sys_read' только считывает символы ASCII в буфер. и 'sys_write' записывает только буфер, содержащий символы ASCII. –

+0

Спасибо за дополнительную информацию. – Miguel

ответ

0
mov -4(%ebp),%ecx 

При выполнении read системный вызов , %ecx должен содержать адрес, в котором вы хотите сохранить данные. Другими словами, вы хотите, чтобы %ecx равнялся %ebp минус 4. Но эта инструкция mov загрузит %ecx с содержимым памяти на %ebp - 4.

Я думаю, что вы хотите (в обоих местах) является

lea -4(%ebp), %ecx 
+0

Большое вам спасибо. Это действительно помогает мне! – Miguel