HSG |
|
Es soll folgendes Programm div.asm mit dem Debugger gdb untersucht werden.
# einfache Division .section .data a: .byte 142 b: .byte 17 q: .byte 0 r: .byte 0 .section .text .globl _start _start: movb (a), %al divb (b) # (a) == (b) * %al + %ah mov %ah, (r) mov %al, (q) movl $1, %eax movl (r), %ebx int $0x80
Zunächst sollte man beim Assemblieren mit dem Schalter -g die Symboltabelle anhängen. Es kann auch interessant sein, sich mit dem Schalter -a das erzeugte Listing ausgeben zu lassen.
as -a div.asm -o div.o -g
Das Programm ist noch nicht gelinkt, daher beginnen die Speicheradressen im Daten- und und im Code-Segment bei 0000. Nach dem Linken kann man das Programm ausf�hren.
ld div.o -o div
Nach dem Ausführen der Datei div ermittelt man den Rückgabewert des Programms. Er beträgt 6, das ist der Rest der Division 142:17. Wie kommt man an den Quotienten ran?
Der Debugger wird nun mit
gdb div
gestartet. Er meldet sich mit dem Prompt (gdb). Zuerst soll der Speicher untersucht werden. Das geht mit dem Befehl examine, abgekürzt x.
Wie ist das alles zu interpretieren? Was bewirkt &, was /b? Hier hilft (hier fehlt ein link).
Nun soll das Programm schrittweise durchgegangen werden und dabei die Register- und Speicherinhalte beobachtet werden.
Was bewirkt list, b 11, p/x $eax, si, x/b &r ? b kürzt break ab, p print.