einführung in assembler teil 2: programmieren · einführung in assembler teil 2: programmieren...
Post on 30-Apr-2020
26 Views
Preview:
TRANSCRIPT
Einführung in Assembler Teil 2: Programmieren
• Assemblerprogrammierung: Schritt für Schritt• Instruktionen, Flusskontrolle, Datenstrukturen• Anbindung von Peripherie• Kommunikation mit Systembibliotheken
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 3
Ablauf der ProgrammerstellungLinux
Programmtext erstellen
Assemblieren (übersetzen)
Linken (binden)
Ausführen
Programm-text
Assembler
OBJ-Datei
Linker
ausführbareDatei
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 4
Programm = Abfolge von Anweisungen für die CPU im Speicher
CPU Speicher(ROM, RAM)
Ein-/Ausgabe
Bussystem
CPU
Instruction Pointer
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 5
Maschinencode
Die im Speicher abgelegten Anweisungen für die Maschine sind eine Folge von Steuerworten1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1In Hexcode: B8 32 4D
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 6
Maschinencode Beispiel
1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1B8 32 4DBelege das Register AX mit dem 16-Bit Wert 4D32h
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 7
Assembler: Symbolische Schreibweise
Zahlen (und Regeln) sind schwer zu merken -->
Mnemonics: MOV AX, 4D32h ; Belege (Move) das Register AX mit dem zweiten Operanden (4D32h)
F
Aufgaben des Assemblers
• Zusammensetzen (engl. to ASSEMBLE) eines Maschinencodes aus den Teilen eines in mnemonischer Kodierung angegebenen BefehlsMOV AX, 4D32h -->Move Immediate to register AX given 16 bit data 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1
• Berechnen von Speicher- und relativen Sprungadressen
• Makros: wiederkehrende parametrierbare Code-“schnippsel“
• Erkennen von Fehlern• Erzeugen einer OBJ-Datei (Maschinencode)
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 9
Aufgaben eines Linkers
Häufig sind einige Adressen und Sprungziele während der Assemblierung noch nicht bekannt --> OBJ-Datei enthält ggf. „Leerstellen“ für Verweise auf externe Programmfragmente und Speicherstellen.
Zur Erstellung eines lauffähigen Programms
muss das Programm deshalb mit den externen Programmfragmenten zusammengebunden (engl. to LINK) werden.
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 10
Ablauf der ProgrammerstellungLinux
Programm erstellenProzess: Editieren, z.B. mit gedit, eclipseErgebnis: Datei hallo.asm
Assemblieren (übersetzen)Prozess: nasm -g -f elf hallo.asmErgebnis: Objektdatei hallo.o
Linken (binden)Prozess: gcc -g -o hallo hallo.oErgebnis: Ausführbare Datei hallo
Programm-text
Assembler
OBJ-Datei
Linker
ausführbareDatei
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 11
Assemblerprogramm: hallo.asm
section .datamsg: db 'Hello World!',0x0A ;Text inkl. NLlen equ $ - msg ;Laenge des Textes
section .textglobal main ;Hier beginnt das Programmmain:mov eax, 4 ;Systemaufruf Nr. 4 (sys_write) Textausgabemov ebx, 1 ;Ausgabekanal Nr. 1 = stdoutmov ecx, msg ;Adresse unseres Textes im Speichermov edx, len ;Laenge des Textes in Bytesint 0x80 ;Kernel-Funktion aufrufen mov eax, 1 ;Systemaufruf Nr. 1 (sys_exit) Programmendeint 0x80 ;Kernel-Funktion aufrufen
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2009 Folie 12
Nach Assemblierung: hallo.o (hallo.lst)
1 section .data 2 00000000 48656C6C6F20576F72- msg: db 'Hello World!',0x0A ;Text inkl. Zeilenumbruch LF(0x0A) 3 00000009 6C64210A 4 len equ $ - msg ;Laenge des Textes berechnen (12-Bytes) 5 6 section .text 7 global main 8 9 main: 10 00000000 B804000000 mov eax, 4 ;Systemaufruf Nr. 4 (sys_write) Textausgabe 11 00000005 BB01000000 mov ebx, 1 ;Ausgabekanal Nr. 1 = stdout 12 0000000A B9[00000000] mov ecx, msg ;Adresse unseres Textes im Speicher 13 0000000F BA0D000000 mov edx, len ;Laenge des Textes in Bytes 14 00000014 CD80 int 0x80 ;Kernel aufrufen mit obigen System-Aufrufparametern 15 16 00000016 B801000000 mov eax, 1 ;Systemaufruf Nr. 1 (sys_exit) Programmende 17 0000001B CD80 int 0x80 ;Kernel aufrufen mit obigen System-Aufrufparametern
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 13
Speicherauszug des laufenden Programms
0x08048350 : 0x8048350 <Hex> Address 0 - 3 4 - 7 8 - B C - F 08048350 B8040000 00BB0100 0000B95C 950408BA 08048360 0D000000 CD80B804 000000BB 01000000 08048370 B9699504 08BA1F00 0000CD80 B8010000 08048380 00BB0000 0000CD80
Heruntergebrochen auf Befehle incl. Operanden:B804000000, BB01000000, B95C950408, BA0D000000 CD80B804000000, BB01000000, B969950408, BA1F000000CD80 B801000000, BB00000000,CD80
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 15
Grundgerüst für ein Linux- Assemblerprogramm
Abschnittesection .data Initialisierte Variablensection .bss Nicht initialisierte Variablensection .text Programmcode
Für Linker (Aufruf gcc -o test test.o)gcc bindet Startcode ein, der dafür sorgt, dass später
c-library-funktionen aufgerufen werden können.
Einstiegsroutine des Nutzerprogramms ist main
Diese muss über den Kontext der Datei hinaus bekannt sein --> global
geruest.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 16
Variablenvereinbarung
Syntax zum Reservieren von Platz in einem Segment[VarName:] Def.Anweisung Initialisierung
VarName wird als Speicheradresse verwendetDefinitionsanweisungen
DB Define Byte (1 Byte)
Ganzzahl, BuchstabenDW Define Word (2 Byte)
Ganzzahl, BuchstabenDD Define Doubleword (4 Byte)
Ganzzahl, Buchstaben, FließkommaDQ Define Quadword (8 Byte)
FließkommaDT Define Ten Bytes (10 Bytes)
Fließkomma
daten.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 17
Initialisierung von Variablen
Zeichenkette:DB "Hallo"
Kommasep. Liste:DB 1,2,'Hallo',?
Vorsicht mit Zeichenketten und Datentypen ≠ Byte: DB 'Hallo' := 5 Byte
DW 'Hallo' := Fehler (ZK passt nicht in 2 Byte)
Reservieren von Platz (ohne Initialisierung)RESB, RESW, RESQ
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 18
Konstanten
Konstanten ändern ihren Wert während der Laufzeit nicht:Lösung a) Variable (mit Speicherplatz)
vLaenge DB 10…MOV BL, [vLaenge]
Lösung b) TextersetzungAllgemein: Name EQU AusdruckkLaenge EQU 10…MOV BL, kLaenge
konst.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 19
EQU ersetzt Text…
Name EQU AusdruckAusdruck ist der Text von EQU bis Zeilenende bzw.
KommentarzeichenZahlenwerte, Befehle, Zeichenketten, …
Ersetzung wird erst nach Definition wirksam, eine Redefinition ist danach nicht mehr möglich.
Ausdrücke die in Ausdrücken vorkommen werden ebenfalls ersetzt.Keine Ersetzung in Kommentaren und Zeichenketten
Wiederverwendung?Auslagern der Definitionen in eigene Datei
(üblicherweise mit Endung .inc)Einbinden: INCLUDE Dateiname
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 20
Numerische Ausdrücke
Der NASM-Assembler kann an verschiedenen Stellen numerische Ausdrücke berechnen
Adressen, Länge von Strukturen, etc.Achtung: Diese Berechungen erfolgen während des
Assemblierens – im Maschinencode stehen die zur Laufzeit konstanten Berechnungsergebnisse
Unterstützte Rechenoperationen
Arithmetik: + - * / MOD ()Logik: AND OR NOT XOR SHL SHRVerhältnis: EQ GE GT LE LT NE
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 21
Adressarithmetik
$-Operator: Bezeichnet den Offset der aktuellen Programmstelle zum Segmentanfang
BeispielZeile 1 section .dataZeile 2 a: DW 4711Zeile 3 msg: DB 'hallo'Zeile 4 msglen EQU ( $ - msg )
a beginnt bei Adresse 0, msg bei Adresse 2a belegt 2 Byte, msg 5 Byte In Zeile 4 ist →
$=7 → msglen = 7 -2 = 5
rechnen.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 22
(2,3)
(2,3)
Beispiel für Berechnungenzur Assemblierzeit
Zugriff auf TabellenTabelle 2-Dimensional: (Zeile, Spalte)Speicher 1-Dimensional: Adresse
Umrechnung:Adresse = Basisoffset +
(Zeile*Spalten + Spalte) * Zellgröße
(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (0,0)
(0,1)
(0,2)
(0,3)
(1,0)
(1,1)
(1,2)
(1,3)
(2,0)
(2,1)
(2,2)
Basisoffset
Zeile*Spalten
Spalte
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 24
Transportbefehle
MOV Ziel, Quelle Belege Ziel mit Quelle
XCHG Operand1, Operand2 Tausche Inhalte der beiden Operanden aus
Stapelspeicher (später…)PUSH Quelle
Lege Quelle auf StapelspeicherPOP Ziel
Entferne oberstes Element vom Stapelspeicher und kopiere Inhalt nach Ziel
Peripherie (noch später…)INP Ziel, Portadresse
Belege Ziel mit dem von Portadresse gelesenen WertOUTP Portadresse, Quelle
Schreibe nach Portadresse die Quelle
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 25
MOV Ziel, Quelle
Von engl. to MOVe, kopiert ein Byte oder ein Wort vom Quell- zum Zieloperanden
Quelloperand und Statusregister werden nicht verändertQuell- und Zieloperand müssen gleiche Größe habenFlagregister, CS und IP können nur gelesen werden
mov ss, DSEGDirektSReg
mov es, dsSRegSReg
mov [v1],[v2]MemMem
mov [var1], 0DirektMem
mov [vSS], ssSregMem
mov [var1], axUregMem
mov ss, [vSS] MemSReg
mov ds, axURegSReg
mov ah,255DirektUReg
mov ax, [var1]MemUReg
mov ax, dsSRegUReg
mov ax,bxURegUReg
BeispielQuelleZielMOV
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 26
XCHG Op1, Op2
Von engl. to eXCHanGe, tauscht die Inhalte der beiden Operanden
Anwendung z.B. bei SortieralgorithmenBeide Operanden müssen gleiche Größe habenSegmentregister können nicht verwendet werden
xchg [v1], axUregMem
xchg ax, [v1]MemUReg
xchg ax,bxURegUReg
BeispielQuelleZielXCHG
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 27
Arithmetikbefehle
ADD Ziel, QuelleAddiert Inhalt von Quelle auf Inhalt von Ziel und legt Ergebnis in
Ziel ab SUB Ziel, Quelle
Subtrahiert Inhalt von Quelle von Inhalt von Ziel und legt Ergebnis in Ziel ab
MUL QuelleMultipliziert Inhalt des Akkumulators mit Inhalt von Quelle und legt
Ergebnis im Akkumulator abDIV Quelle
Dividiert Inhalt des Akkumulators mit Inhalt von Quelle und legt Ergebnis im Akkumulator ab
INC ZielErhöht Inhalt von Ziel um eins
DEC ZielVerkleinert Inhalt von Ziel um eins
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 28
ADD Ziel, Quelle
Von engl. to ADD, addiert den Inhalt des Quelloperanden auf den Inhalt des Zieloperanden
Quell- und Zieloperand müssen gleiche Größe habenQuelloperand wird nicht verändert
Statusflags:OF,SF,ZF,AF,PF,CFCF : Werteüberlauf
add [v1], 0DirektMem
add [v1], axUregMem
add ah,255DirektUReg
add ax, [v1]MemUReg
add ax,bxURegUReg
BeispielQuelleZielADD
arithm.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 29
Exkurs Flags des 8086
OF: Overflow (Überlauf)1=Überlauf hat Vorzeichenbit zerstört (Wertebereich signed überschritten)
DF: Direction (Richtung) 1=SI/DI werden erhöht
IF: Interrupt Enable (Unterbrechung) 1=Alle Unterbrechungen zulassen
SF: Sign (Vorzeichen)1=Ergebnis ist negativ
ZF: Zero (Null)1=Ergebnis ist Null
AF: Auxiliary Carry (Hilfsübertrag)1=Übertrag aus Bit 4 nach Bit 5
PF: Parity (Parität)1=Gerade Anzahl gesetzter Bits im Low-Byte
CF: Carry (Übertrag) 1= Wertebereich überschritten
NCCYCF
POPEPF
NAACAF
NZZRZF
PLNGSF
DIEIIF
UPDNDF
NVOVOF
=0=1Flag
Flags in CodeView
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 30
SUB Ziel, Quelle
Von engl. to SUBtract, subtrahiert den Inhalt des Quelloperanden vom Inhalt des Zieloperanden
Quell- und Zieloperand müssen gleiche Größe habenQuelloperand wird nicht verändert
Statusflags:OF,SF,ZF,AF,PF,CF
sub [var1], 0DirektMem
sub [var1], axUregMem
sub ah,255DirektUReg
sub ax, [var1]MemUReg
sub ax,bxURegUReg
BeispielQuelleZielSUB
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 31
MUL Quelle
Von engl. to MULtiply, multipliziert den vorzeichenlosen Inhalt des Quelloperanden mit dem vorzeichenlosen Inhalt des AkkumulatorsByte-Multiplikation
AX = AL * QuelleWort-Multiplikation
DX:AX = AX * Quelle Quelloperand wird nicht verändertStatusflags:
OF,CF
mul [var1]Mem
mul axUReg
BeispielQuelleMUL
arithm2.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 32
DIV Quelle
Von engl. to DIVide, dividiert den vorzeichenlosen Inhalt des Akkumulators mit dem vorzeichenlosen Inhalt des QuelloperandenByte-Division
AL = AX / QuelleAH = Rest
Wort-MultiplikationAX = DX:AX / QuelleDX = Rest
Quelloperand wird nicht verändert
div [var1]Mem
div bxUReg
BeispielQuelleDIV
arithm2.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 33
INC/DEC Ziel
Von engl. to INCrement/ DECrement erhöht bzw. verkleinert den Inhalt des Zieloperanden um einsHäufig Operation bei Tabellenverarbeitung oder SchleifenbearbeitungStatusflags:
OF,SF,ZF,AF,PF
div [var1]Mem
inc bxUReg
BeispielQuelleINC
arithm2.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 34
Weitere Arithmetikbefehle
ADC Ziel, QuelleAdd with Cary: Addiert unter Berücksichtigung des caryflags einer
vorangehenden OperationSBB Ziel, Quelle
Subtract with Borrow: Subtrahiert unter Berücksichtigung des caryflags einer vorangehenden Operation
IMUL Quelle, IDIV QuelleMultiplikation/Division für vorzeichenbehaftete Zahlen
NEG ZielVorzeichenumkehr
CBWConvert Byte (in AL) to Word (in AX)
CWDConvert Word (in AX) to Doubleword (in DX:AX)
BCD-ZahlenDAA, AAA, DAS, AAS, AAM, AAD
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 35
Bitmanipulation
NOT OperatorInvertiert den Operator
AND/OR/XOR Ziel, QuelleVerknüpft Ziel und Quelle
TEST Op1, Op2Führt internes AND zum Setzen von Statusflags ohne
Operatoren zu verändern durch
SHL/SHR/ROL/ROR/RCL/RCR/SAL/SAR Ziel,AnzVerschiebt oder rotiert den Inhalt von Ziel bitweise
mit unterschiedlicher Berücksichtigung von Statusflags
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 36
NOT ZielAND/OR/XOR Ziel, Quelle
Verknüpft den Inhalt des Quelloperanden mit Inhalt des Zieloperanden
Setzen von einzelnen BitsQuell- und Zieloperand müssen gleiche Größe habenQuelloperand wird nicht verändert
Statusflags:OF=0,SF,ZF,PF,CF=0
Angabe von Binärzahlen:01010010b
and [var1], 0DirektMem
and [var1], axUregMem
and ah,255DirektUReg
and ax, [var1]MemUReg
and ax,bxURegUReg
BeispielQuelleZielAND
1
1
1
0
OR A,B
0111
1001
1010
0000
XOR A,B
AND A, B
BA
bitm.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 37
TEST Ziel, Quelle
AND-verknüpft den Inhalt des Quelloperanden mit Inhalt des Zieloperanden in einem internen Register
Abfrage von einzelnen BitsQuell- und Zieloperand müssen gleiche Größe habenOperanden werden nicht verändert
Statusflags:OF=0,SF,ZF,PF,CF=0
test [var1], 0DirektMem
test [var1], axUregMem
test ah,255DirektUReg
test ax, [var1]MemUReg
test ax,bxURegUReg
BeispielQuelleZielTEST
bitm.asm
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 38
SHL Ziel, Quelle
Verschiebt den Inhalt des Zieloperanden bitweise um soviele Stellen, wie im Quelloperanden angegeben
Genau eine Stelle: Direkt 1Mehrere Stellen: Angabe in cl-Register
Statusflags:OF,SF,ZF,AF=?,PF,CF
shl var1, 11Mem
shl var1, clclMem
shl ax, 11UReg
shl ax, clclUReg
BeispielQuelleZielSHL
shift.asm
1 0 1 1 10 0 0
Bit0Bit7
0 1 1 10 0 01
CF
0
0 1 1 10 0 0 0 0CF geht verloren
0
0
TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 39
Shift/Rotate Varianten
SHL: Shift LeftSHR: Shift Right
ROL: Rotate LeftROR: Rotate Right
RCL: through Carry L.RCR: through Carry R.
SAL: arithmetic L.SAR: arithmetic R.
0 1 1 10 0 0 0 0
0 1 0 10 1 00 0 0
0
0 1 1 10 0 0 1 0
1 0 10 1 00 1 0
0 1 1 10 0 0 1 1
1 0 10 1 01 1 0
CF
1 0 10 1 01 1
1 0 1 1 10 0 0
Bit0Bit7
1
CF
0 1 1 10 0 0 0 0 0
top related