Notater: INF2270 Assembler

Like dokumenter
Dagens tema Programmering av x86 Flytting av data Endring av størrelse

Dagens tema. Minnestrukturen Grovt sett ser minnet for hver process slik ut: Flytting av data. Programmering av x86

Dagens tema. Representasjon av mantissen En desimalbrøk: 1 1, INF1070 INF1070 INF1070 INF1070

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Det viktigste i en moderne datamaskin er hovedkortet («motherboard»):

Dagens tema. Flyt-tall. Koding. 64-bits kode. Hvordan lagres de? Hvordan regner man med dem? Koding av instruksjoner Kodefiler Linking

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

Dagens tema. Flyt-tall. Koding. Tegnsett. Hvordan lagres de? Hvilke egenskaper har de? Hvordan regner man med dem?

En oppsummering (og litt som står igjen)

Den siste dagen. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Veien videre... Eksamen

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen

Dagens tema. Mer MIPS maskinkode. Maske-operasjoner Skift-operasjoner Lesing og skriving Pseudo-instruksjoner Mer om funksjonskall Registeroversikt

Løsningsforslag til eksamen i INF2270

Forhistorien Menneskene har alltid prøvd å lage maskiner for å løse sine problemer. Dagens tema

Datamaskinenes historie Når, hvor og hvorfor ble de første datamaskiner laget? Hvordan har utviklingen gått? Hva inneholder en datamaskin?

En oppsummering. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Eksamen. Programmeringsoppgaver Flervalgsoppgaver

UNIVERSITETET I OSLO

Oversikt Kodegenerering Variabler Setninger Uttrykk While-setningen

Dagens tema. Er maskinen big endian? Denne funksjonen tester det: INF1070 INF1070 INF1070 INF1070

Oversikt Kodegenerering Variable Setninger Uttrykk While-setningen Oppsummering

Dagens tema: Maskinkode. Litt datamaskinhistorie Hva er maskin- og assemblerkode? x86-prosessoren Programkode og variabler

Dagens tema. LC-2 LC-2 er en «ekstrem-risc»; den har 16 instruksjoner og 3 adresseringsmåter.

Dark load-store-maskin

Tema for siste forelesning:

UNIVERSITETET I OSLO

Del 1 En oversikt over C-programmering

Introduksjon til DARK assembly

Løsningsforslag til eksamen i INF2270

Programmeringsspråket C

Forelesning Datatyper Kap 5.2 Instruksjonsformat Kap 5.3 Flyttall App B

Dagens tema. Nyttige programmer Programmet make. Flyt-tall Representasjon av flyt-tall. Standarden IEEE 754. Systemkall i Unix

2 Parser. 1 Skanner. 4 Kodegenerator. 3 Sjekker. Oversikt Datamaskinhistorie x86 Kodegenerering Setninger Uttrykk.

Løsningsforslag til eksamen i INF2270

Forelesning Instruksjonstyper Kap 5.5

Kapittel 1 En oversikt over C-språket

IN 147 Program og maskinvare. Vanlige feil ved bruk av pekere Feilsøking Debuggere

UNIVERSITETET I OSLO

Dark Stakkmaskin. Aritmetiske instruksjoner

Dagens tema. Raskere kode [REB&DRO H kap 5]

Innhold. 2 Kompilatorer. 3 Datamaskiner og tallsystemer. 4 Oppsummering. 1 Skjerm (monitor) 2 Hovedkort (motherboard) 3 Prosessor (CPU)

Tema for siste forelesning:

ITPE/DATS 2400: Datamaskinarkitektur og Nettverk

2 Om statiske variable/konstanter og statiske metoder.

Oversikt over IN147(A):

Dagens tema. Mer om C Enkle datatyper Sammensatte datatyper: Vektorer og matriser Tekster Mengder Strukturer Unioner Ringbuffere

Tall. Binære regnestykker. Binære tall positive, negative heltall, flytende tall

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

2 Om statiske variable/konstanter og statiske metoder.

Litt om Javas håndtering av tall MAT-INF 1100 høsten 2004

Dagens tema. 2. Feilsøking. 1. Minnet. Fast minne. gdb ddd Valgrind Egne testutskrifter. Noen nyttige instruksjoner. Bit-fikling

