Warum funktioniert das NASM Code meine Umgebungsvariablen drucken?
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?
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
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.