Frage

Ich beende gerade eine Computerarchitektur Kurs in diesem Semester, wo unter anderem, haben wir bereits in MIPS Montage und läuft es in der MARS-Simulator Dilettantismus. Heute aus Neugier, begann ich mit NASM auf meinem Ubuntu-Box rumgespielt, und haben im Grunde eben Dinge zusammen aus Tutorials und bekommen ein Gefühl dafür, wie NASM unterscheidet sich von MIPS Ansetzen. Hier ist der Code-Schnipsel ich zur Zeit betrachten:

global _start

_start:

    mov eax, 4
    mov ebx, 1
    pop ecx
    pop ecx
    pop ecx
    mov edx, 200
    int 0x80
    mov eax, 1
    mov ebx, 0
    int 0x80

Dies wird als test.asm gespeichert und zusammengebaut mit nasm -f elf test.asm und mit ld -o test test.o verknüpft. Wenn ich es mit ./test anArgument aufrufen, druckt es anArgument ', wie erwartet, gefolgt von jedoch viele Zeichen es Pad nimmt die Zeichenfolge zu 200 Zeichen (wegen dieser mov edx, 200 statement) betragen. Das Interessante daran ist jedoch, dass diese Füllzeichen, die ich Kauderwelsch sein erwartet hätte, sind eigentlich von Anfang an meinen Umgebungsvariablen, wie sie in dem env Befehl angezeigt. Warum ist meine Umgebungsvariablen diese auszudrucken?

War es hilfreich?

Lösung

Ohne die tatsächliche Antwort zu wissen, oder die Zeit, die es zu sehen, ich vermute, dass die Umgebungsvariablen im Speicher nach den Befehlszeilenargumenten gespeichert zu bekommen. Ihr Code wird einfach puffern die Umgebungsvariable Strings überfüllt in und drucken zu.

Das macht wirklich Sinn, da die Befehlszeilenargumente vom System / loader behandelt werden, da die Umgebungsvariablen sind, so macht es Sinn, dass sie nahe beieinander gespeichert werden. Um dies zu beheben, müßten Sie die Länge der Befehlszeilenargumente finden und drucken nur, dass viele Zeichen. Oder, da ich annehmen, dass sie null terminierten Strings sind, drucken, bis Sie ein Null-Byte erreichen.

EDIT: Ich gehe davon aus, dass beiden Befehlszeilenargumente und Umgebungsvariablen in dem initialisierten Datenabschnitt gespeichert sind (.data in NASM, glaube ich)

Andere Tipps

Um zu verstehen, warum Sie immer Umgebungsvariablen sind, müssen Sie verstehen, wie die Kernel-Speicher auf Prozessstart arrangiert. Hier ist eine gute Erklärung mit einem Bild (nach unten scrollen zu „Stack-Layout“).

Solange Sie neugierig bist zu sein, möchten Sie vielleicht erarbeiten, wie die Adresse Ihrer Zeichenfolge drucken (Ich denke, es passiert in und Sie knallte es, den Stapel aus). Auch eine Hex-Dump-Routine schreiben, so dass Sie in diesem Speicher und anderen Adressen schauen Sie neugierig auf. Dies kann Ihnen helfen, die Dinge über das Programm Raum entdecken.

Neugierde kann das Wichtigste in Ihrem Programmierer Toolbox.

Ich habe nicht die Einzelheiten der Startvorgänge untersucht, aber ich denke, dass jedes Mal, wenn eine neue Shell startet, wird eine Kopie der Umgebung für sie gemacht wird. Sie können die Reste einer Schale sehen werden, die von einem Befehl gestartet wurde Sie lief, oder ein Skript geschrieben, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top