Tall. Posisjons-tallsystemer. Representasjon av heltall. Tall positive, negative heltall, flytende tall. Tekst ASCII, UNICODE XML, CSS

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Øvingsforelesning 1 Python (TDT4110)

Reelle tall på datamaskin

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

Transkript:

Notater: INF2270 Assembler Veronika Heimsbakk veronahe@student.matnat.uio.no 11. juni 2014 Innhold 1 Registere 2 2 Assembler-programmering 2 2.1 Instruksjoner........................... 3 2.2 Variabler.............................. 3 2.3 Byte, ord og langord....................... 4 2.4 Multiplikasjon........................... 4 2.5 Divisjon.............................. 5 2.6 Flagg................................ 5 2.7 Maskeoperasjoner......................... 5 2.8 Hopp................................ 6 2.9 Alignment............................. 7 2.10 Bit-operasjoner.......................... 7 3 Stakken 8 4 Flyt-tall 8 4.1 Standarden IEEE 754 for 32-bits flyt-tall............ 8 4.2 Regne med flyt-tall........................ 9 4.2.1 Aritmetiske operasjoner................. 10 4.3 Sammenligninger......................... 10 1

Introduksjon Dette er mine eksamensnotater i kurset INF2270 Datamaskinarkitektur som jeg tok våren 2014 ved Institutt for informatikk, Universitetet i Oslo. Notatene er basert på forelesningsfoiler, egne notater (hovedsakelig fra INF1400 Digital design) og pensumbøkene. Disse inneholder sikkert en del feil og mangler, ikke stol på de. Men send meg gjerne en e-post om det er noen innvendinger. 1 Registere %AX %EAX %AH %AL %EBX %BH %BL %ECX %CH %CL %EDX %DH %DL Spesielle 16-bits registere: %CS, %DS, %ES, %FS, %GS, %SS, og spesielle 32-bits registere: %EFLAGS, %EIP. Konvensjonen er at %EAX, %ECX og %EDX er frie regis- Frie registere tere. Bundne registere De andre registerne er bundne registere. Om de endres, må man ta vare på den opprinnelige verdien og sette denne tilbake før retur. 2 Assembler-programmering En testfunksjon som returnerer verdien 19. 1. g l o b l n i n e t e e n 2 nineteen : 3 movl $19, %eax 4 r e t Følgende C program kan teste funksjonen: 1 #i n c l u d e <s t d i o. h > 2 3 extern i n t n i n e t e e n ( void ) ; 4 2

5 i n t main ( void ) 6 { 7 p r i n t f ( n i n e t e e n ( ) = %d\n, n i n e t e e n ( ) ) ; 8 return 0 ; 9 } 2.1 Instruksjoner Hvor - tilsvarer w (word), b (byte), eller l (long). mov- Flytt en verdi. add- Adder en verdi til en annen. sub- Subtraher. inc- Øk en verdi med 1. dec- Senk en verdi med 1. ret Returner fra funksjon. $17 Konstant. neg- Negasjon (med fortegn). imul- Multiplikasjon (med fortegn). div- Divisjon. jmp Hopp. cmp- Sammenligne. lea- Fungerer som mov, men henter adressen istedet for verdien.. %eax Registeret %EAX. 4(%esp) Parametre på stakken. 2.2 Variabler 1. t e x t 2 move : 3 movl $3, %eax 4 movl 4(%esp ), %eax 5 movl %eax, var 6 r e t 7 8. d a t a 9 var :. l o n g 17 # En long med v e r d i 17 10 a r r :. f i l l 8 # 8 byte uten i n i t i a l v e r d i 3

Man kan sette av plass til variabler med spesifikasjonen.long eller.fill. De bør legges i.data. Faste variabler Disse lever så lenge programmet kjører. De kan gis en initialverdi. Det vanlige er å legge slike variabler i.data-segmentet. 1. g l o b l a, b, d, f 2. t e x t 3 f : r e t 4. d a t a 5 a :. l o n g 0 6 b :. l o n g 0 7 c :. b y t e 0 8. a l i g n 2 9 d :. l o n g 5 Tilsvarende i C: 1 i n t a, b ; 2 s t a t i c char c ; 3 long d = 5 ; 4 5 void f ( void ) {} 2.3 Byte, ord og langord mov- finnes for byte, word (2 byte) og long (4 byte): 1 movb $0x12, %a l 2 movw $0x1234, %ax 3 movl $0x12345678, %eax 2.4 Multiplikasjon I tillegg til imulw/imull, finnes en versjon som jobber med faste registere: mulb og imulb jobber med %AX, mulw og imulw jobber med %DX:%AX, og mull og imull jobber med %EDX:%EAX. 4

