Wie liest man Eingaben von STDIN in x86_64 Assembly?

8

Ich versuche, x86_64 Assembly zu lernen, und ich habe heute versucht Standard-Input-Output und stolperte über diesen Beitrag Lernbaugruppe - Name des Echoprogramms Wie würde ich das Gleiche tun, um die Eingabe von STDIN zu lesen (mit der Anweisung SYSCALL)? Vor allem, wenn ich weiß, dass die Eingabe immer eine Ganzzahl ist und ich möchte es in ein Register lesen?

BEARBEITEN: @Daniel Kozars Antwort unten half mir zu verstehen, wie STDIN und STDOUT mit der SYSCALL-Anweisung unter Linux arbeiten. Ich habe versucht, ein kleines Programm zu schreiben, das eine Zahl von der Konsoleneingabe liest und das dieser Zahl entsprechende ASCII-Zeichen ausgibt. Wenn Sie 65 als Eingabe eingeben, sollten Sie A als Ausgabe erhalten. Und auch ein neuer Zeilencharakter. Wenn überhaupt, hilft es jedem anderen: -)

%Vor%

BEARBEITEN 2: Hier ist mein Versuch, eine vorzeichenlose 32-Bit Dezimalzahl aus der Standardeingabe zu lesen, sie als Ganzzahl für Berechnungen zu speichern und dann wieder in std out zu schreiben.

%Vor%     
Madhusudan.C.S 10.03.2012, 13:24
quelle

1 Antwort

5

Zunächst einmal: Es gibt keine Variablen in der Assembly. Es gibt nur Etiketten für irgendeine Art von Daten. Die Daten sind konstruktionsbedingt untypisiert - zumindest in realen Assembler, nicht HLA (z. B. MASM).

Das Lesen von der Standardeingabe erfolgt über den Systemaufruf read . Ich nehme an, Sie haben bereits den Beitrag gelesen, den Sie erwähnt haben, und Sie wissen, wie Sie Systemaufrufe in x64 Linux aufrufen. Angenommen, Sie verwenden NASM (oder etwas, das der Syntax ähnelt) und die Eingabe von stdin unter der Adresse buffer speichern möchten, in der Sie BUFSIZE bytes Speicher reserviert haben, führen Sie den Systemaufruf aus würde so aussehen:

%Vor%

Beim Zurückgeben enthält rax das Ergebnis des syscall. Wenn Sie mehr darüber erfahren möchten, wie es funktioniert, wenden Sie sich bitte an man 2 read .

Das Parsen einer Ganzzahl in Assembler ist jedoch nicht so einfach. Da read nur einfache Binärdaten liefert, die auf der Standardeingabe erscheinen, müssen Sie den Integer-Wert selbst konvertieren. Denken Sie daran, dass das, was Sie auf der Tastatur eingeben, als ASCII-Codes an die Anwendung gesendet wird (oder eine andere Kodierung, die Sie möglicherweise verwenden - ich nehme hier ASCII an). Daher müssen Sie die Daten von einer ASCII-codierten Dezimalzahl in Binärwerte konvertieren.

Eine Funktion in C zum Umwandeln einer solchen Struktur in einen normalen unsigned int würde etwa so aussehen:

%Vor%

Das Konvertieren in Assembly (und das Erweitern auf vorzeichenbehaftete Zahlen) wird dem Leser als Übung überlassen. :)

Last but not least - der write syscall erfordert, dass Sie immer einen Zeiger auf einen Puffer mit den Daten übergeben, die in einen bestimmten Dateideskriptor geschrieben werden sollen. Wenn Sie also eine neue Zeile ausgeben möchten, gibt es keinen anderen Weg, als einen Puffer zu erstellen, der die Newline-Sequenz enthält.

    
Daniel Kamil Kozar 10.03.2012, 14:11
quelle

Tags und Links