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

Einführung in Assembler Teil 2: Programmieren · Einführung in Assembler Teil 2: Programmieren • Assemblerprogrammierung: Schritt für Schritt • Instruktionen, Flusskontrolle,

  • Upload
    others

  • View
    25

  • Download
    0

Embed Size (px)

Citation preview

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, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 3

Ablauf der ProgrammerstellungLinux

Programmtext erstellen

Assemblieren (übersetzen)

Linken (binden)

Ausführen

Programm-text

Assembler

OBJ-Datei

Linker

ausführbareDatei

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 4

Programm = Abfolge von Anweisungen für die CPU im Speicher

CPU Speicher(ROM, RAM)

Ein-/Ausgabe

Bussystem

CPU

Instruction Pointer

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

Maschinencode

Die im Speicher abgelegten Anweisungen für die Maschine sind eine Folge von Steuerworten1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1In Hexcode: B8 32 4D

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

Maschinencode Beispiel

1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1B8 32 4DBelege das Register AX mit dem 16-Bit Wert 4D32h

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

Assembler: Symbolische Schreibweise

Zahlen (und Regeln) sind schwer zu merken -->

Mnemonics: MOV AX, 4D32h ; Belege (Move) das Register AX mit dem zweiten Operanden (4D32h)

F

Aufgaben des Assemblers

• Zusammensetzen (engl. to ASSEMBLE) eines Maschinencodes aus den Teilen eines in mnemonischer Kodierung angegebenen BefehlsMOV AX, 4D32h -->Move Immediate to register AX given 16 bit data 1 0 1 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 0 0 1 1 0 1

• Berechnen von Speicher- und relativen Sprungadressen

• Makros: wiederkehrende parametrierbare Code-“schnippsel“

• Erkennen von Fehlern• Erzeugen einer OBJ-Datei (Maschinencode)

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 9

Aufgaben eines Linkers

Häufig sind einige Adressen und Sprungziele während der Assemblierung noch nicht bekannt --> OBJ-Datei enthält ggf. „Leerstellen“ für Verweise auf externe Programmfragmente und Speicherstellen.

Zur Erstellung eines lauffähigen Programms

muss das Programm deshalb mit den externen Programmfragmenten zusammengebunden (engl. to LINK) werden.

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 10

Ablauf der ProgrammerstellungLinux

Programm erstellenProzess: Editieren, z.B. mit gedit, eclipseErgebnis: Datei hallo.asm

Assemblieren (übersetzen)Prozess: nasm -g -f elf hallo.asmErgebnis: Objektdatei hallo.o

Linken (binden)Prozess: gcc -g -o hallo hallo.oErgebnis: Ausführbare Datei hallo

Programm-text

Assembler

OBJ-Datei

Linker

ausführbareDatei

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 11

Assemblerprogramm: hallo.asm

section .datamsg: db 'Hello World!',0x0A ;Text inkl. NLlen equ $ - msg ;Laenge des Textes

section .textglobal main ;Hier beginnt das Programmmain:mov eax, 4 ;Systemaufruf Nr. 4 (sys_write) Textausgabemov ebx, 1 ;Ausgabekanal Nr. 1 = stdoutmov ecx, msg ;Adresse unseres Textes im Speichermov edx, len ;Laenge des Textes in Bytesint 0x80 ;Kernel-Funktion aufrufen mov eax, 1 ;Systemaufruf Nr. 1 (sys_exit) Programmendeint 0x80 ;Kernel-Funktion aufrufen

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2009 Folie 12

Nach Assemblierung: hallo.o (hallo.lst)

1 section .data 2 00000000 48656C6C6F20576F72- msg: db 'Hello World!',0x0A ;Text inkl. Zeilenumbruch LF(0x0A) 3 00000009 6C64210A 4 len equ $ - msg ;Laenge des Textes berechnen (12-Bytes) 5 6 section .text 7 global main 8 9 main: 10 00000000 B804000000 mov eax, 4 ;Systemaufruf Nr. 4 (sys_write) Textausgabe 11 00000005 BB01000000 mov ebx, 1 ;Ausgabekanal Nr. 1 = stdout 12 0000000A B9[00000000] mov ecx, msg ;Adresse unseres Textes im Speicher 13 0000000F BA0D000000 mov edx, len ;Laenge des Textes in Bytes 14 00000014 CD80 int 0x80 ;Kernel aufrufen mit obigen System-Aufrufparametern 15 16 00000016 B801000000 mov eax, 1 ;Systemaufruf Nr. 1 (sys_exit) Programmende 17 0000001B CD80 int 0x80 ;Kernel aufrufen mit obigen System-Aufrufparametern

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 13

Speicherauszug des laufenden Programms