2.5 Divisjon Divisjon gir to svar (kvotient og rest). Den er også litt rar når det gjelder registerbruk: divl og idivl får svar i %EAX og rest i %EDX. divw og idivw får svar i %AX og rest i %DX, divb og idivb får svar i %AL og rest i %AH. Eksempel. 1. g l o b l div10 2 # C s i g n a t u r : unsigned i n t div10 ( unsigned i n t v ) 3 div10 : 4 movl 4(%esp ), %eax # %eax = v 5 movl $0, %edx # %edx : 6 movl $10, %ecx # %ecx = 10 7 d i v l %ecx # (%eax, %edx ) = 8 # (%edx:%eax /10, %edx:%eax%10) 9 r e t 2.6 Flagg De fleste operasjonene har en bieffekt: visse egenskaper ved resultatet blir lagret i flaggene. Z Zero. Settes til 1 når svaret er 0 (og til 0 ellers). S Sign. Settes lik øverste bit i svaret. C Carry. Settes lik den menteoverføringen som skjedde øverst i resultatet. O Overflow. Settes om svaret var for stort. P Parity. Settes om laveste byte har et partall 1-bit. 2.7 Maskeoperasjoner Maskeoperasjonene brukes til å sette eller nulle ut bit i henhold til et gitt mønster (maske). Maske-AND (andb) Lik operasjonen & i C. Det er forskjell på & (maske- AND eller bit-and) og && (logisk AND) i C. 1 & 4 == 0 og 1 && 4 == 1. 5

Maske-OR (orb) Denne operasjonen setter de bit som er markert i masken. Denne operasjonen er tilgjengelig i C som. Maske-NOT (notb) Denne snur alle bit-ene. Finnes i C som. Maske-XOR (xorb) Denne operasjonen snur bare de bit som er markert i masken. Denne operasjonen kalles ofte logisk addisjon. Den er tilgengelig i C og heter ^. 2.8 Hopp Instruksjonen for å hoppe hetet jmp. 1 jmp d i t 2 d i t : Betinget hopp Man kan angi at flaggene skal avgjøre om man skal hoppe. 1 j z d i t # Hopp om Z( ero ) 2 jnz d i t # Hopp om ikke Z 3 j c d i t # Hopp om C( arry ) 4 jnc d i t # Hopp om ikke C 5 j s d i t # Hopp om S ( ign ) 6 j n s d i t # Hopp om ikke S 7 j o d i t # Hopp om O( v e r f l o w ) 8 jno d i t # Hopp om ikke O 9 jp d i t # Hopp om P( a r i t y ) 10 jnp d i t # Hopp om i kke P Testing Flaggene kan settes som følge av vanlige instruksjoner: 1. g l o b l abs1 2 abs1 : movl 4(%esp ), %eax 3 addl $0, %eax 4 j n s r e t 2 5 n egl %eax 6 r e t 2 : r e t 6

Alternativt kan vi eksplisitt sjekke to verdier mot hverandre med instruksjonen cmp-: 1. g l o b l abs2 2 abs2 : movl 4(%esp ), %eax 3 cmpl $0, %eax 4 j n s r e t 1 5 n egl %eax 6 r e t 1 : r e t En tredje mulighet er test-. 1. g l o b l s3 2 s3 : t e s l $0x80000000, 4(%esp ) 3 j z a3 pos 4 movl $1,% eax 5 jmp a3 x 6 a3 pos : movl $0, %eax 7 a3 x : r e t 2.9 Alignment Brukeren kan angi at variabler skal være alignet, dvs ikke krysse ordgrenser:.align n. Denne spesifikasjonen får assembleren til å legge inn 0 eller flere byte med ett eller annet inntil adressen har n 0-bit sist. 2.10 Bit-operasjoner Det finnes fire operasjoner for å jobbe med enkelt-bit: btl Gjør ingenting. btcl Snur bit-et. btrl Nuller bit-et. btsl Setter bit-et. Alle kopierer dessuten det opprinnelige bit-et til C-flagget. btl $2, %eax # Sjekker bit 2 i EAX. 7

