NASM startklar machen
NASM startklar machen
NASM startklar machen
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>NASM</strong> <strong>startklar</strong> <strong>machen</strong><br />
Wir verwenden für die Übungen <strong>NASM</strong> unter 64-bit-Linux. Dazu stelle ich drei Wege vor: einmal<br />
am Poolrechner, einmal mit Remote-Zugriff auf einen Poolrechner und einmal mit Linux in einer<br />
Virtual Box.<br />
Im Anschluss erkläre ich wie man mit <strong>NASM</strong> umgeht.<br />
Der "Poolrechner"-Weg<br />
Im Raum K38 sind Rechner mit 64-bit-Linux und <strong>NASM</strong> installiert. Hier könnt ihr euch einfach<br />
anmelden und loslegen. Macht weiter mit dem Abschnitt "<strong>NASM</strong> verwenden".<br />
Der "Remote"-Weg<br />
Für diesen Weg benötigt ihr einen SSH-Client. Unter Windows könnt ihr Putty verwenden. Wenn<br />
ihr in der Konsole arbeiten wollt, reicht der SSH-Client aus. Falls ihr eine grafische<br />
Benutzeroberfläche bevorzugt, arbeitet dieses Tutorial auch durch.<br />
Loggt euch mit eurem SSH-Client auf einen Rechner in K38 ein, z.B. "peking.imp.fu-berlin.de".<br />
Ihr werdet bei Putty dann gefragt, ob ihr dem Host vertraut. Klick dann auf "Ja". Als nächstes müsst<br />
ihr euch mit euren Zedat-Namen und -Passwort anmelden. Nun könnt ihr wie in der Konsole auf<br />
dem Rechner arbeiten.<br />
Um Dateien in der Konsole zu bearbeiten (z.B. Assembler-Quelltexte), arbeitet euch in "pico",<br />
"nano" oder "vim" ein. Falls ihr einen X-Server (wie Xming im verwiesenen Tutorial) benutzt,<br />
könnt ihr einfach "gedit&" eintippen und ein Text-Editor erscheint bei euch lokal auf dem Monitor.<br />
Ab hier könnt ihr mit dem Abschnitt "<strong>NASM</strong> verwenden" fortfahren.
Der "Virtual Box"-Weg<br />
Bei diesem Weg müsst ihr Virtual Box auf eurem System installieren und in die Virtual Box<br />
installiert ihr 64-bit-Ubuntu. Eine Anleitung für Windows ist hier zu finden. Das Tutorial ist nicht<br />
aktuell, aber im Prinzip muss man nur immer auf "Weiter" klicken. Die wichtigsten Optionen sind<br />
der Speicherort und die Größe der virtuellen Festplatte.<br />
Im Tutorial ist ein weiteres Tutorial vorhanden, das erklärt wie man Ubuntu installiert. Ein weiteres<br />
ist hier zu finden.<br />
Wenn Ubuntu installiert ist, fehlt nur noch <strong>NASM</strong>. Um <strong>NASM</strong> zu installieren, öffnet die Konsole<br />
(Terminal) und gebt folgendes ein:<br />
> sudo apt-get install nasm<br />
Bestätigt den Installationswunsch mit eurem Passwort, was ihr bei der Installation gewählt habt.<br />
Danach wird <strong>NASM</strong> installiert und ihr könnt mit dem Abschnitt "<strong>NASM</strong> verwenden" fortfahren.<br />
<strong>NASM</strong> verwenden<br />
Testlauf<br />
Um festzustellen, ob alles funktioniert wie es funktionieren sollte, haben wir ein paar Test-Dateien<br />
für euch zur Verfügung gestellt. Man kann sie hier oder wie folgt mittels Konsole runterladen:<br />
> wget http://page.mi.fu-berlin.de/markrudo/ti2/nasm_test.zip<br />
Zum Entpacken und Ausführen führt bitte folgende Befehle aus:<br />
> unzip nasm_test.zip
Archive: nasm_test.zip<br />
creating: nasm_test/<br />
inflating: nasm_test/foo.asm<br />
inflating: nasm_test/Makefile<br />
inflating: nasm_test/hello.asm<br />
inflating: nasm_test/bar.c<br />
> cd nasm_test<br />
> make<br />
> ./foo<br />
Hello, world!<br />
> ./hello<br />
Test Here!<br />
Hello from Assembly!<br />
Wenn alles so ausgegeben wird wie hier angegeben, war der Test erfolgreich.<br />
Allgemeiner Ablauf<br />
Allgemein befolgt man fünf Schritte: Assembler-Quellcode schreiben, Quellcode zu einer Objekt-<br />
Datei kompilieren, Objekt-Dateien zu einer Ausführbaren linken, Ausführbare starten bzw.<br />
Ausführbare debuggen.<br />
Quellcode schreiben<br />
Als Beispiel sei hier "Hello World!" gegeben. Wir speichern die Datei als "hello_world.asm".<br />
section .data<br />
msg: db "Hello, world!", 10<br />
.len: equ $ - msg ; Länge des Strings<br />
section .text<br />
global main<br />
main:<br />
mov<br />
mov<br />
mov<br />
mov<br />
int<br />
eax, 4 ; write<br />
ebx, 1 ; stdout<br />
ecx, msg<br />
edx, msg.len<br />
0x80<br />
mov eax, 1 ; exit<br />
mov ebx, 0<br />
int 0x80<br />
Quellcode kompilieren<br />
Zur Kompilierung reicht folgender Befehl aus:<br />
> nasm -f elf64 hello_world.asm<br />
Dabei gibt -f das Ausgabeformat an - in diesem Fall das 64-bit-ELF-Format für Linux.<br />
Nach Ausführung dieses Befehls sollte eine Objekt-Datei "hello_world.o" erzeugt worden sein.<br />
Wenn ihr zusätzlich ein Listing ausgegeben haben wollt, dann gebt noch die -l Option an.<br />
> nasm -f elf64 -l hello_world.lst hello_world.asm
Objekt-Dateien linken<br />
Die in <strong>NASM</strong> erzeugten Objektdateien können Verweise zueinander enthalten. Beispiel: Datei<br />
A.asm ruft Label xyz auf, Label xyz wurde aber in Datei B.asm definiert. Dann enthält A.asm einen<br />
Verweis nach B.asm, welcher vom sogenannten Linker aufgelöst werden muss.<br />
Der Linker übernimmt im allgemeinen die Aufgabe mehrere Programmmodule (Objekt-Dateien) zu<br />
einer ausführbaren Datei zu binden.<br />
Um Den Linker auf unsere Objekt-Datei anzuwenden, gebt einfach folgendes in der Konsole ein:<br />
> gcc -o hello_world hello_world.o<br />
Dabei wird eine Ausführbare "hello_world" erstellt (-o Option).<br />
Ausführbare starten<br />
Um die Ausführbare zu starten einfach folgendes eingeben:<br />
> ./hello_world<br />
Ausführbare debuggen<br />
Um die Ausführbare zu debuggen, ruft man den GNU Debugger mit der Ausführbaren als<br />
Parameter auf:<br />
>gdb hello_world<br />
In GDB kann man dann Breakpoints bei den verwendeten Labels setzen mit:<br />
gdb> break label<br />
Um eure Anwendung zu starten, einfach den RUN-Befehl eingeben. Der Debugger wird beim<br />
ersten Label stoppen, das ihr als Breakpoint gesetzt habt.<br />
gdb> run<br />
Um zu sehen wo ihr euch grad befindet, gebt folgendes ein:<br />
gdb> disassemble<br />
Es wird der Maschinen-Code für das aktuelle Unterprogramm ausgegeben (das Label unter dem ihr<br />
euch befindet). Ein Pfeil (=>) zeigt eure aktuelle Position im Code.<br />
Wenn ihr die aktuelle Belegung der Register wissen wollt, gebt "info registers" ein.<br />
Mit "nexti" veranlasst ihr den Debugger genau eine Instruktion fortzuschreiten.<br />
Mehr Tricks sind hier nachzulesen.
Weitere Links<br />
Hier findet ihr ein Foliensatz zu Adressierungsarten.<br />
Hier findet ihr eine Befehlsreferenz zu x86.<br />
<strong>NASM</strong> Dokumentation.