28.02.2014 Aufrufe

NASM startklar machen

NASM startklar machen

NASM startklar machen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!