Upload
lythu
View
221
Download
4
Embed Size (px)
Citation preview
logo
Assembler - Adressierungsarten
Dr.-Ing. Volkmar Sieh
Department Informatik 3: RechnerarchitekturFriedrich-Alexander-Universität Erlangen-Nürnberg
SS 2008
Assembler - Adressierungsarten– 1/31– 2008-04-01
logo
Adressierungsarten – EinführungBeispiel (C, C++, Java):i n t a , ∗b , c [ 1 0 ] ;s t ruc t { char y ; i n t x ; i n t ∗p } d , ∗e , f [ 5 ] ;
. . . = 13 ;
. . . = a ;
. . . = ∗b ;
. . . = c [ i ] ;
. . . = d . x ;
. . . = e−>x ;
. . . = f [ i ] . x ;
a = . . . ;∗b = . . . ;c [ i ] = . . . ;d . x = . . . ;e−>x = . . . ;f [ i ] . x = . . . ;
... und Kombinationen davon:c [ f [ e−>x ] . y ] = . . . ;∗ f [∗ b ] . p = . . . ;
Assembler - Adressierungsarten– 2/31– 2008-04-01
logo
Adressierungsarten – effektive Adresse
Bei vielen Adressierungsarten wird eine sogenannte „effektiveAdresse” dynamisch zur Laufzeit berechnet.
Gründe (Beispiele):
Basisadresse einer Datenstruktur fest, Index variabel (z.B.beim Array-Zugriff)Basisadresse einer Datenstruktur variabel, Displacementbekannt (z.B. beim Zugriff über Pointer auf Records)
Assembler - Adressierungsarten– 3/31– 2008-04-01
logo
Adressierungsarten – effektive Adresse
Beispiel: Zugriff auf Array-Elemente:
short i n t i ; // Adre s s e 8short i n t f [ 5 ] ; // Adre s s e 14
f [ i ] = 300 ;
Adresse von i bekannt (8)Adresse von f bekannt (14)Größe der Elemente von f bekannt (2)
Adresse(f [i ]) = Adresse(f ) + i ∗ 2
Assembler - Adressierungsarten– 4/31– 2008-04-01
logo
Adressierungsarten – effektive Adresse
Beispiel: Zugriff auf Record-Elemente über Pointer:
s t ruc t r e c {short i n t x ; long i n t i ;short i n t y ; short i n t z ;
} ;s t ruc t r e c ∗p ; // Adre s s e 8s t ruc t r e c s ; // Adre s s e 14
p−>y = 9 ;
Adresse von p bekannt (8)Displacement von s.y bezüglich sbekannt (6)
Adresse(p− > y) = p + 6
Assembler - Adressierungsarten– 5/31– 2008-04-01
logo
Adressierungsarten
Bei der Ausführung von Befehlen mit Parametern (z.B. Additionzweier Werte) sind folgende Punkte sind zu unterscheiden:
wo stehen die eigentlichen Parameter (im Befehl, im Registeroder im Speicher)wo stehen die Informationen, wie man an die Parameterkommt (i.a. sind diese Informationen Teil des Befehls)wie berechnet sich die effektive Adresse (wenn die Parameterim Speicher stehen)
Assembler - Adressierungsarten– 6/31– 2008-04-01
logo
Adressierungsarten – Überblick
RegisterImmediate OperandDirect (Absolute) AddressRegister IndirectRegister Indirect with IndexRegister Indirect with Displacement / PC-relativeRegister Indirect with Index and DisplacementMemory IndirectRegister Indirect with Pre-/Post-DecrementRegister Indirect with Pre-/Post-Increment...
Assembler - Adressierungsarten– 7/31– 2008-04-01
logo
Adressierungsarten – Register
Register-Name bzw. -Nummer ist Bestandteil des BefehlsOperand liegt im Register
Syntax-Beispiele (i80x86):movl %eax , . . .movb . . . , %a l
Verwendung: Schreiben bzw. Lesen von in Registern gespeichertenVariablenr e g i s t e r short i n t r ; /∗ r l i e g t im R e g i s t e r %ax ∗/r e g i s t e r short i n t s ; /∗ s l i e g t im R e g i s t e r %bx ∗/r = s ;
ergibt compiliert:movw %bx , %ax
Assembler - Adressierungsarten– 8/31– 2008-04-01
logo
Adressierungsarten – Immediate Operand
Operand ist Bestandteil des Befehls
Syntax-Beispiele (i80x86):
movl $14 , . . .movl $0x14 , . . .movb $ ’ a ’ , . . .
Verwendung: Zuweisung von Konstanten an Variablen
r e g i s t e r long i n t x ; /∗ x l i e g t im R e g i s t e r %edx ∗/x = 14 ;
ergibt compiliert:
movl $14 , %edx
Assembler - Adressierungsarten– 9/31– 2008-04-01
logo
Adressierungsarten – Immediate Operand
Anmerkung:
Viele Prozessoren (besonders RISC-CPUs) verwenden zurKodierung der Befehle jeweils gleichlange Byte-Folgen (z.B.m88100: jeder Befehl ist genau 4 Bytes lang).
Aber: unmöglich, z.B. einen movl 0x12345678, %eax-Befehl(allein Konstante ist 4 Byte lang) in 4 Bytes zu kodieren.
Abhilfe: Aufteilen des Befehls in zwei Teil-Befehle:statt einem Befehl zwei Befehle
movl $0x12345678 , %eax s e t h i $0x1234 , %eaxs e t l o $0x5678 , %eax
Assembler - Adressierungsarten– 10/31– 2008-04-01
logo
Adressierungsarten – Direct (Absolute) Address
effektive Adresse ist Bestandteil des BefehlsOperand liegt im Speicher
Syntax-Beispiele (i80x86):movl 1236 , . . .movb . . . , 4345
Hinweis: Statt der Adressen werden häufig lieber symbolischeWerte geschrieben. Z.B.:movl varx , . . .movb . . . , f l a g
Die symbolischen Werte müssen jedoch auf irgendeine Weisedefiniert werden (z.B. durch define- oder equ-Anweisungen).Definition im Folgenden aus Platzgründen häufig weggelassen.
Assembler - Adressierungsarten– 11/31– 2008-04-01
logo
Adressierungsarten – Direct (Absolute) AddressVerwendung: Schreiben bzw. Lesen von im Speicher abgelegtenVariablenchar c ; /∗ c hat Adre s s e 1245 ∗/char d ; /∗ d hat Adre s s e 1246 ∗/c = ’A ’ ; d = c ;
ergibt compiliert:movb $65 , 1245movb 1245 , 1246
oder (lesbarer)#d e f i n e c 1245#d e f i n e d 1246
movb $ ’A ’ , cmovb c , d
Assembler - Adressierungsarten– 12/31– 2008-04-01
logo
Adressierungsarten – Register Indirect
Register-Name/-Nummer ist Bestandteil des BefehlsRegister enthält effektive AdresseOperand liegt im Speicher
Syntax-Beispiele (i80x86):
movl (%ebx ) , . . .movb . . . , (%ebp )
Assembler - Adressierungsarten– 13/31– 2008-04-01
logo
Adressierungsarten – Register Indirect
Verwendung: z.B. Schreiben bzw. Lesen von Variablen überPointer, die in Registern liegen.
r e g i s t e r short i n t ∗p ; /∗ p l i e g t im R e g i s t e r %edx ∗/short i n t x ; /∗ x hat d i e Adre s s e 1456 ∗/
p = &x ;∗p = 14 ;x = ∗p ;
ergibt compiliert:
movl $1456 , %edxmovw $14 , (%edx )movw (%edx ) , 1456
Assembler - Adressierungsarten– 14/31– 2008-04-01
logo
Adressierungsarten – Register Indirect with Index
Register-Namen/-Nummern sowie Scale-Faktor sindBestandteile des BefehlsRegister A enthält Anfangsadresse des Objektes(„Startadresse”, „Basisadresse”)Register B enthält Indexeffektive Adresse berechnet sich alsAdresse = Basisadresse + Index ∗ ScaleFaktorOperand liegt im Speicher
Syntax-Beispiele (i80x86):
movl (%ebx , %ecx , 4 ) , . . .movb . . . , (%ebp , %edi , 8)
Assembler - Adressierungsarten– 15/31– 2008-04-01
logo
Adressierungsarten – Register Indirect with Index
Verwendung: Schreiben bzw. Lesen von Array-Elementen
short i n t f [ 1 0 0 ] ; /∗ f hat d i e Adre s s e 1246 ∗/r e g i s t e r short i n t ∗p ; /∗ p l i e g t im R e g i s t e r %ebx ∗/r e g i s t e r short i n t i ; /∗ i l i e g t im R e g i s t e r %ecx ∗/
p = &f [ 0 ] ;p [ i ] = 50 ;f [ 1 ] = p [ i ] ;
ergibt compiliert:
movl $1246 , %ebxmovw $50 , (%ebx , %ecx , 2)movw (%ebx , %ecx , 2 ) , 1248
Assembler - Adressierungsarten– 16/31– 2008-04-01
logo
Adressierungsarten – Register Indirect with Displacement
Register-Name/-Nummer sowie Displacement sindBestandteile des BefehlsRegister enthält Basisadresseeffektive Adresse berechnet sich alsAdresse = Basisadresse + DisplacementOperand liegt im Speicher
Syntax-Beispiele (i80x86):
movl 4(%ebp ) , . . .movb . . . , 17(% e s i )
Assembler - Adressierungsarten– 17/31– 2008-04-01
logo
Adressierungsarten – Register Indirect with Displacement
Bemerkungen:
wird für das Register der Instruction-Pointer/Program-Counterverwendet, spricht man auch von „PC-relativer”-Adressierungstatt der Bezeichnung Displacement wird auch häufig dieBezeichnung „Offset” verwendet
Assembler - Adressierungsarten– 18/31– 2008-04-01
logo
Adressierungsarten – Register Indirect with Displacement
Verwendung: Schreiben bzw. Lesen von Record-Elementen überPointer
s t ruc t r e c { long i n t x ; char c ; short i n t s ; } ;s t ruc t r e c r ; /∗ r hat d i e Adre s s e 3456 ∗/r e g i s t e r s t ruc t r e c ∗p ; /∗ p l i e g t im R e g i s t e r %eax ∗/
p = &r ;p−>c = ’A ’ ;r . s = p−>s ;
ergibt compiliert:
movl $3456 , %eaxmovb $ ’A ’ , 4(%eax )movw 6(%eax ) , 3462 /∗ =3456+6 ; mit Al ignment ∗/
Assembler - Adressierungsarten– 19/31– 2008-04-01
logo
Adressierungsarten – Register Indirect with Index andDisplacement
Register-Name/-Nummer, Scale-Faktor sowie Displacementsind Bestandteile des BefehlsRegister A enthält BasisadresseRegister B enthält Indexeffektive Adresse berechnet sich alsAdresse = Basisadresse + Index ∗ ScaleFaktor + DisplacementOperand liegt im Speicher
Syntax-Beispiele (i80x86):
movw 4(%ebp , %eax , 8 ) , . . .movl . . . , 16(%edx , %ebx , 4)
Assembler - Adressierungsarten– 20/31– 2008-04-01
logo
Adressierungsarten – Register Indirect with Index andDisplacement
Verwendung: Schreiben bzw. Lesen von Record-Elementen einesArrayss t ruc t r e c { long i n t x ; char c ; short i n t s ; } ;s t ruc t r e c f [ 1 0 0 ] ; /∗ f hat d i e Adre s s e 452 ∗/r e g i s t e r s t ruc t r e c ∗p ; /∗ p l i e g t im R e g i s t e r %ecx ∗/r e g i s t e r long i n t i ; /∗ i l i e g t im R e g i s t e r %eax ∗/
p = &f [ 0 ] ;p [ i ] . c = ’A ’ ;f [ 2 ] . s = p [ i ] . s ;
ergibt compiliert:movl $452 , %ecxmovb $ ’A ’ , 4(%ecx , %eax , 8)movw 6(%ecx , %eax , 8 ) , 474 /∗ =452+2∗8+6 ; mit Al ignment ∗/
Assembler - Adressierungsarten– 21/31– 2008-04-01
logo
Adressierungsarten – Memory Indirect
Speicheradresse ist Bestandteil des Befehlseffektive Adresse ist der Inhalt der angegebenen SpeicherzelleOperand liegt im Speicher
Syntax-Beispiele:
movl ( 24 ) , . . .movb . . . , (465)
Assembler - Adressierungsarten– 22/31– 2008-04-01
logo
Adressierungsarten – Memory Indirect
Verwendung: Schreiben bzw. Lesen von Variablen über Pointer, dieim Speicher liegen
short i n t x ; /∗ x hat d i e Adre s s e 340 ∗/short i n t ∗p ; /∗ p hat d i e Adre s s e 342 ∗/
p = &x ;∗p = 45 ;x = ∗p ;
ergibt compiliert:
movl $340 , 342movw 45 , (342)movw (342) , 340
Assembler - Adressierungsarten– 23/31– 2008-04-01
logo
Adressierungsarten – Register Indirect withPre-/Post-Increment/Decrement
Register-Name/Nummer sowie die Größe des Operanden sindBestandteile des BefehlsRegister enthält effektive AdresseOperand liegt im Speichervor/nach dem Zugriff auf den Operanden wird Registerinhaltinkrementiert/dekrementiert (um die Größe des Operanden)
Syntax-Beispiele (i80x86):
movw −(%esp ) , . . .movb +(%eax ) , . . .movl . . . , (%ebp)+movw . . . , (%ecx)−
Assembler - Adressierungsarten– 24/31– 2008-04-01
logo
Adressierungsarten – Register Indirect withPre-/Post-Increment/Decrement
Verwendung: Push und Pop von Werten auf dem Stack (später)
s t ruc t r e c { long i n t x ; short i n t y ; char c ; } ;s t ruc t r e c a ; /∗ a hat d i e Adre s s e 1232 ∗/s t ruc t r e c b ; /∗ b hat d i e Adre s s e 344 ∗/
a = b ;
ergibt compiliert:
movl $1232 , %eaxmovl $344 , %ebxmovl (%ebx )+ , (%eax)+movw (%ebx )+ , (%eax)+movb (%ebx )+ , (%eax)+
Assembler - Adressierungsarten– 25/31– 2008-04-01
logo
Adressierungsarten – m68x05tax /∗ Reg. −> Reg. ∗/txal d a #12 /∗ Immediate Operand −> Reg. ∗/l d x #34l d a 1234 /∗ D i r e c t Address −> Reg. ∗/l d x 5678s t a 1234 /∗ Reg. −> D i r e c t Address ∗/s t x 5678l d a , x /∗ Reg. I n d i r e c t −> Reg. ∗/l d x , xs t a , x /∗ Reg. −> Reg. I n d i r e c t ∗/s t x , xl d a 12 , x /∗ Reg. I n d i r e c t w i th D i sp l acement −> Reg. ∗/l d x 34 , xs t a 56 , x /∗ Reg. −> Reg. I n d i r e c t w i th D i sp lacement ∗/s t x 78 , x
Assembler - Adressierungsarten– 26/31– 2008-04-01
logo
Adressierungsarten – Hinweise
nicht alle CPUs können alle Adressierungsarten (insbesondereviele Einschränkungen bei RISC-CPUs und kleinenMikro-Controllern)nicht alle Adressierungsarten sind mit allen Registern möglich(z.B. ist der Instruction Pointer nicht als Basis- oderIndex-Register erlaubt)nicht alle Kombinationen von Adressierungsarten (Ziel undQuelle) sind möglich (z.B. erlauben viele CPUs movl 1232,432 nicht)es existieren i.a. Einschränkungen für die möglichen Wertebzw. die Größe von Scale-Faktor und Displacement (z.B. kannder Scale-Faktor nur 1, 2, 4 oder 8 betragen; Displacementhäufig < 256)
Assembler - Adressierungsarten– 27/31– 2008-04-01
logo
Adressierungsarten – Hinweise
Zum Teil werden Befehle und Adressierungsarten (z.B. aushistorischen Gründen) anders geschrieben. Beispiele (i80x86):
statt wird verwendetmovl %eax , −(%esp )movl (%esp )+ , %eax
movl %e f l a g s , −(%esp )movl (%esp )+ , %e f l a g s
movl $1234 , %e i p
movl (%esp )+ , %e i p
pu sh l %eaxpop l %eax
p u s h f lp o p f l
jmp 1234
re t
Assembler - Adressierungsarten– 28/31– 2008-04-01
logo
Adressierungsarten – lea-Befehl
Nicht alle Programmier-Konstrukte zum Zugriff auf Variableninnerhalb von (verschachtelten) Arrays und Records sind direktumsetzbar. Z.B.:
char f [ 1 0 ] [ 1 0 ] ;i n t i , j ;
f [ i ] [ j ] = . . . ;
Adresse(f [i ][j]) wäre im Beispiel Adresse(f ) + i ∗ 10 + j . Dafürexistiert keine Adressierungsart (bei den meisten Prozessoren).
In diesen Fällen muss die Adresse explizit berechnet werden
lea-Befehlexplizite Arithmetik (später)
Assembler - Adressierungsarten– 29/31– 2008-04-01
logo
Adressierungsarten – lea-Befehls t ruc t r e c { short i n t v a l u e ; char name [ 6 ] ; } ;s t ruc t r e c r ; /∗ r hat d i e Adre s s e 432 ∗/r e g i s t e r s t ruc t r e c ∗p ; /∗ p l i e g t im R e g i s t e r %eax ∗/r e g i s t e r long i n t i ; /∗ i l i e g t im R e g i s t e r %ebx ∗/
p = &r ; p−>name [ i ] = ’A ’ ;
ist equivalent zur e g i s t e r char ∗n ; /∗ n l i e g t im R e g i s t e r %ecx ∗/
p = &r ; n = &p−>name [ 0 ] ; n [ i ] = ’A ’ ;
ergibt compiliertmovl $432 , %eaxlea 2(%eax ) , %ecxmovb $ ’A ’ , (%ecx , %ebx , 1) ;
Assembler - Adressierungsarten– 30/31– 2008-04-01
logo
Adressierungsarten – Hinweise
Ersatz für fehlende Adressierungsarten:
movl 12345678 , %eax
movl (12345678) , %eax
movl 8(%eax ,%ebx ,1) ,% eax
movl $12345678 , %eaxmovl (%eax ) , %eax
movl $12345678 , %eaxmovl (%eax ) , %eaxmovl (%eax ) , %eax
l e a l 8(%eax ) , %eaxmovl (%eax ,%ebx ,1) ,% eax
Weitere Adressierungsarten können über Arithmetik-Befehlenachgebildet werden.
Assembler - Adressierungsarten– 31/31– 2008-04-01