0x08048350 : 0x8048350 <Hex> Address 0 - 3 4 - 7 8 - B C - F 08048350 B8040000 00BB0100 0000B95C 950408BA 08048360 0D000000 CD80B804 000000BB 01000000 08048370 B9699504 08BA1F00 0000CD80 B8010000 08048380 00BB0000 0000CD80

Heruntergebrochen auf Befehle incl. Operanden:B804000000, BB01000000, B95C950408, BA0D000000 CD80B804000000, BB01000000, B969950408, BA1F000000CD80 B801000000, BB00000000,CD80

2.2 - Das Grundgerüst

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

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 15

Grundgerüst für ein Linux- Assemblerprogramm

Abschnittesection .data Initialisierte Variablensection .bss Nicht initialisierte Variablensection .text Programmcode

Für Linker (Aufruf gcc -o test test.o)gcc bindet Startcode ein, der dafür sorgt, dass später

c-library-funktionen aufgerufen werden können.

Einstiegsroutine des Nutzerprogramms ist main

Diese muss über den Kontext der Datei hinaus bekannt sein --> global

geruest.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 16

Variablenvereinbarung

Syntax zum Reservieren von Platz in einem Segment[VarName:] Def.Anweisung Initialisierung

VarName wird als Speicheradresse verwendetDefinitionsanweisungen

DB Define Byte (1 Byte)

Ganzzahl, BuchstabenDW Define Word (2 Byte)

Ganzzahl, BuchstabenDD Define Doubleword (4 Byte)

Ganzzahl, Buchstaben, FließkommaDQ Define Quadword (8 Byte)

FließkommaDT Define Ten Bytes (10 Bytes)

Fließkomma

daten.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 17

Initialisierung von Variablen

Zeichenkette:DB "Hallo"

Kommasep. Liste:DB 1,2,'Hallo',?

Vorsicht mit Zeichenketten und Datentypen ≠ Byte: DB 'Hallo' := 5 Byte

DW 'Hallo' := Fehler (ZK passt nicht in 2 Byte)

Reservieren von Platz (ohne Initialisierung)RESB, RESW, RESQ

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 18

Konstanten

Konstanten ändern ihren Wert während der Laufzeit nicht:Lösung a) Variable (mit Speicherplatz)

vLaenge DB 10…MOV BL, [vLaenge]

Lösung b) TextersetzungAllgemein: Name EQU AusdruckkLaenge EQU 10…MOV BL, kLaenge

konst.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 19

EQU ersetzt Text…

Name EQU AusdruckAusdruck ist der Text von EQU bis Zeilenende bzw.

KommentarzeichenZahlenwerte, Befehle, Zeichenketten, …

Ersetzung wird erst nach Definition wirksam, eine Redefinition ist danach nicht mehr möglich.

Ausdrücke die in Ausdrücken vorkommen werden ebenfalls ersetzt.Keine Ersetzung in Kommentaren und Zeichenketten

Wiederverwendung?Auslagern der Definitionen in eigene Datei

(üblicherweise mit Endung .inc)Einbinden: INCLUDE Dateiname

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 20

Numerische Ausdrücke

Der NASM-Assembler kann an verschiedenen Stellen numerische Ausdrücke berechnen

Adressen, Länge von Strukturen, etc.Achtung: Diese Berechungen erfolgen während des

Assemblierens – im Maschinencode stehen die zur Laufzeit konstanten Berechnungsergebnisse

Unterstützte Rechenoperationen

Arithmetik: + - * / MOD ()Logik: AND OR NOT XOR SHL SHRVerhältnis: EQ GE GT LE LT NE

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 21

Adressarithmetik

$-Operator: Bezeichnet den Offset der aktuellen Programmstelle zum Segmentanfang

BeispielZeile 1 section .dataZeile 2 a: DW 4711Zeile 3 msg: DB 'hallo'Zeile 4 msglen EQU ( $ - msg )

a beginnt bei Adresse 0, msg bei Adresse 2a belegt 2 Byte, msg 5 Byte In Zeile 4 ist →

$=7 → msglen = 7 -2 = 5

rechnen.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 22

(2,3)

(2,3)

Beispiel für Berechnungenzur Assemblierzeit

Zugriff auf TabellenTabelle 2-Dimensional: (Zeile, Spalte)Speicher 1-Dimensional: Adresse

Umrechnung:Adresse = Basisoffset +

(Zeile*Spalten + Spalte) * Zellgröße

(0,0) (0,1) (0,2) (0,3)

(1,0) (1,1) (1,2) (1,3)

(2,0) (2,1) (2,2) (0,0)

(0,1)

(0,2)

(0,3)

(1,0)

(1,1)

(1,2)

(1,3)

(2,0)

(2,1)

(2,2)

Basisoffset

Zeile*Spalten

Spalte

2.3 - Instruktionendes 8086-Prozessors

•Transportbefehle•Arithmetik und Logik•Programmfluss

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 24

