Datenverarbeitungssysteme 3 Assembler (i8086)
Ziele
• Aufbau und Arbeitsweise von Prozessoren
• Befehlstypen
• Assemblerprogrammierung
• Segmentierung
• Adressierung
• Stack
• Interruptbearbeitung
Datenverarbeitungssysteme
3.1 Der 8086-Prozessor
3.1.1 Eckdaten
• 16-Bit-Register
• 20-Bit-Adressbus, Adressraum 1MB
• Byte-, Wortzugriff möglich (8/16-Bit)
• 14 Register zu je 16 Bit (mit Segmentregister und Flags)
• Spezialbefehle für Blockoperationen (”Stringbefehle“)
• Arithmetikbefehle für Zahlen mit und ohne Vorzeichen, auch Multiplikation und Division
• Herstellung in NMOS und CMOS (HMOS), Arbeitsfrequenzen 5,8 und 10 MHz
• Aufgebaut aus 28000 Transistoren
• Zwei Betriebsarten: Minimum- und Maximum-Modus
• Zusammensetzung von Adressen durch die Inhalte zweier Register, dadurch Segmentierung des Speichers
• Adress- und Datenleitungen sind gemultiplext
• Alle Steuerleitungen sind gemultiplext oder haben zumindest im Minimum- und Maxi- mumbetriebsart verschiedene Bedeutung
• Code von Intel-8085-Prozessoren kann mit Programmen in 8086-Code verwandelt werden.
• 6-Byte Prefetch-Queue zur Verbesserung der Rechenleistung
Datenverarbeitungssysteme
3.1.2 Blockschaltbild des 8086-Prozessors
Datenverarbeitungssysteme
3.1.3 Die Register des 8086-Prozessors Universalregister
AX AH AL Akkumulator (Hauptrechenregister)
BX BH BL Basisregister bei indirekter Adressierung
CX CH CL Zählregister
DX DH DL Datenregister
Zeiger- und Indexregister
DI Destination Index (Felder adressieren, Stringbefehle)
SI Source Index (Felder adressieren, Stringbefehle)
SP Stack Pointer (Stackverwaltung des Prozessors)
BP Base Pointer (für Adressierung im Stack)
Datenverarbeitungssysteme
Die Register des 8086-Prozessors
Segmentregister (zur Adressbildung)
CS Code Segment
DS Daten Segment
SS Stack Segment
ES Extra Segement
Register für Programmfluss und -status
IP Instruction Pointer
Flags Prozessorstatuswort
Datenverarbeitungssysteme
Datenverarbeitungssysteme
3.1.4 Adressbildung
Speicherzellen
Zellen-Nr. Adresse 8 0 Bit
0 00000h
1 00001h Byte 15 Segmentadresse 0
2 00002h 0 0 0 0 3 00003h
Datenverarbeitungssysteme
Adressbildung Beispiele:
Speicherzelle Segmentadresse Offsetadresse logische Adresse
0 0 0 0000h:0000h
20 0 20 0000h:0014h
20 1 4 0001h:0004h
65535 0 65535 0000h:FFFFh
65535 4095 15 0FFFh:000Fh
1048575 (FFFFFh) 65535 (FFFFh) 15 (000Fh) FFFFh:000Fh
Vorteile:
• Code und Daten leicht unterscheidbar (unterschiedliche Segmente)
• Segmente "leicht verschiebbar" (relocatable)
• Gute Speicherausnutzung Nachteil:
• keine eindeutige Adressbildung beim Debuggen
Datenverarbeitungssysteme
3.2 Darstellung und Konvertierung von Daten
Bit (binary digit)
ist die kleinste Darstellungseinheit für Daten im binären System bit (basic indissoluble information unit)
ist die kleinste Informationseinheit einer Nachricht Byte
ist die Zusammenfassung von 8 Bit Stellenwertsystem
ist ein System zur Darstellung von Zahlen durch Ziffern, bei denen der Wert einer Ziffer von der Stelle abhängt, an der sie geschrieben steht.
z.B. Stellenwertsystem zur Basis 10
1234 entspricht 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100 Dualsystem
ist ein Stellenwertsystem zur Basis 2
z.B. 100101b entspricht 1*25 + 0*24 + 0*23 + 1*22 + 0*21 + 1*20 Hexadezimalsystem (Sedezimalsystem)
ist ein Stellenwertsystem zur Basis 16 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F) z.B.: 3Ch bzw $3C entspricht 3 * 161 + 12 * 160
Datenverarbeitungssysteme
3.2.1 Darstellung von ganzen Zahlen 3.2.1.1 Vorzeichen und Betrag
Dabei wird ein Bit als Vorzeichen (most significant bit) interpretiert und die restlichen Bits stellen den Betrag als Dualzahl dar.
positive Zahl: msb = 0 negative Zahl: msb = 1
VZ Betrag
BitNr. n n-1 n-2 2 1 0
Beispiel: für 8 Bit bzw. ein Byte + 0 0000 0000b
+ 1 0000 0001b
. . + 127 0111 1111b + (2n – 1)
- 0 1000 0000b - 1 1000 0001b
. . - 127 1111 1111b - (2n – 1)
Der Betrag von positiven und negativen Zahlen ist gleich Zwei Darstellungen für die "0"
Datenverarbeitungssysteme
3.2.1.2 Zweierkomplementdarstellung
• Positive Zahlen werden als Dualzahlen dargestellt
• Negative Zahlen werden durch das Zweierkomplement (Ergänzung zu 2k mit k gleich Anzahl der Bits) dargestellt.
Beispiel: 4 Bits; Zweierkomplement ist Ergänzung zu 24;
d.h. für Zahl 7 ist 9 das Zweierkomplement ( 7 + 9 = 16) damit ist - 7: 1001b und + 7: 0111b
Beispiel: 8 Bit bzw. 1 Byte
+ 0 0000 0000b 0 + 1 0000 0001b
. . + 127 0111 1111b + (2n – 1)
- 128 1000 0000b - 2n - 127 1000 0001b - (2n –1)
. . - 1 1111 1111b - 1
• Nur eine Darstellung der 0
• einfache Unterscheidung von
positiven und negativen Zahlen (msb)
• Subtraktion auf Addition des Zweier- komplementes zurückzuführen
Einfache Bildung der 2er-Komplementes:
• Kopieren der Stellen von rechts bis ein- schließlich der ersten 1 und dann alle Bits invertieren.
• Alle Bits invertieren und dann 1 dazuzählen
Datenverarbeitungssysteme
3.2.2 Darstellung von Zeichen
Es gibt viele Möglichkeiten, zu bestimmten Folgen von Bits Zeichen zuzuordnen.
z.B.: BCD-Code zur Darstellung von Ziffern (4 Bit)
BCD-I-Code zur Darstellung von Zeichen (6 Bit – keine Groß-/Kleinschreibung) 3.2.2.1 Der EBCD-I-Code
8 Bit Code
oft in Großrechnern z.B. von IBM
Datenverarbeitungssysteme
3.2.2.2 Der ASCII-Code American Standard Code for Information Interchange
• 7 – Bit -Code
• Steuerzeichen in den ersten beiden Spalten
• Zwei Spalten mit Sonder- zeichen und Ziffern in natürlicher Reihenfolge
• Je zwei Spalten für Groß- und Kleinbuchstaben in alphabetischer Reihenfolge (Abstand: 100000b)
Datenverarbeitungssysteme
Der erweiterte ASCII-Code
8 – Bit Code zur
Darstellung von sprach- spezifischen Zeichen wie z.B. Ä, ß...
Verwendet unter DOS
heute wird oft auch
ein 16-Bit-Code verwendet:
Unicode
Datenverarbeitungssysteme
3.3 Das Format einer Assemblerzeile
[Label:] [Befehl [Operanden]] [;Kommentar]
[Name] Anweisung/Pseudobefehl [Operanden] [;Kommentar]
Beispiele:
marke1: add ah, par1 ;der Inhalt von par1 wird zum Inhalt von AH
;addiert und das Ergebnis wird in AH geschrieben
; AH := AH + par1
par1 DB 23h ;es wird ein Byte im Speicher reserviert -
; in dieses Byte steht nach dem Laden 23h Ziel
Register oder Speicherzelle (1. Operand)
Quelle
Register oder Speicherzelle oder Konstante
(2. Operand)
Datenverarbeitungssysteme
3.4 Die Struktur eines Assemblerprogrammes
Ein Assemblerprogramm enthält SEGMENT Anweisungen , Anweisungen und Befehle und die END Anweisung
3.4.1 Die Standard Segment Anweisung Segmentdefinition:
Name SEGMENT [Ausrichtung] [Kombination] ['Klasse']
. . . .
Name ENDS
Segmentzuordnung:
ASSUME SegReg : SegName
Ausrichtung:
legt die Anfangsadresse des Segmentes fest (byte, word, dword, para, page)
Kombination:
legt fest, wie Segmente mit gleichem Namen zusammengefasst werden können
(public, stack, common, at .... , private)
'Klasse':
kann die Anordnung der Segmente in ausführbaren Programm beeinflussen (Segmente mit gleichen Klassennamen werden in zusammenhängenden
Speicherbereich abgelegt)
Datenverarbeitungssysteme
Beispiel mit der Standard Segment Definition
Daten SEGMENT WORD PUPLIC ; Anfang eines Segmentes an "Wortadresse"
var1 DB (?) ;reserviert ein Byte
var2 DW 1234h ;ein Wort wird reserviert und mit 1234h beschrieben tab DB 5 DUP (3) ;5 Bytes werden mit 3 beschrieben
var3 DD 12345678h ;ein Doppelwort wird mit 12345678h beschrieben Daten ENDS ;Ende der Segmentdefinition
Kellersp SEGMENT STACK 'STACK' ;Anfang einer Segmentdefinition
DW 100h DUP (0) ;256 Worte werden mit 0 beschrieben Kellersp ENDS ;Ende der Segmentdefinition
ASSUME DS:Daten; CS:ProCode, SS:Kellersp ;Zuordnung der Segmente
ProCode SEGMENT PARA ;Anfang eines Segmentes an "Paragraphenadresse"
anf: mov ax,Daten ;Adresse "Daten" wird in AX kopiert mov ds,ax ;Adresse "Daten" kommt in DS .
.
mov ah,4ch ;in AH wird der Funktionswert 4ch geschrieben int 21h ;Aufruf einer DOS Funktion (Nr. in AH)
ProCode ENDS ;Ende der Segmentdefinition
Datenverarbeitungssysteme
3.4.2 Die vereinfachten Segmentanweisungen
(.MODEL; .DATA; .CODE; .STACK)
Die Anweisungen .DATA; .CODE; und .STACK definieren jeweils den Anfang eines
Segmentes und bestimmen gleichzeitig den Typ – damit ist die Zuordnung "ASSUME" nicht erforderlich. Das Ende eines Segmentes ist durch den Anfang des nächsten Segmentes bestimmt.
Die Datensegmentadresse ist durch die globale Größe "@DATA" zugänglich. Für den Zugriff auf Daten ist die Initialisierung von DS erforderlich:
mov AX,@DATA mov DS,AX
Die Anweisung ".MODEL" legt das Speichermodell fest – mögliche Parameter:
TINY Code und Daten in einem 64-KB-Segment SMALL Code < 64 KB und Daten < 64 KB
MEDIUM Code > 64 KB und Daten < 64 KB COMPACT Code < 64 KB und Daten > 64 KB
LARGE Code und Daten können die 64 KB Grenze überschreiten
Datenverarbeitungssysteme
3.5 Adressierungsarten
3.5.1 Die Registeradressierung
Bei der Registeradressierung befindet sich der Operand in einem Register. Durch die Angabe des Registernamens wird auf diesen Operanden zugegriffen
z.B.: mov AX,BX
3.5.2 Die unmittelbare Adressierung
Bei der unmittelbaren Adressierung wird der Operand einfach als Bestandteil des Befehls hingeschrieben
z.B.: mov AX,23
mov AX,3 * 4 + 24
Beim Assemblieren kann ein Ausdruck berechnet werden und dieser konstante Wert wird unmittelbar dem Befehlswort beigefügt – für den Zugriff auf den Operanden ist kein extra Speicherzugriff erforderlich.
Datenverarbeitungssysteme
3.5.3 Die direkte Adressierung
Bei der direkten Adressierung ist der Operand in einer Speicherzelle und die Adresse dieser Speicherzelle wird beim Befehl direkt angegeben.
z.B.: Im Datensegment sei eine Größe mit "var1 DW 26"
mov AX,var1
Achtung:
Bez EQU 81h
. . .
mov AH,Bez ; AH := 81h
unmittelbare Adressierung
Bez DB "Assembler"
. . .
mov AH,Bez ; AH := 41h
direkte
Adressierung Register-
adressierun Register-
adressierung
Datenverarbeitungssysteme
3.5.4 Die Index Adressierung
Bei der Index-Adressierung steht der Operand um "Index Bytes" nach einer
Anfangsadresse im Speicher. Die Adresse des Operanden ist bestimmt durch die
Anfangsadresse und den Index ("Entfernung" zur Anfangsadresse). Beim Assemblieren wird zur Anfangsadresse der Index dazu addiert und damit die Adresse (bzw. der
Offsetwert) des Operanden bestimmt.
z.B.: Definition im Datensegment: Text DB "Index Adressierung"
mov AH,Text+1 ;AH := "n"
mov DL,Text +6 ;DL := "A"
Soll nicht auf ein bestimmtes Feldelement zugegriffen werden, kann der Index auch variabel angegeben werden, indem man ihn in ein Index-Register (DI, SI) schreibt (auch BX möglich). Damit ist das Feldelement erst zur Laufzeit bestimmt.
z.B.: mov SI,4
mov AH,Text[SI] ; AH : = "x"
Index Adressierung Register-
adressierung
Unterstützende Operatoren:
TYPE SIZE LENGTH
Datenverarbeitungssysteme
3.5.5 Indirekte (Register-) Adressierung
Bei der indirekten Adressierung befindet sich der Operand wieder in einer Speicherzelle.
Die Angabe des Operanden erfolgt, indem man die Adresse (den Offsetwert) in ein
bestimmtes Register (z.B. BX oder auch SI bzw. DI) schreibt und dieses Register in eckigen Klammern als Operanden angibt. Dann wird der Inhalt dieses Registers nicht direkt als
Operand verwendet, sondern zur Adressbildung (zusammen mit dem Inhalt von DS bzw.
von SS, wenn das BP-Register verwendet wird) herangezogen.
z.B.: Definition: matrix DW 200 DUP (?)
mov BX,Offset matrix
mov [BX],10 ,an die Adresse "matrix" wird 10 geschrieben inc BX
inc BX
mov [BX],11 ;an die Adresse "matix+2" wird 11 geschrieben
indirekte
Adressierung unmittelbare
Adressierung
Datenverarbeitungssysteme
3.5.6 Die Basis-indizierte Adressierung
Bei der Basis-indizierten Adressierung wird die Offsetadresse aus der Summe der Inhalte eines Basisregisters (BX oder BP) und eines Indexregisters (SI oder DI) und einer
konstanten Adresse gebildet.
z.B.: array DB 01,02,03,04,05
DB 11,12,13,14,15
DB 21,22,23,24,25
...
...
mov BX,2 *5 ; eine Zeile entspricht 5 Bytes – d.h. Basis zeigt auf
, Anfang von Zeile 3
mov DI,3 ; der Index zeigt auf das 4. Element (0,1,2,3,4,5) mov AH,array[BX][DI] ; AH := 24
auch möglich: mov AH,[array+BX+DI]
oder mov AH,array[BX+DI]
oder mov AH,[array+BX][DI]
...
Datenverarbeitungssysteme
Adressbildungen
Datenverarbeitungssysteme
3.6 Assembler Befehle des 8086-Prozessors
3.6.1 Befehle zum Datentransfer
• Operationen die den Zugriff vorbereiten (LDS, LES, LEA)
• Zugriffsoperationen (MOV, XCHG, XLAT, XLATB)
• Befehle zum temporären Zwischenspeichern (PUSH, POP)
• Kennzeichentransferbefehle (LAHF, SAHF, PUSHF, POPF)
• Operationen zum Datenaustausch mit Peripherie - Ein-/Ausgabebefehle (IN, OUT) im Prinzip auch:
• Stringbefehle (MOVS, MOVSB, MOVSW)
Datenverarbeitungssysteme
3.6.2 Sprungbefehle
• Unbedingte Sprungbefehle JMP Sprungziel
CALL Sprungziel RET [ByteZahl]
• Bedingte Sprungbefehle (relativ) Jxx Short-Label
(Verzweigung nur, wenn ein oder mehrere Flags bestimmten Zustand haben)
• Befehele zur Schleifensteuerung (relativ) LOOP Short-Label
LOOPE/LOOPZ Short-Label LOOPNE/LOPPNZ Short-Label im Prinzip auch:
• Unterbrechungsbefehle (indirekt) INT Interrupt-Nummer
INTO IRET
Datenverarbeitungssysteme
Verzweigungen
IF <Bedingung> THEN <Befehl(e)>
IF <Bedingung> THEN <Befehl(e)> ELSE <Befehl>
z.B.
CMP AX,wert JNE M1
...a1 ....
M1: ...
z.B.
CMP AX,wert JNE M1
....a1....
JMP M2 M1:
....a2....
M2:...
Datenverarbeitungssysteme
Unterprogramme
Definition von Unterprogrammen:
Aufruf von Unterprogramm:
Rücksprung:
UPname PROC [NEAR oder FAR]
...
...
...
RET; wichtig für Rücksprung UPname ENDP
CALL UPname;
; [CS und] IP Stack ; UPname IP [und CS]
RET [Direktwert];
; 16-Bit-Wert von Stack IP
; [16-Bit-Wert von Stack CS]
; [Direktwert-Bytes werden von Stack entfernt -
; d.h. SP wird um Direktwert/2 erhöht
Datenverarbeitungssysteme
3.6.3 Verknüpfungsbefehle
3.6.3.1 Arithmetische Befehle
• Addition
ADD Ziel,Quelle ADC Ziel,Quelle AAA
DAA
INC Ziel
• Subtraktion
SUB Ziel,Quelle SBB Ziel,Quelle AAS
DAS
DEC Ziel NEG Ziel
CMP Quelle1,Quelle2
• Multiplikation MUL Quelle
IMUL Quelle AAM
• Division DIV Quelle IDIV Quelle AAD
• Vorzeichenerweiterung CBW
CWD
Datenverarbeitungssysteme
3.6.3.2 Befehle zur Bitmanipulation / Logische Befehle
• Logisch (OF, SF, ZF, PF, CF werden entsprechend verändert – nicht bei NOT!)
AND Ziel,Quelle OR Ziel,Quelle XOR Ziel,Quelle
NOT Ziel; (keine Veränderung der Flags!)
TEST Quelle1,Quelle2
• Verschieben (OF, SF, ZF, PF, CF werden entsprechend verändert)
SAL/SHL Ziel,Anzahl
z.B.:;
AL: 1100 0001b; (193) oder –63
SAL AL,1 ; AL := AL * 2
AL: 1000 0010b (130!?) oder –126
SAR Ziel,Anzahl
z.B.:; AL: 1100 0010b; -62 SAR AL,1; AL := AL / 2 AL: 1110 0001b ; -31
SHR Ziel,Anzahl
1100 0010b 0110 0001b; CF = 0 OF = 1
194 97
Datenverarbeitungssysteme
• Rotieren (OF und CF werden entsprechend verändert)
ROL Ziel,Anzahl
ROR Ziel,Anzahl
RCL Ziel,Anzahl
Datenverarbeitungssysteme
3.6.4 Stringbefehle
Alle Stringbefehle (MOVS, LODS, STOS, CMPS, SCAS) haben folgende Gemeinsamkeiten:
•= Die Adressierung erfolgt immer über die Registerpaare DS:SI und/oder ES:DI.
•= Die beteiligten Indexregister werden nach der Ausführung automatisch verändert (in Abhängigkeit von DF und Byte bzw. Wortoperation – DF = 0 +1 bzw.+2 – DF = 1 -1 bzw. -2)
•= Der Operand nach z.B. MOVS gibt nur an, ob es sich um eine Byte- oder Wort-Operation handelt.
•= Die Stringbefehle können mit Wiederholungspräfixen (REP, REPE, REPNE) versehen werden, so dass Schleifen in einer Befehlszeile programmiert werden können.
• Wiederholungspräfixe REP
REPE/REPZ REPNE/REPNZ
• Verschieben
MOVS Zielstring,Quellstring MOVSB
MOVSW
• Vergleichen
CMPS Zielstring,Quellstring CMBSB
• Durchsuchen
SCAS Zielstring SCASB
SCASW
• Laden und Speichern LODS Quellstring LODSB
LODSW
STOS Zielstring STOSB
STOSW
Datenverarbeitungssysteme
3.6.5 Befehle zur Steuerung des Prozessors
• Kennzeichenbefehle STC
CLC CMC STD CLD STI CLI
• Externe Synchronisation
HLT ; versetzt CPU in Wartezustand – Ende durch Interrupt bzw. Reset WAIT ; Warteszustand, bis TEST-Leitung gesetzt wird (z.B. von FPU) LOCK ; Präfix zur Sperrung des Busses für die Dauer eines Befehles
• Keine Operation
NOP ; keine Operation
Datenverarbeitungssysteme
3.6.6 Unterbrechungsbefehle INT Interruptnummer
INTO IRET
Ein Interrupt kann ausgelöst werden durch:
Software Hardware Exception
Datenverarbeitungssysteme
Die Interrupt-Vektortabelle
Datenverarbeitungssysteme
3.7 Makros
3.7.1 Definition und Aufruf
Definition:
Makroname MACRO [formaleParameter,...]
.... Anweisungen und Befehle...
ENDM Aufruf:
Makroname [Par1,...] ;Die Anweisungen und Befehle werden an die Stelle
;des Aufrufes kopiert und die formalen Parameter werden ;durch die aktuellen Parameter Par1,... ersetzt.
Einbinden von Makros, die in einer externen Datei (Bibliothek) definiert wurden:
INCLUDE Dateiname ; ab jetzt können auch Makros aufgerufen werden, die in
; "Dateiname" definiert wurden
Vorteil:
• Übersichtlich
• Wartungsfreundlich
• Code "Reusable"
• "Schnelle Durchführung"
Datenverarbeitungssysteme
3.7.2 Parameterübergabe und lokale Labels/Variablen
Die Parameterübergabe an das Makro erfolgt über formale Parameter
Wenn beim Aufruf mehr Parameter angegeben werden, als definiert wurden, dann werden die Überzähligen Parameter ignoriert – fehlende Parameter werden durch NUL (00h)
ersetzt.
Lokale Marken und Variblen:
Mit der Anweisung
LOCAL Name1, Name2, ...
können Marken und Variablen als lokal definiert werden, d.h. auf diese Größen kann nur innerhalb des Makros zugegriffen werden.
(Assembler ersetzt diese Größen durch "??fortlaufendeZahl" – damit sind diese Größen bei unterschiedlichen Makro-Aufrufen eindeutig unterscheidbar)
Datenverarbeitungssysteme
3.7.3 Rekursive Makros und bedingte Assemblierung
Der Turbo Assembler unterstützt auch Kontrollstrukturen der Form:
IF <Bedingung> THEN
JaAnweisungen ELSE
NeinAnweisungen ENDIF
Für: z.B. kundenspezifische Lösungen oder Debug-Informationen oder zur Erzeugung
"rekursiver Makros" (zusammen mit der Anweisung EXITM, die das weitere Einfügen des Makro-Codes abbricht).
z.B.
VorZur MACRO Z1,Z2,Z3,Z4,Z5
IFB <Z1> ; wahr, wenn kein Parameter für Z1 vorhanden ist EXITM ; keine weitere Makro-Expansion
ENDIF
Zaus Z1 ; Makro zur Ausgabe eines Zeichens VorZur Z2,Z3,Z4,Z5 ; rekursiver Aufruf
Zaus Z1 ; Ausgabe eines Zeichens ENDM
Datenverarbeitungssysteme
3.7.4 Vordefinierte Makros
REPT Ausdruck ;Der Ausdruck gibt an, wie oft die Anweisungen wiederholt werden Anweisungen
ENDM z.B.:
Anzahl EQU 40 ;Konstante, die nicht geändert werden kann
Wert = 0 ;Konstante, die aber beim Assemblieren geändert werden kann REPT Anzahl
DW Wert
Wert = Wert + 1 ENDM
40 Bytes mit: 0, 1, 2, 3, ...39
oder Wiederholungen mit einer Reihe von Parametern:
z.B.:
IRP reg,<AX,CX,SI,DI>
push reg ENDM
Datenverarbeitungssysteme
3.8 Unterprogramme
3.8.1 Definition und Aufruf
Definition:
UPname PROC [NEAR oder FAR]
...Anweisungen und Befehle...
RET ; veranlasst den Rücksprung [UPname] ENDP
Aufruf:
CALL [FAR/NEAR PTR] UPname
Datenverarbeitungssysteme
3.8.2 Parameterübergabe Die Parameterübergabe erfolgt
• über gemeinsamen Arbeitspeicher
• über Register
• über Stack Unterscheidung:
• "Call by Value" - es werden aktuelle Werte übergeben
• "Call by Reference" - es werden Adressen übergeben
3.8.2.1 Parameterübergabe über gemeinsamen Arbeitsspeicher
Das aufrufende Programm und das Unterprogramm greifen auf die gleichen Speicherplätze zu. Damit können "beliebig" viele Parameter ausgetauscht werden, allerdings werden
Parameter direkt verändert ("Call by Reference").
3.8.2.2 Parameterübergabe über Register
Das aufrufende Programm lädt die Parameter in Register und das Unterprogramm verwendet die Inhalte der Register. Allerdings ist die Registerzahl beschränkt und ein rekursiver Aufruf kaum möglich.
Datenverarbeitungssysteme
3.8.2.3 Parameterübergabe über Stack
Das aufrufende Programm speichert die Parameter vor dem Aufruf auf den Stack und im Unterprogramm wird auf die Parameter im Stack zugegriffen. Es können "beliebig" viele Parameter übergeben werden und rekursive Aufrufe sind leicht realisierbar.
aufrufendes Programm:
...
push var1 push var2 call UProg
STACK nach Aufruf:
(NEAR-Aufruf)
SP R_Adr.
var2 var1
Unterprogramm:
push BP mov BP,SP ...
mov ax,[BP + 4]; var2 AX mvo bx,[BP + 6]; var1 BX ...
mov SP,BP pop BP ret 4
STACK (nach mov BP,SP)
SP BPalt [BP]
R_Adr. [BP+2]
var2 [BP+4]
var1 [BP+6]
Datenverarbeitungssysteme
3.8.3 Rekursive Unterprogramme
In einem Unterprogramm wird das Unterprogramm selbst aufgerufen.
Definition von lokalen Marken:
Nach der Anweisung LOCALS werden alle Markennamen, die mit @@ beginnen als lokal betrachtet.
• Gültig im gesamten Unterprogramm
• Im Hauptprogramm gültig von vorheriger bis zur darauffolgender nichtlokaler Markendefinition
• Nach NOLOCALS werden die lokalen Marken wie "normale" Marken behandelt.
Vorgehen zur Verwendung und Definition von lokalen Variablen:
1. Aktuelle Parameter werden vor dem Aufruf auf dem STACK gespeichert 2. CALL speichert die Rücksprungadresse auf dem STACK
3. Im Unterprogramm wird die "alte" Bezugsadresse (BPalt) auf dem STACK gespeichert 4. Die "neue" Bezugsadresse erhält den Wert des SP
5. Reservierung von Speicherzellen im STACK durch Verändern des SP (z.B.: sub SP,6l) 6. Benennung von lokalen Variablen
var1 EQU [BP – 2]
var2 EQU [BP – 4]
var3 EQU [BP – 6]
7. Vor dem Verlassen des Unterprogramms muss der SP auf die Zelle mit der "alten"
Bezugsadresse gesetzt werden und die alte Bezugsadresse wieder in BP geschrieben werden.
Datenverarbeitungssysteme
Beispiel eines "Rekursiven Unterprogramms"
RekUP PROC push BP
mov BP,SP sub SP,6 LOCALS
var1 EQU [BP – 2]
var2 EQU [BP – 4]
var3 EQU [BP – 6]
...
mov AX,[BP+4]
mov var2,AX ...
jne @@Abbr ...
push var1 push var2 CALL RekUP ...
@@Abbr: mov SP,BP
pop BP
ret 4
STACK 1.Aufruf 2. Aufruf 3. Aufruf
? var3
? var2
? var1
BP_3 [BP]
R-Adr3 [BP + 2]
var2-3 [BP + 4]
var1-3 [BP + 6]
? var3
? var2
? var1
BP_2 [BP]
R_Adr2 [BP + 2]
var2-2 [BP + 4]
var1-2 [BP + 6]
? var3
? var2
? var1
BP_1 [BP]
R_Adr1 [BP + 2]
var2-1 [BP + 4]
var1-1 [BP + 6]
Datenverarbeitungssysteme
3.8.4 Modulkonzept
Zusammenfügen von Assemblerprogrammen die in unterschiedlichen Dateien (Modulen) stehen. Dazu müssen "Export-" (d.h. Definitionen werden auch von anderen Modulen verwendet) und "Import-Schnittstellen" (d.h. in anderen Modulen bereits definiert) definiert werden.
Beispiel:
;--- MODUL1 ---
;******* Import – Schnittstelle **********
EXTRN var1:Typ, proz1:Typ, ....
;******* Export – Schnittstelle **********
PUBLIC name1, name12, ....
;******* Definitionen v. Modul1 *********
name1 ...
name12 ...
...
mov ax,var1 call proz1 ...
;--- MODUL2 ---
;******* Import – Schnittstelle **********
EXTRN name1:Typ, name12:Typ, ....
;******* Export – Schnittstelle **********
PUBLIC var1, proz1, ....
;******* Definitionen v. Modul1 *********
var1 ...
proz1 ...
...
mov ax,name1 call name12 ...
Datenverarbeitungssysteme
3.9 Zusammenfassung
• Aufbau eines realen Prozessors
• Strukturierung des Arbeitsspeichers
• Vielfältige Adressierungsmöglichkeiten
• Zahlen- und Zeichendarstellungen
• Maschinenbefehle
• Verbindung von Hochsprachen zu Maschinenbefehlen
• Bedeutung von Statusflags
• Strukturierungsmöglichkeiten
• Bedeutung und Prinzip von STACKs
• Interruptbearbeitung
• Modulkonzept
Datenverarbeitungssysteme
3.10 Kontrollfragen
Wie wird ein Makro definiert und wozu kann man es verwenden?
Erläutern Sie den Unterschied zwischen Makro und Unterprogramm!
Vergleichen Sie einen Unterprogrammaufruf und einen Interruptraufruf. Welche Aktionen werden dabei jeweils im Prozessor durchgeführt?
Geben Sie drei unterschiedliche Beispiele für indirekte Verzweigungen an und erläutern Sie die Unterschiede.
Erklären Sie die Begriffe unmittelbare, direkte und indirekte Adressierung und geben Sie jeweils ein Beispiel. Wie werden dabei jeweils die physikalischen Adressen gebildet?
Was versteht man unter einer bedingten Verzweigung?
Erklären Sie den Unterschied zwischen Anweisung (Pseudobefehl) und Befehl.
Was versteht man unter einer hexadezimalen Zahl?
Geben Sie die Dezimalzahlen 130 und –122 in der "Zweierkomplementdarstellung" und in