Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009...

108
Einführung in Assembler Teil 2: Programmieren • Assemblerprogrammierung: Schritt für Schritt • Instruktionen, Flusskontrolle, Datenstrukturen • Anbindung von Peripherie • Kommunikation mit Systembibliotheken

Transcript of Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009...

Page 1: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

Einführung in Assembler Teil 2: Programmieren

• Assemblerprogrammierung: Schritt für Schritt• Instruktionen, Flusskontrolle, Datenstrukturen• Anbindung von Peripherie• Kommunikation mit Systembibliotheken

Page 2: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

2.1 - Die Werkzeugkette

•Editor•Assembler•Linker•Debugger

Page 3: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 4: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 5: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 6: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 7: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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)

Page 8: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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)

Page 9: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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.

Page 10: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 11: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 12: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 13: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 14: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

2.2 - Das Grundgerüst

• Grundgerüst eines Assemblerprogramms• Sektionen• Vereinbarung von Variablen

Page 15: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 16: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 17: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 18: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 19: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 20: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 21: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 22: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 23: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

2.3 - Instruktionendes 8086-Prozessors

•Transportbefehle•Arithmetik und Logik•Programmfluss

Page 24: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 25: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 26: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 27: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 28: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 29: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 30: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 31: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 32: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 33: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 34: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 35: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 36: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 37: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 38: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 39: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 40: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

Teil 4: Sprünge, Schleifen, Unterprogramm

Page 41: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 42: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 43: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 44: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 45: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 46: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 47: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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.

Page 48: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 49: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 50: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 51: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 52: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 53: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 54: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 55: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 56: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 57: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 58: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 59: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 60: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 61: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 62: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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-

Page 63: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

Anbinden von Prozessperipherie

•Interrupts•Schnittstellen•Programmierung

Page 64: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 65: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 66: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 67: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 67

Speicherbelegung im PC/ATunter DOS

Page 68: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 69: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 70: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 71: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 72: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 73: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 74: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 75: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 76: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 77: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 78: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 79: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 79

PIO 8255 A

Package und interner funktionaler Aufbau

intel8255.pdf

Page 80: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 80

8255/8254-Karte

Page 81: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 81

Ein/Ausgabe Modi des Bausteins

Page 82: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 83: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 84: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

Modularisierung von Assembler-Programme

Page 85: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 86: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 87: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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)

Page 88: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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?

Page 89: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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!

Page 90: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 90

Prozessordetails

Register?

Befehlssatz?

Besonderheiten?

Interruptbehandlung?

Page 91: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 91

Peripherie

FunktionsweiseGenereller AufbauRegisterstrukturZeitliches Verhalten

Page 92: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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.

Page 93: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 94: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

Erstellen eines DOS-Assembler-Programms

• Grundgerüst eines Assemblerprogramms• Vereinbarung von Variablen• Instruktionen• Unterschiede NASM/MASM

Page 95: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 96: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 97: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 98: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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}

Page 99: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 100: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 101: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 102: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 103: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 104: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 105: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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)

Page 106: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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

Page 107: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 107

CODEVIEW MenustrukturCodeView

Open Source

Open Module…

Print

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

Page 108: Einführung in Assembler Teil 2: Programmieren · TU Dresden, 18.10.09 MRT1 (c) Urbas 2007-2009 Folie 3 Ablauf der Programmerstellung Linux Programmtext erstellen Assemblieren (übersetzen)

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