Transportbefehle

MOV Ziel, Quelle Belege Ziel mit Quelle

XCHG Operand1, Operand2 Tausche Inhalte der beiden Operanden aus

Stapelspeicher (später…)PUSH Quelle

Lege Quelle auf StapelspeicherPOP Ziel

Entferne oberstes Element vom Stapelspeicher und kopiere Inhalt nach Ziel

Peripherie (noch später…)INP Ziel, Portadresse

Belege Ziel mit dem von Portadresse gelesenen WertOUTP Portadresse, Quelle

Schreibe nach Portadresse die Quelle

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 25

MOV Ziel, Quelle

Von engl. to MOVe, kopiert ein Byte oder ein Wort vom Quell- zum Zieloperanden

Quelloperand und Statusregister werden nicht verändertQuell- und Zieloperand müssen gleiche Größe habenFlagregister, CS und IP können nur gelesen werden

mov ss, DSEGDirektSReg

mov es, dsSRegSReg

mov [v1],[v2]MemMem

mov [var1], 0DirektMem

mov [vSS], ssSregMem

mov [var1], axUregMem

mov ss, [vSS] MemSReg

mov ds, axURegSReg

mov ah,255DirektUReg

mov ax, [var1]MemUReg

mov ax, dsSRegUReg

mov ax,bxURegUReg

BeispielQuelleZielMOV

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 26

XCHG Op1, Op2

Von engl. to eXCHanGe, tauscht die Inhalte der beiden Operanden

Anwendung z.B. bei SortieralgorithmenBeide Operanden müssen gleiche Größe habenSegmentregister können nicht verwendet werden

xchg [v1], axUregMem

xchg ax, [v1]MemUReg

xchg ax,bxURegUReg

BeispielQuelleZielXCHG

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 27

Arithmetikbefehle

ADD Ziel, QuelleAddiert Inhalt von Quelle auf Inhalt von Ziel und legt Ergebnis in

Ziel ab SUB Ziel, Quelle

Subtrahiert Inhalt von Quelle von Inhalt von Ziel und legt Ergebnis in Ziel ab

MUL QuelleMultipliziert Inhalt des Akkumulators mit Inhalt von Quelle und legt

Ergebnis im Akkumulator abDIV Quelle

Dividiert Inhalt des Akkumulators mit Inhalt von Quelle und legt Ergebnis im Akkumulator ab

INC ZielErhöht Inhalt von Ziel um eins

DEC ZielVerkleinert Inhalt von Ziel um eins

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 28

ADD Ziel, Quelle

Von engl. to ADD, addiert den Inhalt des Quelloperanden auf den Inhalt des Zieloperanden

Quell- und Zieloperand müssen gleiche Größe habenQuelloperand wird nicht verändert

Statusflags:OF,SF,ZF,AF,PF,CFCF : Werteüberlauf

add [v1], 0DirektMem

add [v1], axUregMem

add ah,255DirektUReg

add ax, [v1]MemUReg

add ax,bxURegUReg

BeispielQuelleZielADD

arithm.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 29

Exkurs Flags des 8086

OF: Overflow (Überlauf)1=Überlauf hat Vorzeichenbit zerstört (Wertebereich signed überschritten)

DF: Direction (Richtung) 1=SI/DI werden erhöht

IF: Interrupt Enable (Unterbrechung) 1=Alle Unterbrechungen zulassen

SF: Sign (Vorzeichen)1=Ergebnis ist negativ

ZF: Zero (Null)1=Ergebnis ist Null

AF: Auxiliary Carry (Hilfsübertrag)1=Übertrag aus Bit 4 nach Bit 5

PF: Parity (Parität)1=Gerade Anzahl gesetzter Bits im Low-Byte

CF: Carry (Übertrag) 1= Wertebereich überschritten

NCCYCF

POPEPF

NAACAF

NZZRZF

PLNGSF

DIEIIF

UPDNDF

NVOVOF

=0=1Flag

Flags in CodeView

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 30

SUB Ziel, Quelle

Von engl. to SUBtract, subtrahiert den Inhalt des Quelloperanden vom Inhalt des Zieloperanden

Quell- und Zieloperand müssen gleiche Größe habenQuelloperand wird nicht verändert

Statusflags:OF,SF,ZF,AF,PF,CF

sub [var1], 0DirektMem

sub [var1], axUregMem

sub ah,255DirektUReg

sub ax, [var1]MemUReg

sub ax,bxURegUReg

BeispielQuelleZielSUB

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 31

MUL Quelle

Von engl. to MULtiply, multipliziert den vorzeichenlosen Inhalt des Quelloperanden mit dem vorzeichenlosen Inhalt des AkkumulatorsByte-Multiplikation

AX = AL * QuelleWort-Multiplikation