2.11 Funksjonskall De seks første parameterne ligger i %RDI, %RSI, %RDX, %RCX, %R8, %R9. Øvrige parametere ligger på stakken. Parameterregisterne samt %R10 og %R11 er frie registere, de øvrige er bundne. Returverdien skal ligge i %RAX. 3 Stakken Stakken er veldig sentral i x86-arkitekturen til rutinekall, parameteroverføring, lagring av mellomresultater og plass til lokale variabler. Av historiske grunner vokser stakken mot lavere adresser. Legge elementer på stakken på stakken. Fjerne elementer fra stakken Instruksjonene pushw og pushl legger verdier Til dette brukes popw og popl. 4 Flyt-tall Tall med desimalkomma kan skriver på flere måter: 8388708, 0 8, 388708 10 6 8, 39 10 6 De to siste (±M G E ) er såkalte flyt-tall og består av: Mantisse (M). Grunntall (G). Eksponent (E). Fortegn. En normalisert mantisse er en binærbrøk med følgende egen- Normalisert skap: 1 M < 2 8

4.1 Standarden IEEE 754 for 32-bits flyt-tall S Eksponent Mantisse S er fortegnet; 0 for positiv og 1 for negativ. Grunntallet er 2. Eksponenten er på 8 bit og lagres med fast tillegg 127. Mantissen er helst normalisert og på 24 bit, men kun de 23 etter binærkommaet lagres. Mantissen er på 24 bit, og 2 24 1, 7 10 7. Eksempel 1, 0 10 = 1, 0 2 som er normalisert. Eksponenten er 0 + 127 = 127 = 1111111 2. Fortegnet er 0. 0 01111111 00000000000000000000000 Som spesialkonvensjon er 0 representert av kun 0-bit Eksempel 2 Hvordan lagres 12, 8125? 12, 8125 10 = 1100, 1101 2 = 1, 1001101 2 2 3 Eksponenten er 3 + 127 = 130 = 10000010 2. Fortegnet er 1. 1 10000010 10011010000000000000000 Det største tallet er omtrent 2 254 127 2 3, 4 10 38. Eksponenten 0 er reservert for unormaliserte tall og tallet 0, eksponenten 255 for og NAN. 0 11111110 11111111111111111111111 4.2 Regne med flyt-tall x86 har en egen flyt-tallsprosessor: x87. Den har egne registere ST(0) ST(7) som brukes som en stakk; de inneholder double-verider. ST(0) (ofte bare kalt ST) er toppen. 9

Konstanter fldz Dytter 0.0 på stakken. fld1 Dytter 1.0 på stakken. Lese fra minnet/stakken flds var Dytter float var på stakken. Skrive til minnet/stakken fsts var Skriver ST(0) til var som float. fstl var Skriver ST(0) til var som double. fst %st(4) Kopierer ST(0) til ST(x). fldl var Dytter double var på stakken. fld %st(1) Dytter kopi av ST(x) på stakken. 4.2.1 Aritmetiske operasjoner fstps var Som instruksjonene over, popper stakken etterpå. fstpl var fstp %st(5) 1 fadds var # ST( 0 ) += f l o a t var 2 f a d d l var # ST( 0 ) += double var 3 fadd %s t ( 4 ) # ST( 0 ) += ST( x ) 4 faddp # ST( 1 ) = ST( 0 )+ST( 1 ) ; popp 5 f i a d d s i v a r # ST( 0 ) += s h o r t i v a r 6 f i a d d l i v a r # ST( 0 ) += long i v a r Tilsvarende operasjoner finnes for subtraksjon, multiplikasjon og divisjon: 1 f s u b s var # ST( 0 ) = f l o a t var 2 fmuls var # ST( 0 ) = f l o a t var 3 f d i v s var # ST( 0 ) /= f l o a t var 4.3 Sammenligninger 1 f t s t # Sammenlign ST( 0 ) med 0. 0 2 fcoms i v a r # Sammenlign ST( 0 ) med s h o r t var 3 fcoml i v a r # Sammenlign ST( 0 ) med long var 4 fcom %s t ( 7 ) # Sammenlign ST( 0 ) med ST( x ) 5 fcom # Sammenlign ST( 0 ) med ST( 1 ) 10

Likedan som over, men popper etterpå: legg på en p etter fcom. fcompp popper to ganger. 11