Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009...
Transcript of Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009...
Einführung in Assembler Teil 2: Programmieren
• Assemblerprogrammierung: Schritt für Schritt• Instruktionen, Flusskontrolle, Datenstrukturen• Anbindung von Peripherie• Kommunikation mit Systembibliotheken
2.1 - Die Werkzeugkette
•Editor•Assembler•Linker•Debugger
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3
Ablauf der ProgrammerstellungLinux
Programmtext erstellen
Assemblieren (übersetzen)
Linken (binden)
Ausführen
Programm-text
Assembler
OBJ-Datei
Linker
ausführbareDatei
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 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)
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 8
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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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
2.2 - Das Grundgerüst
• Grundgerüst eines Assemblerprogramms• Sektionen• Vereinbarung von Variablen
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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
2.3 - Instruktionendes 8086-Prozessors
•Transportbefehle•Arithmetik und Logik•Programmfluss
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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, 18.10.09 MRT1 (c) Urbas 2007-2009 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
Teil 4: Sprünge, Schleifen, Unterprogramm
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 41
Übersicht
Sprünge im ProgrammflussUnbedingte (JMP) und bedingte Sprünge (Jxxx)Spezialbefehle LOOP, LOOPE, LOOPNE
AnwendungsbereicheKopf- & Fußgesteuerte SchleifenAuswahllisten
StapelspeicherFunktionsweise eines StapelspeichersPUSH, POP
Modularisierung, Wiederverwendung: Aufruf eines UnterprogrammsCALL adresse, RET
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 42
JMP Versatz
engl. to JuMP, addiere Versatz auf den ProgrammzeigerVersatz = 8 oder 16-bit Ganzzahl mit Vorzeichen,Bereich von -32.768 bis 32767 jede Adresse in einem Segment wird erreichtVersatz relativ zur aktuellen Adresse Code kann im Speicher verschoben werden
Achtung: Ist das Argument von JMP eine Adresse im Speicher (Mem) oder ein Register (UReg), wird der Operand als Adresse (nicht als Versatz) interpretiert!
jump.asm
jmp bxUReg
jmp [var]jmp [bx]
Mem
jmp $+3Direct
BeispielVersatzJMP
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 43
Jxx Versatz
addiere Versatz auf den Programmzeiger wenn bestimmte Bedingungen erfüllt sind.Versatz = 8-bit Ganzzahl mit Vorzeichen, Wertebereich -128 ... 127Bedingungen: Abfrage der Statusflags des Prozessors, die durch vorherige Operationen gesetzt wurden: OF,SF,ZF,AF,PF,CF
jne EndeDirect
BeispielVersatzJxx
Achtung: xx stellt einen Platzhalter für die Ausprägungen dieses Befehls dar:
je = Jump Equaljne = Jump Not Equal jg = Jump Greaterjl = Jump Less
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 44
CMP Ziel, Quelle
engl. to CoMPare, vergleiche Ziel und Quelle durch Subtraktion (Ziel-Quelle) in einem temporären Register und setze die StatusflagsVersatz relativ zur aktuellen Adresse Code kann im Speicher verschoben werdenStatusflags:
OF,SF,ZF,AF,PF,CF
cmp ax, 10 DirektReg
cmp var1, axUregMem
cmp ax, var1MemUReg
cmp ax,bxURegUReg
BeispielQuelle
ZielCMP
jumpxx.asm
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 45
Bedingte Sprunganweisungen bei vorzeichenlosen Ganzzahlen
PF=1Parity=Parity-EvenJP=JPE
CF=0Not-CarryJNC
PF=0Not-Parity = Parity-OddJNP=JPO
ZF=0Not-Equal = Not-ZeroJNE=JNZ
ZF=1Equal = ZeroJE = JZ
CF=1Carry Flag (CF) gesetztJC
CF=1 || ZF=1Below-or-Equal = Not-AboveJBE=JNA
CF=1Below = Not-Above-or-EqualJB = JNAE
CF=0Above-Equal=Not-BelowJAE = JNB
CF=0 || ZF=0Above = Not-Below-or-EqualJA = JNBE
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 46
Weitere bedingte Sprunganweisungen bei vorzeichenbehafteten Ganzzahlen
SF=1SignJS
OF=1OverflowJO
SF=0Not-SignJNS
OF=0Not-OverflowJNO
ZF=1 || SF≠OFLess-or-Equal = Not-GreaterJLE=JNG
SF≠OFLess = Not-Greater-or-EqualJL = JNGE
SF=OFGreater-Equal = Not-LessJGE = JNL
CF=0 || SF=0Greater = Not-Less-Or-EqualJG = JNLE
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 47
Schleifen
Kopfgesteuerte SchleifenVorgeprüfte, Abweisende SchleifeBedingung wird vor Ausführung geprüft
Fußgesteuerte SchleifenNachgeprüfte, annehmende SchleifeSchleifenkörper wird mindestens 1 mal ausgeführt.
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 48
Schleifenrümpfe
Abweisende Schleife in C
while (i>0) {// tu wasi--;
}
AssemblerBeg1: dec cx ; cx=cx-1
jz End1 ; cx==0?; tu was
jmp Beg1End1: ; hier geht‘s weiter
Annehmende Schleife in C
do {// tu wasi--;
} while (i>0);AssemblerBeg1: ; tu was
dec cx ; cx=cx-1jnz Beg1 ; cx==0?
End1: ; hier geht‘s weiter
Achtung! Beide Beispiele funktionieren nur für cx>0 wie beabsichtigt. Ist cx bei Schleifeneintritt bereits 0, ergibt der erste dec dx-Befehl 65.535!
schleife.asm
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 49
Spezielle Schleifenbefehle
Schleifenzähler in CX, Ausführung um Vielfaches schneller als äquivalente Befehlssequenz
cmp cx, 0 je Ziel
Springe zu Ziel wenn CX==0 (für abweisende Schleife)
JCXZ Ziel
jnz weiter dec cx jnz Zielweiter:
Dekrementiere cx und springe zu Ziel solange cx ungleich 0 und ZF==0
LOOPNE Ziel
jz weiter dec cx jnz Zielweiter:
Dekrementiere cx und springe zu Ziel solange cx ungleich 0 und ZF==1
LOOPE Ziel
dec cx jnz Ziel
Dekrementiere cx und springe zu Ziel, solange cx ungleich 0
LOOP Ziel
loop.asm
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 50
Zeichenkettenbefehle
Spezielle Befehle zur Verarbeitung von ZeichenkettenDaten in RegisternQuelle: DS:SI ( Data Segment:Source Index )Ziel: ES:DI ( Extra Segment:Dest. Index )Zähler: CX (Count Register)Indizes SI und DI werden „automatisch“ manipuliertRichtung wird durch Direction Flag festgelegt
Direction Flag DFCLD DF=0 aufsteigend, von links nach rechts, STD DF=1 absteigend, von rechts nach links
ZeichenkettenbefehleLODS – Laden STOS – SchreibenMOVS – KopierenSCAS – DurchsuchenCMPS - Vergleichen
string.asm
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 51
LODS, STOS, MOVS, SCAS, CMPS
LODS: engl. LOaD String: Lade AL (AX) mit einem Byte (Word) aus der Zeichenkette an der Adresse DS:SISI wird dabei automatisch um Größe des Zeichen (Byte=1, Word=2) erhöht (DF=0) bzw. verringert (DF=1)Größe des Zeichens:
Assembler aus Angabe ZeichenketteProgrammierer (LODSB, LODSW)
STOS (engl. STOre String)ES:DI AL, DI
DI+1 MOVS (engl. MOVe String)
ES:DI AL DS:SI, DI DI+1, SI SI+1SCAS (engl. SCAn String)
Flags ES:DI - AXCMPS (engl. CoMPare String)
Flags ES:DI – DS:SI
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 52
Wiederholtes Ausführen von Zeichenkettenbefehlen
Analog zu LOOPxx. Achtung: Wenn cx schon auf 0 steht wird das Kommando
nicht ausgeführt.
repne scasbführe Kommando aus und ändere cx und solange cx ungleich 0 und ZF==0
REPNE cmd
repe cmpsführe kommando aus und verändere cx solange cx ungleich 0 und ZF==1
REPE cmd
rep movsbführe Kommando aus und verändere cx, solange cx ungleich 0
REP cmd
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 53
Übersicht Modularisierung von Programmen
Der StackFunktion, Zugriffsmethoden
Strukturierung von AssemblerprogrammenModularisierung von Programmen
Definition von UnterprogrammenAufruf von UnterprogrammenVarianten der Parameterübergabe
Behandlung von Interrupts
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 54
Der Stack
Stack = spezieller SpeicherbereichBesondere Register und Befehle
SS – StacksegmentSP - StackpointerPUSH, POPCALL, RETIRET
Stack wächst und schrumpft (nicht aber der für den Stack reservierte Bereich)
frei
belegt
SS:SP
Niedrige AdresseSS:0000
Hohe Adresse
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 55
PUSH Quelle
engl. to PUSH, verkleinere den Stapelzeiger um 2 und lege anschließend Quelle auf dem Stapel (SS:SP) ab.
push var1Mem
push axUReg
BeispielQuellePush
push.asm
frei
belegt
SS:SP
frei
belegt
frei
belegt
SS:00
0FAF
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 56
POP Ziel
engl. to PUSH, schreibe den Wert bei (SS:SP) nach Ziel und erhöhe anschließend den Stapelzeiger um zwei
pop var1Mem
pop axUReg
BeispielZielPush
push.asm
frei
0FAF
belegt
SS:SP
frei
belegt
SS:00
0FAF
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 57
Modularisieren
Kodierung von wiederholt benötigten Instruktionssequenzen an einer Stelle
Aufteilen der Programmlogik in (mehrfach verwendbare) Module
Wiederverwendung bestimmter Sequenzen innerhalb eines Programms
Nutzung von Unterprogrammsammlungen (Libraries)Kapselung von TeilaufgabenBessere LesbarkeitBessere Wartung
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 58
Definition von Unterprogrammen
Struktur:
<name> PROCBefehle des
Unterprogrammsret
<name> ENDP
Beispiel; Unterprogramm mean; fkt: ax = (ax+bx)/2; in: ax, bx - out: ax mean PROC
add ax, bx ; ax=ax+bx
shr ax, 1 ; ax=ax/2
retmean ENDP
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 59
call Unterprogramm Merken des aktuellen Instruktionszeigers (IP) auf dem StackÄndern des Instruktionszeigers auf das Unterprogramm
retHolen des Instruktionszeigers vom StackÄndern des Instruktionszeigers auf das Unterprogramm
Sequenz der Instruktionen: A B E F G D C
HP:100 A102 B104 call UP1109 C
Aufruf von Unterprogrammen
UP1:111 call UP2116 D118 ret
UP2:120 E122 F124 G126 ret
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 60
Zustand des Stacks
HP:100 A102 B104 call UP1109 C
UP1:111 call UP2116 D118 ret
UP2:120 E122 F124 G126 ret
1 2
34
1
0
109116109IP
IP
2
116109
IP
3
116109IP
40
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 61
Übergabe von Parametern
Über RegisterSehr effizientAnzahl Register beschränkt
Über den StackFlexibel, in den meisten Hochsprachen so realisiert
Über global bekannte VariablenUngünstig wegen zirkulärer Abhängigkeit
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 62
Umgang mit Seiteneffekten
Unterprogramme verändern Register
Lösung 1: Dokumentieren
Lösung 2: Maskieren-
Anbinden von Prozessperipherie
•Interrupts•Schnittstellen•Programmierung
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 64
Interrupts
Unmittelbare Reaktion auf (externe) EreignisseAblauf eines ZählersMesswertwandlung ist fertig, kann ausgelesen
werden…
Anbindung der Signale in 8086 über Interruptcontroller IC 8259
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 65
Interruptcontroller 8259
Unter-brechungs-
Anforderungs-Register
IRR
INT0INT1INT2
…
INT8
Unter-brechungs-
Masken-Register
IMR
Prioritäts-logik
Unter-brechungs-
Service-Register
ISR
Datenbus-puffer
Lese-und
Schreib-Logik
INT INTA
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 66
Zusammenspiel IC8259/80x86
Unter-brechungs-
Anforderungs-Register
IRR
INT0INT1INT2
…
INT8
Unter-brechungs-
Masken-Register
IMR
Prioritäts-logik Unter-
brechungs-Service-Register
ISR
Datenbus-puffer
Lese-und
Schreib-Logik
INT INTA
80x86
1
2
3
4
55 INT Empfangen
INTA AntwortenBeginn Bearbeitung
6
67
7 call auslösen2.tes INTA Signal8
8
10
10 IRV lesenServiceroutine anspringen
9
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 67
Speicherbelegung im PC/ATunter DOS
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 68
Übersicht
Grundprinzipien der PeripherieeinbindungTopologien 1:1, m:nMemory Mapped IOI/O Mapped I/O
Ein-/Ausgabe von SignalenBinäre SignaleAnaloge SignalePulweitenmodulierte Signale
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 69
Topologie von Schnittstellen
Punkt zu Punkt Verbindung (1:1)Anschluss eines einzelnen Geräts an eine
Schnittstelle
Bus (1:m, n:m)Anschluss mehrerer unabhängiger Teilnehmer
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 70
Punkt zu Punkt Schnittstellen im Wintel-PC
TastaturschnittstellePS/2-MausschnittstelleIEEE 1284/Centronix Parallele Schnittstelle
Drucker, Scanner, ZIP-DriveRS 232/V.24 – Serielle Schnittstellen
Modem, Drucker, Maus, … Floppy-Schnittstelle
Diskettenlaufwerk, BandlaufwerkEIDE- Schnittstelle (Enhanced Integrated Device Electronic) mit
ATA- bzw. ATAPI- KommandosatzFestplatten, CD-ROM, DVD, ZIP, ...
Gameport/Joystick und MIDI SchnittstelleSpielehardware, Musikgeräte und -elektronik
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 71
m Datenleitungen
Busverbindungen
Bitserielle BusseRS 422/423RS 485 Feldbusse
(Interbus, Bitbus, …)Ethernet/Tokenring FireWire/ iLinkUSB (Universal Serial Bus)
Bitparallele BusseSCSI (Small Computer
System Interface)IEE488/IEC/GPIB-BUSVMEbus, Multibus, …
S1M
n Adressleitungen
S2
k Steuerleitungen
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 72
Organisation des Zugriffs auf Schnittstellen-Controller
I/O-Mapped: Auswahl des Peripherie-addressraums durch I/O-Leitung des Steuerbusses spezifische Befehle
Memory-Mapped: Auswahl der Peripherie durch Adresse I/O-Page
CPUMemory
Datenbus
Adressbus
I/O
Steuerbus
CPU Schnittstellen-Controller Peripherie
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 73
Memory Mapped I/O
Ein/Ausgabe-Werk ist in den Adressraum integriertZugriff auf Register der E/A-Geräte über definierte
Speicherstellen in der sog. I/O-PageFür den Programmierer kein Unterschied zwischen
Zugriff auf Speicher und Ein/Ausgabe-WerkMOV AX, [HARDWARE_ADRESSE]
Beispiel Microcontroller 8051 (100 Mio/Jahr)registers and input/output ports are memory mapped and
accessible like any other memory location
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 74
I/O-Mapped I/O
Getrennte Adressräume für Speicher und E/A-Geräte
Eigene Befehle für Zugriff auf E/A GeräteINP AX, 0x60OUTP 0x61, 0xFF
Auswahl des I/O-Adressraums über den Steuerbus
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 75
Ein-/Ausgabe von Signalen
Binäre Signale (RW)Binäre Information in Pegel (0/5V)
Analoge Signale (RW)Kontinuierliche Information in SpannungDiskretisierung in Analog Digitalwandler
Pulsweitenmodulierte Signale (W)Information durch Timing
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 76
Bausteine bzw. Schnittstellen
Binäre SignaleIntel 8255 PIO – Parallel I/O Standardbaustein für die Anbindung von Peripherie an I/O-
BusseTimer
Intel 8253 PIT – Programmable Interval Timer Analoge Signale
ADC/DAC, z.B. Analog Devices, National Semiconductor, Sony, Intel, AMD, Harris, …
Häufig Integration aller Bausteine in Mikrokontroller / Schnittstellenkarte
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 77
Prozesskopplung
Binärsignale
Analogsignale
SignalanpassungPIO+Logik
SignalanpassungPIO+Logik
BI
BO
Rechnerseite Prozessseite
SignalanpassungSampleHoldund ADU
SignalanpassungDAU
AI
AO
PIO+Logik
PIO+Logik
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 78
PIO INTEL 8255A - Controller
Parallel Input Output Aus-/Eingabe von Daten über eine parallele Schnittstelle.
Die einzelnen Bits eines Datenwortes (z.B. Byte = 8Bit) werden gleichzeitig (bitparallel) auf einzelnen Schnittstellenleitungen gesendet oder empfangen.
CS
WR
RD
A0-A1
RESET
D0-D7
28
8
88
Port A
Port B
Port C
8255A Parallel
I/ O chip
Register A
Register B
Register C
Control Register
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 79
PIO 8255 A
Package und interner funktionaler Aufbau
intel8255.pdf
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 80
8255/8254-Karte
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 81
Ein/Ausgabe Modi des Bausteins
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 82
8253/8254 PIT - Programmable Interval Timer
Port 40h 8253 Counter 0 Time of Day Clock (normally mode 3)
Port 41h8253 Counter 1 RAM Refresh Counter (normally mode 2)
Port 42h8253 Counter 2 Cassette and Speaker Functions
Port 43h8253 Mode Control Register
beep.asm
http://heim.ifi.uio.no/~stanisls/helppc/8253.html
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 83
8253/8254 PIT – Mode Control Register beep.asm
8255
PB0 PB1
Clk2 Gate2 Out
8253
&1,19 MHz
Verdrahtung von PIO und PITim IBM-PC
Modularisierung von Assembler-Programme
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 85
Übersicht
Spezieller FallHausübung beep
Generalisierung – neuer Mikrocontroller:Hardware
Pig PictureMemory Map, IO-Map, Interrupt MapProzessordetailsPeripherals (PIO, PIT, …)
SoftwareDevice Treiber PhilosophieModuleCALL vs. MAKRO
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 86
Anwendungsprogramm
beep
Modularisierung Hausübung
Geräteabstraktion
PIOGeräteabstraktion
PITSystemfunktionen
OS
IBM XT/AT kompatibler 80x86
Hilfsfunktionen
dd.asm
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 87
Generalisierung: Pig Picture
Studium HandbücherFür welchen Zweck wurde die
Hardware entworfen?Welche Komponenten gibt es? Welche Datenflüsse
zwischen den Komponenten?Datenflußdiagramm
ROM
RAM
80188EB ParallelPort
SCC
Serial Port 1
Serial Port 2
Data
Address
I/O
(aus Barr, 1999)
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 88
Memory Map
Wo sind Programme und Daten gespeichert?Wie ist der Speicherplatz aufgeteilt? Gibt es Speicher mit besonderer Bedeutung?
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 89
I/O-Map / Interrupt-Map
I/O-MapPeripherie angebunden über eigenen I/O-BusRegister einzelner Geräte liegen üblicherweise nahe beisammen
Interrupt-MapInterruptnummern sind häufig fest verdrahtetDokumentation in den Projektunterlagen!
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 90
Prozessordetails
Register?
Befehlssatz?
Besonderheiten?
Interruptbehandlung?
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 91
Peripherie
FunktionsweiseGenereller AufbauRegisterstrukturZeitliches Verhalten
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 92
Geräte Treiber Philosophie
Verstecken der Hardware„Der Devicetreiber ist die einzige Software im
Gesamtsystem, das direkt auf die Register der Peripherie zugreift“
VorteileDie übergeordnete Software ist leichter zu verstehenWegen zentralem Zugriff kann Status der Hardware
leichter nachverfolgt werdenÄnderungen aufgrund von Hardwareänderungen sind
idealerweise nur lokal notwendigSimulierte Geräte zum Testen „ohne“ Hardware.
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 93
Bestandteile eines Geräte Treibers
DatenstrukturenSteuer- und Kontrollregister
ZustandsvariablenInitialisierungsroutinenSchnittstelle zum ProgrammInterrupt Service Routinen
Erstellen eines DOS-Assembler-Programms
• Grundgerüst eines Assemblerprogramms• Vereinbarung von Variablen• Instruktionen• Unterschiede NASM/MASM
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 95
Ablauf der ProgrammerstellungDOS (Praktikum ART1-2)
Programm erstellenProzess: Editieren, z.B. mit edit, textpad, …Ergebnis: Datei hallo.asm
Assemblieren (übersetzen)Prozess: masm /Zd hallo.asmErgebnis: Objektdatei hallo.obj
Linken (binden)Prozess: link /codeview hallo.objErgebnis: Ausführbare Datei hallo.exe
Programm-text
Assembler
OBJ-Datei
Linker
ausführbareDatei
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 96
Assemblerprogrammierung für den 16-Bit Real Mode (MSDOS)
• Editor– Jeder beliebige Texteditor– DOS: asmedit– Windows: Textpad, Linux: gedit
• Programmiermodell 16-Bit Real-Mode + DOS – Segmente müssen berücksichtigt werden– Andere Systemaufrufe als unter Linux
• Syntax MASM– Syntax von MASM, z.B. für die Adressierung von
Speicherplätzen ist manchmal „unglücklich“
• Linker, debugger– Andere Aufrufkonventionen
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 97
Vergleich „hello world“ Linux / DOS
Linux + NASM:
section .data
msg: db 'Hello World!',0x0A
len equ $ - msg
section .text
global main
main:
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, len
int 0x80
mov eax, 1
int 0x80
DOS + MASM:
DATEN SEGMENT
msg db "Hello World", "$"
DATEN ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATEN
Anfang:
mov ax, DATEN
mov ds, ax
mov dx, offset msg
mov ah, 9
int 21h
mov ah, 4Ch
int 21h
CODE ENDS
END Anfang
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 98
Grundgerüst für ein 8086- Assemblerprogramm
Vereinbarung von SegmentenDatensegmente: VariablenCodesegmente: Befehle, KonstantenStapelsegment(e): Stapelspeicher für
UnterprogrammaufrufName SEGMENT [Attrib.] ['Klasse']Name ENDS
Zuordnung zu RegisternASSUME register:Name {,register:Name}
Ende des Programmtextes und StartadresseAn welcher Stelle soll die Ausführung des Programms
beginnen?END [Startadresse]
geruest.asm
FreierPlatz-halter
Schlüssel-wort [ Optionales
Element ]
{Wiederholtes opt.Element}
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 99
Beginn und Ende eines DOS-Programms
Vom Programmlader des Betriebssystems wird gesetzt:CS - CodesegmentregisterIP – BefehlszeigerSS - StapelsegmentregisterSP - Stapelzeiger
Zu Beginn muss das Datensegmentregister DS belegt werdenDie Hardware des 8086 kann ein Segmentregister nicht mit einem
Direktwert belegenUmweg über Allzweckregister
Zum Schluss wird die Kontrolle wieder an das Betriebssystem zurückgegeben:Aufruf der DOS-Funktion Nummer 4Ch
(Quit with exit code) über Softwareinterrupt 21h
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 100
Segmentdefinition
MASM.MODELL SMALL
.DATA
.STACK
.CODE
Start:
END Start
MASM/TASM
DATEN SEGMENT WORD PUBLIC 'DATA'DATEN ENDS
STAPEL SEGMENT PARA STACK 'STACK'STAPEL ENDS
CODES SEGMENT WORD PUBLIC 'CODE'
ASSUME CS:CODES, DS:DATEN, SS:STAPELStart:CODES ENDSEND Start
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 101
Ausgewählte Steueranweisungen
Speichermodelle und Segmente.MODEL Sp.Modell ;Speichermodell festlegen (z.B. SMALL)DOSSEG ;Standard DOS-Reihenfolge der Segmente.CODE ; Beginn Code Segment.DATA ; Beginn Daten Segment.STACK ; Beginn Stacksegment
Bei komplizierteren SegmentstrukturenSEGMENT … ENDS
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 102
Pseudobefehle
Vereinbarung von Konstanten und DatenDaten
[Name] Direktive (Init.|?)[,(Init|?)]*)[Name] Direktive Zahl DUP((Init.|?)[,(Init.|?)]*)Direktive = (DB|DW|DD|DQ|DT)
KonstantenMuss vor Verwendung bekannt seinErzeugen keinen Maschinencode 1) Name EQU AusdruckAusdruck kann alles sein, was in eine Zeile passt2) Name = numerischer Ausdruck
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 103
8086/DOS-Emulatoren für mac und linuxDOSBox 0.65
mrt1-msdos.zip auf Gastsystem auspacken, z.B. nach /media/USB/mrt1
DOSBox starten
dosbox /media/USB/mrt1
Konfiguration anlegen
config -writeconfig /media/USB/dosbox.cfg
Konfiguration dosbox.conf anpassen:[autoexec]
set PATH=z:\;c:\masm;keyb gr
DOSBox startendosbox -config /media/USB/dosbox.cfg /media/USB/mrt1
Bekannte Fehler, Eigenschaften• Mauszeiger im Textmodus in codeview nicht sichtbar• neue Dateien bekannt machen mit dem Befehl rescan
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 104
Die wichtigsten Schalter für Assembler und Linker
MASM/Zi Symbolische Information für Debugger
erzeugen/la .LST-Datei erzeugen/w2 Auch Warnungen ausgeben
LINK/MAP .MAP-Datei erzeugen/CODEVIEW Symbolische Information für
Debugger behalten
CV/43Mit 43 Zeilen starten/B Im Schwarzweißmodus starten
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 105
Tastenbelegung CODEVIEW
F1: Hilfefenster (Hilfedatei fehlt…)F2: Registerfenster Öffnen/SchließenF3: Umschalten Quelltext/MaschinencodeF4: Umschalten Debugger/BildschirmausgabeF5: Starten des Programms (bis Haltepunkt)F6: Fenster wechselnF7: Starten des Programms (bis Cursor)F8: Schrittbetrieb (folgt Funktionsaufrufen)F9: Haltepunkt setzenF10: Schrittbetrieb (über Funktionsaufrufe
hinweg)
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 106
Live Expression für Speicherabbild
CV merkt sich die Einstellung LiveExpression für das Memory-Fenster nichtMemory Window Dialog mit
OptionsMemory Window wählen,
dort Live Expression ankreuzen,Abschluss mit OK
oder:Memory Window erst nach Belegung des
Datensegmentregisters DS öffnen
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 107
CODEVIEW MenustrukturCodeView
Open Source
Open Module…
DOS Shell
Exit
File Edit
Undo
Copy
Paste
View Search Run Watch Options Calls
Source
Memory
Register
8087
Local
Watch
Command
Help
Output
Maxmize
Size
Close
TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 108
NEAR, FAR, EXTRN, PUBLIC
Interne UnterprogrammeIm selben Codesegment wie das Hauptprogramm, bei
Aufruf lediglich Speichern des IP notwendig
Externe UnterprogrammeBessere Wartung/Teamarbeit wenn ausgelagert in
eigene DateiIn einem andern Codesegment – Speichern von CS
und IP notwendigDefinition: Unterprogramm PROC FAR