DX:AX = AX * Quelle Quelloperand wird nicht verändertStatusflags:

OF,CF

mul [var1]Mem

mul axUReg

BeispielQuelleMUL

arithm2.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 32

DIV Quelle

Von engl. to DIVide, dividiert den vorzeichenlosen Inhalt des Akkumulators mit dem vorzeichenlosen Inhalt des QuelloperandenByte-Division

AL = AX / QuelleAH = Rest

Wort-MultiplikationAX = DX:AX / QuelleDX = Rest

Quelloperand wird nicht verändert

div [var1]Mem

div bxUReg

BeispielQuelleDIV

arithm2.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 33

INC/DEC Ziel

Von engl. to INCrement/ DECrement erhöht bzw. verkleinert den Inhalt des Zieloperanden um einsHäufig Operation bei Tabellenverarbeitung oder SchleifenbearbeitungStatusflags:

OF,SF,ZF,AF,PF

div [var1]Mem

inc bxUReg

BeispielQuelleINC

arithm2.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 34

Weitere Arithmetikbefehle

ADC Ziel, QuelleAdd with Cary: Addiert unter Berücksichtigung des caryflags einer

vorangehenden OperationSBB Ziel, Quelle

Subtract with Borrow: Subtrahiert unter Berücksichtigung des caryflags einer vorangehenden Operation

IMUL Quelle, IDIV QuelleMultiplikation/Division für vorzeichenbehaftete Zahlen

NEG ZielVorzeichenumkehr

CBWConvert Byte (in AL) to Word (in AX)

CWDConvert Word (in AX) to Doubleword (in DX:AX)

BCD-ZahlenDAA, AAA, DAS, AAS, AAM, AAD

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 35

Bitmanipulation

NOT OperatorInvertiert den Operator

AND/OR/XOR Ziel, QuelleVerknüpft Ziel und Quelle

TEST Op1, Op2Führt internes AND zum Setzen von Statusflags ohne

Operatoren zu verändern durch

SHL/SHR/ROL/ROR/RCL/RCR/SAL/SAR Ziel,AnzVerschiebt oder rotiert den Inhalt von Ziel bitweise

mit unterschiedlicher Berücksichtigung von Statusflags

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 36

NOT ZielAND/OR/XOR Ziel, Quelle

Verknüpft den Inhalt des Quelloperanden mit Inhalt des Zieloperanden

Setzen von einzelnen BitsQuell- und Zieloperand müssen gleiche Größe habenQuelloperand wird nicht verändert

Statusflags:OF=0,SF,ZF,PF,CF=0

Angabe von Binärzahlen:01010010b

and [var1], 0DirektMem

and [var1], axUregMem

and ah,255DirektUReg

and ax, [var1]MemUReg

and ax,bxURegUReg

BeispielQuelleZielAND

1

1

1

0

OR A,B

0111

1001

1010

0000

XOR A,B

AND A, B

BA

bitm.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 37

TEST Ziel, Quelle

AND-verknüpft den Inhalt des Quelloperanden mit Inhalt des Zieloperanden in einem internen Register

Abfrage von einzelnen BitsQuell- und Zieloperand müssen gleiche Größe habenOperanden werden nicht verändert

Statusflags:OF=0,SF,ZF,PF,CF=0

test [var1], 0DirektMem

test [var1], axUregMem

test ah,255DirektUReg

test ax, [var1]MemUReg

test ax,bxURegUReg

BeispielQuelleZielTEST

bitm.asm

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 38

SHL Ziel, Quelle

Verschiebt den Inhalt des Zieloperanden bitweise um soviele Stellen, wie im Quelloperanden angegeben

Genau eine Stelle: Direkt 1Mehrere Stellen: Angabe in cl-Register

Statusflags:OF,SF,ZF,AF=?,PF,CF

shl var1, 11Mem

shl var1, clclMem

shl ax, 11UReg

shl ax, clclUReg

BeispielQuelleZielSHL

shift.asm

1 0 1 1 10 0 0

Bit0Bit7

0 1 1 10 0 01

CF

0

0 1 1 10 0 0 0 0CF geht verloren

0

0

TU Dresden, 19.10.2011 MRT1 (c) Urbas 2007-2011 Folie 39

Shift/Rotate Varianten

SHL: Shift LeftSHR: Shift Right

ROL: Rotate LeftROR: Rotate Right

RCL: through Carry L.RCR: through Carry R.

SAL: arithmetic L.SAR: arithmetic R.

0 1 1 10 0 0 0 0

0 1 0 10 1 00 0 0

0

0 1 1 10 0 0 1 0

1 0 10 1 00 1 0

0 1 1 10 0 0 1 1

1 0 10 1 01 1 0

CF

1 0 10 1 01 1

1 0 1 1 10 0 0

Bit0Bit7

1

CF

0 1 1 10 0 0 0 0 0