2016-04-10 14 views
-2

Ich habe versucht, eine ganze Zahl von Stdin zu lesen und nach dem Schreiben in stdout, aber das einzige, was ich beende ist Schreiben einer einfachen Hallo Welt. Dies ist der Code, den ich habe:Lesen und schreiben und Integer in Assembly 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 

Vielen Dank im Voraus und zu hart sie nicht auf mir, weil diese meine ersten Schritte in der Montage sind :)

+0

Obwohl Nate Antwort befasst sich mit einem Thema, das andere kommt wirklich darauf an, was Sie do.You beabsichtigen, müssen sich bewusst sein, dass 'sys_read' syscall über 'int 0x80' ** konvertiert ** ASCII-Zeichen, die Zahlen darstellen, nicht und speichert die Ganzzahl im Ziel. Buchstäblich, was bei -4 (% ebp) gespeichert wird, sind die ASCII-Zeichen, aus denen die Zahl besteht, nicht der Ganzzahlwert. Wenn Sie es in eine ganze Zahl konvertieren müssen, können Sie einige Operationen und Berechnungen daran vornehmen und dann schreiben Dann brauchst du Code, um ASCII in Integer zu konvertieren, wenn du liest, und Integer in ASCII, bevor du schreibst –

+0

Effektiv 'sys_read' liest nur ASCII-Zeichen in einen Puffer. und 'sys_write' schreibt nur einen Puffer, der ASCII-Zeichen enthält. –

+0

Danke für die zusätzlichen Informationen. – Miguel

Antwort

0
mov -4(%ebp),%ecx 

Bei der Herstellung der read Systemaufruf , %ecx soll die Adresse enthalten, wo die Daten gespeichert werden sollen. Mit anderen Worten, Sie wollen %ecx gleich %ebp minus 4. Aber diese mov-Anweisung lädt %ecx mit dem Inhalt des Speichers bei %ebp - 4.

Ich denke, was Sie wollen (in beiden Orten) ist

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

Vielen Dank. Es hilft mir wirklich! – Miguel