Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Számítógép architektúra Utasítások – valós üzemmód.

Hasonló előadás


Az előadások a következő témára: "Számítógép architektúra Utasítások – valós üzemmód."— Előadás másolata:

1 Számítógép architektúra Utasítások – valós üzemmód

2 2007Utasítások2-119 Utasítás PrefixOpkódModR/MSIBEltolásKözvetlen max 4 1 byte-os prefix (opcionális) 1, 2 vagy 3 byte 1 byte, ha szükséges memória cím eltolása, 0, 1, 2 vagy 4 byte közvetlen érték, 0, 1, 2 vagy 4 byte 7 65 32 0 SkálaIndexBázis 7 65 32 0 Mod Reg/ Opkód R/MR/M

3 2007Utasítások3-119 Operandusok zéro, egy vagy két operandus első operandus – cél második opernadus – forrás forrás operandus lehet: –regiszter – 8, 16 vagy 32 bites, –memória –közvetlen érték – 1, 2 vagy 4 byte cél operandus regiszter vagy memória cél és forrás operandus mérete meg kell egyezzen nem lehet két memória operandus

4 2007Utasítások4-119 Operandusok jelölése r8 – 8 bites regiszter: AL, CL, DL, BL, AH, CH, DH, BH r16 – 16 bites általános regiszter: AX, CX, DX, BX, SP, BP, SI vagy DI r32 – 32 bites általános regiszter: EAX, ECX, EDX, EBX, ESP, EBP, ESI vagy EDI Sreg – szegmensregiszter: ES, CS, SS, DS, FS, GS m8, m16, m32 – 8, 16 vagy 32 bites memória operandus r/m8, r/m16, r/m32 – 8, 16 vagy 32 bites regiszter vagy memória operandus imm8, imm16, imm32 – byte, szó vagy duplaszó közvetlen operandus

5 2007Utasítások5-119 Adatátviteli utasítások nem módosítják a jelzőbiteket

6 2007Utasítások6-119 MOV MOV cél, forrás cél ← forrás cél nem lehet a CS regiszter lehtséges operandusok –MOV r/m8,r8 –MOV r/m16,r16 –MOV r/m32,r32 –MOV r8,r/m8 –MOV r16,r/m16 –MOV r32,r/m32 –MOV r/m16,Sreg –MOV Sreg,r/m16 –MOV r8,imm8 –MOV r16,imm16 –MOV r32,imm32 –MOV r/m8,imm8 –MOV r/m16,imm16 –MOV r/m32,imm32

7 2007Utasítások7-119 MOV példák MOV AX, BXAX ← BX MOV CX, [eger]CX ← [eger], ahol eger egy 16 bites változó MOV AL, -5AL ← -5 MOV CH, [BX + SI]CH ← [BX + SI] MOV DX, CSDX ← CS MOV AX, CLhibás, mivel AX 16, CL pedig 8 bites MOV [BX], [DI]hibás, mivel mindkét operandus változó MOV [BX + 10], 123hibás, mivel nem lehet eldönteni, hogy 8 vagy 16 bitesek az operandusok; egy helyes változata például a következő: MOV WORD [BX + 10], 123[BX + 10] ← 123; 16 bites op. MOV DS, AXDS ← AX MOV ES, DShibás, mindkét operandus nem lehet Sreg MOV SS, 12DEhhibás, egyik operandus sem lehet konstans MOV CS, DXhibás, mivel CS nem lehet céloperandus

8 2007Utasítások8-119 XCHG adatok cseréje (Exchange data) XCHG cél, forrás cél ↔ forrás lehtséges operandusok –XCHG r/m8, r8 –XCHG r8, r/m8 –XCHG r/m16, r16 –XCHG r16, r/m16 –XCHG r/m32, r32 –XCHG r32, r/m32

9 2007Utasítások9-119 XCHG példák XCHG EAX, EBXEAX ↔EBX XCHG CX, [eger]CX ↔ [eger], ahol eger egy 16 bites változó XCHG CH, [BX + SI]CH ↔ [BX + SI] XCHG AX, CLhibás, mivel AX 16, CL pedig 8 bites XCHG [BX], [DI]hibás, mivel mindkét operandus változó XCHG AL, -5hibás, mivel a –5 közvetlen érték, nem megengedett operandus

10 2007Utasítások10-119 XLAT Index dekódolása (Table Look-up Translation) XLAT forrás forrás csak dokumentál XLATB AL ← [DS:BX+AL] példa: MOV BX, eger MOV AL, 15 XLAT eger utasítássorozat az AL regiszterben visszaadja az eger címen kezdődő táblázat 15. byte-ját.

11 2007Utasítások11-119 PUSH Adatok mentése a verembe (Push data) PUSH forrás SP ← SP–2 vagy SP ← SP–4 [SP] ← forrás A veremszegmens címméret attributumától függően csökkenti SP-t 2-vel vagy 4-gyel lehtséges operandusok: –PUSH r/m16 –PUSH r/m32 –PUSH imm8 –PUSH imm16 –PUSH imm32 –PUSH Sreg

12 2007Utasítások12-119 PUSH példák veremszegmens címméret attributum 32: –PUSH EAXSP ← SP–4; [SP] ← EAX –PUSH CSSP ← SP–4; [SP] ← CS duplaszó hosszra veremszegmens címméret attributum 16: –PUSH CSSP ← SP–2; [SP] ← CS –PUSH [eger]SP ← SP–2; [SP] ← [eger], ahol eger egy 16 bites változó –PUSH -15SP ← SP–2; [SP] ← -15 szóhosszra (16 bit) előjelhelyesen kiterjesztve –PUSH CLhibás, mivel CL 8 bites regiszter

13 2007Utasítások13-119 POP Adatok betöltése a veremből (Pop data) POP cél cél ← [SP] SP ← SP+2 vagy SP ← SP+4 A veremszegmens címméret attributumától függően növeli SP-t 2-vel vagy 4-gyel lehtséges operandusok: –POP r/m16 –POP r/m32 –POP Sreg Sreg nem lehet a CS

14 2007Utasítások14-119 POP példák veremszegmens címméret attributum 32: –POP AXAX ← [SP], SP ← SP+4 –POP DSDS ← [SP], SP ← SP+4 veremszegmens címméret attributum 16: –POP AXAX ← [SP], SP +2 –POP [eger][eger] ← [SP], SP ← SP+2, ahol eger egy 16 bites változó –POP 15hibás, mivel a cél nem lehet közvetlen érték –POP CLhibás, mivel CL pedig 8 bites regiszter –POP CShibás, mivel a CS szegmensregiszter nem lehet a POP operandusa

15 2007Utasítások15-119 PUSHF Flagek mentése a verembe (Push flags) PUSHF SP ← SP–2 vagy SP ← SP–4 [SP] ← Flags A veremszegmens címméret attributumától függően csökkenti SP-t 2-vel vagy 4-gyel Példa: –PUSHFSP ← SP–2; [SP] ← Flags

16 2007Utasítások16-119 POPF Flagek betöltése a veremből (Pop flags) POPF Flags ← [SP] SP ← SP+2 vagy SP ← SP+4 A veremszegmens címméret attributumától függően növeli SP-t 2-vel vagy 4-gyel Példa: –POPFFlags ← [SP], SP ← SP+2

17 2007Utasítások17-119 PUSHA az általános regiszterek kimentése a verembe (Push all) PUSHA az általános regiszterek tartalmát a verembe menti AX, CX, DX, BX, SP (eredeti é rt é k), BP, SI é s DI sorrendben megfelel 8 PUSH utas í t á snak

18 2007Utasítások18-119 POPA Általános regiszterek betöltése a veremből (Pop all) POPA betölti az általános regiszterek tartalmát a veremből DI, SI, BP, (SP), BX, DX, CX és AX sorrendben. m egfelel 8 POP utas í t á snak

19 2007Utasítások19-119 SAHF flagek betöltése AH-ból (Store AH into Flags) SAHF a Flags regiszter 7., 6., 4., 2. és 0. bitjeit (SF, ZF, AF, PF és CF jelzőbitek) betölti az AH regiszterből az 5., 3. és 1. bitek változatlanok maradnak

20 2007Utasítások20-119 LAHF flagek ment é se AH-ba (Load Flags into AH) LAHF a Flags regiszter alacsonyabb helyi é rt é kű byte-j á t (az SF, ZF, AF, PF é s CF jelzőbitek) az AH regiszterbe t ö lti

21 2007Utasítások21-119 LDS Távoli mutató betöltése (Load far pointer) LDS cél, forrás cél ← forrás DS ← forrás + 2 vagy forrás + 4 lehetséges operandusok –LDS r16,m16:16 –LDS r32,m16:32 A memóriában a távoli mutatót 4 (6) byte-on ábrázoljuk, eltolás (offset), szegmens kezdőcím (szelektor) sorrendben. Egy távoli mutató a verembe is hasonló formában kerül.

22 2007Utasítások22-119 LDS példák LDS BX, [eger]BX ← [eger]; DS ← [eger + 2], ahol eger egy 32 bites változó LDS SI, [BX]SI ← [BX]; DS ← [BX + 2], ahol a BX regiszter egy 32 bites változóra mutat LDS SI, BXhibás, mivel a forrás egy regiszter

23 2007Utasítások23-119 LES, LFS, LGS, LSS távoli mutató betöltése (Load far pointer) ugyanúgy működik,mint az LDS, DS regiszter helyett az ES,FS, GS vagy SS szegmensregisztereket használva lehetséges operandusok –LSS r16,m16:16 –LSS r32,m16:32 –LES r16,m16:16 –LES r32,m16:32 –LFS r16,m16:16 –LFS r32,m16:32 –LGS r16,m16:16 –LGS r32,m16:32

24 2007Utasítások24-119 LEA Effekt í v c í m kisz á m í t á sa (Load effective address) LEA cél, forrás cél ← offset forrás lehetséges operandusok –LEA r16,m –LEA r32,m Példák: LEA SI, [eger]SI ← offset eger, ahol eger egy memória operandus LEA DI, [BX+5]DI ← BX+5 LEA BX, [BP+SI+5]BX ← BP+SI+5 LEA DI, BXhibás, mivel a forrás egy regiszter

25 2007Utasítások25-119 Aritmetikai utasítások értelemszerűen módosítják a jelzőbiteket

26 2007Utasítások26-119 ADD Összeadás (Add) – két egész szám összeadása ADD cél, forrás cél ← cél + forrás módosított jelzőbitek: OF, SF, ZF, AF, CF és PF lehetséges operandusok: –ADD r/m8,imm8 –ADD r/m16,imm16 –ADD r/m32,imm32 –ADD r/m16,imm8 –ADD r/m32,imm8 –ADD r/m8,r8 –ADD r/m16,r16 –ADD r/m32,r32 –ADD r8,r/m8 –ADD r16,r/m16 –ADD r32,r/m32

27 2007Utasítások27-119 ADD példák ADD AX, BXAX ← AX + BX ADD CX, [eger]CX ← CX + [eger], ahol eger egy 16 bites változó ADD CH, DLCH ← CH + DL ADD DX, -1234DX ← DX + (-1234) ADD [SI], AX[SI] ← [SI] + AX, ahol SI egy 16 bites változó címét tartalmazza ADD SI, BXSI ← SI + BX ADD AX, BLhibás, mivel AX 16, BL pedig 8 bites ADD [SI], [eger]hibás, mivel mindkét operandus változó

28 2007Utasítások28-119 ADC Összeadás átvitellel (Add with carry) – az összeadás eredményhez hozzáadja az átviteli jelzőbit (carry flag) értékét is ADD cél, forrás cél ← cél + forrás + CF módosított jelzőbitek: OF, SF, ZF, AF, CF és PF lehetséges operandusok – mint az ADD-nél

29 2007Utasítások29-119 ADC példák ADC AX, BXAX ← AX + BX + CF ADC DX, -12DX ← DX + (-12) + CF ADC [ES:SI], AXES:[SI] ← [SI] + AX + CF, ahol SI egy járulékos szegmensbeli (ES) 16 bites változó címét tartalmazza ADC AX, BLhibás, mivel AX 16, BL pedig 8 bites ADC -1234, DXhibás, mivel a -1234 nem lehet céloperandus a DX:AX regiszterpárban tárolt 32 bites értékhez adja hozzá a CX:BX regiszterpárban tárolt, szintén 32 bites értéket: ADD AX, BXAX ← AX + BX, és beállítja a CF értékét ha van átvitel ADC DX, CXDX ← DX + CX + CF

30 2007Utasítások30-119 SUB kivonás (Subtract) két egész szám különbsége SUB cél, forrás cél ← cél – forrás módosított jelzőbitek: OF, SF, ZF, AF, CF és PF lehetséges operandusok – mint az ADD-nél

31 2007Utasítások31-119 SUB példák SUB AX, BXAX ← AX – BX SUB CX, [eger]CX ← CX – [eger], ahol eger egy 16 bites változó SUB CH, DLCH ← CH – DL SUB DX, -1234DX ← DX – (-1234) SUB [SI], AX[SI] ← [SI] – AX, ahol SI egy 16 bites változó címét tartalmazza SUB SI, BXSI ← SI – BX SUB AX, BLhibás, mivel AX 16, BL pedig 8 bites SUB [SI], [eger]hibás, mivel mindkét operandus változó

32 2007Utasítások32-119 SBB Kivonás kölcsönkéréssel (Subtract with borrow) a kivonás eredményéből kivonja a CF értékét SBB cél, forrás cél ← cél – (forrás + CF) módosított jelzőbitek: OF, SF, ZF, AF, CF és PF lehetséges operandusok – mint az ADD-nél

33 2007Utasítások33-119 SBB példák SBB AX, BXAX ← AX – (BX + CF) SBB DX, -12DX ← DX – (-12 + CF) SBB ES:[SI], AXES:[SI] ← [SI] – (AX + CF), ahol SI egy 16 bites változó címét tartalmazza az ES által jelölt szegmensen belül SBB AX, BLhibás, mivel AX 16, BL pedig 8 bites SBB -1234, DXhibás, mivel a -1234 nem lehet céloperandus

34 2007Utasítások34-119 MUL előjel nélküli szorzás (Multiply) két előjel nélküli egész szám szorzata MUL forrás módosított jelzőbitek: OF, CF beállítva, ha átvitel van a magasabb helyiértékű regiszterbe (AH,DX,EDX) lehetséges operandusok: –MUL r/m8 –MUL r/m16 –MUL r/m32 Operandus méreteSzorzandóSzorzóSzorzat byteALr/m8AX wordAXr/m16DX:AX dwordEAXr/m32EDX:EAX

35 2007Utasítások35-119 MUL példák MUL EBXEDX:EAX ← EAX * EBX MUL word [eger]DX:AX ← AX * [eger], ahol eger egy 16 bites változó MUL DLAX ← AL * DL MUL 1234hibás, mivel közvetlen operandus nem megengedett MUL [SI]hibás, mivel az SI regiszter által mutatott változó mérete nem ismert, helyesen: MUL byte [SI]AX ← AL * [SI], ahol SI egy 8 bites változó címét tart. MUL AX, BLhibás, mivel két operandust adtunk meg

36 2007Utasítások36-119 DIV előjel nélküli osztás (Divide) két előjel nélküli egész szám maradékos osztása DIV forrás nem állítja a jelzőbiteket, túlcsorduláskor kivétel lép fel lehetséges operandusok: –DIV r/m8 –DIV r/m16 –DIV r/m32 Operandus méreteOsztandóOsztóHányadosMaradék word / byteAXr/m8ALAH dword / wordDX:AXr/m16AXDX qword / dwordEDX:EAXr/m32EAXEDX

37 2007Utasítások37-119 DIV példák DIV EBXEAX ← EDX:EAX div EBX; EDX ← EDX:EAX mod EBX DIV word[eger]AX ← DX:AX div [eger]; DX ← DX:AX mod [eger], ahol eger egy 16 bites változó DIV CLAL ← AX div CL; AH ← AX mod CL DIV 1234hibás, mivel közvetlen operandus nem megengedett DIV [SI]hibás, mivel az SI regiszter által mutatott változó mérete nem ismert, helyesen: DIV byte [SI]AL ← AX div [SI]; AH ← AX mod [SI], ahol SI egy 8 bites változó címét tart. DIV AX, BLhibás, mivel két operandust adtunk meg

38 2007Utasítások38-119 IMUL előjeles szorzás (Integer multiply) két előjeles egész szám szorzása a szorzást kétszeresen méreten végzi el módosított jelzőbitek: OF, CF beállítva, ha a szorzat mérete meghaladja a az operandusok méretét (átvitel van a magasabb helyiértékű regiszterbe vagy a második és harmadik alak esetén elveszít a szám elejéről értékes számjegyeket) három alak lehetséges

39 2007Utasítások39-119 IMUL – első alak megegyezik a MUL utasítással, csak előjeles számokkal dolgozik

40 2007Utasítások40-119 IMUL – második alak IMUL cél, forrás cél ← cél * forrás a cél és a forrás operandusok hossza megegyezik, így az adott méretet meghaladó szorzat esetén az eredmény magasabb helyiértékű bitjei elvesznek alkalmazható előjel nélküli operandusokkal is lehetséges operandusok: –IMUL r16,r/m16 –IMUL r32,r/m32 –IMUL r16,imm8 –IMUL r32,imm8 –IMUL r16,imm16 –IMUL r32,imm32

41 2007Utasítások41-119 IMUL – harmadik alak IMUL cél, forrás, érték cél ← forrás * érték a cél és a forrás operandusok hossza megegyezik, így az adott méretet meghaladó szorzat esetén az eredmény magasabb helyiértékű bitjei elvesznek alkalmazható előjel nélküli operandusokkal is lehetséges operandusok: –IMUL r16,r/m16,imm8 –IMUL r32,r/m32,imm8 –IMUL r16,r/m16,imm16 –IMUL r32,r/m32,imm32

42 2007Utasítások42-119 IMUL példák IMUL BXDX:AX ← AX * BX IMUL ECXEDX:EAX ← EAX * ECX IMUL word [eger]DX:AX ← AX * [eger], ahol eger egy 16 bites változó IMUL DLAX ← AL * DL IMUL 1234hibás, mivel közvetlen operandus nem megengedett IMUL [SI]hibás, mivel az SI regiszter által mutatott változó mérete nem ismert, helyesen: IMUL byte ptr [SI]AX ← AL * [SI], ahol SI egy 8 bites változó címét tartalmazza

43 2007Utasítások43-119 IMUL példák (2) IMUL CX, -23CX ← CX * (-23) IMUL CX, DXCX ← CX * DX IMUL EBX, dword[eger]EBX ← EBX * eger, ahol eger egy 32 bites változó IMUL CL, DLhibás, mivel 8 bites operan- dusok nem megengedettek IMUL word[eger], DXhibás, mivel a cél operandus nem lehet memória operandus IMUL EBX,ECX, -23EBX ← ECX * (-23) IMUL BX, word[eger], 10BX ← eger * 10, ahol eger egy 16 bites változó IMUL CX, AX, BLhibás, mivel a harmadik op. nem közvetlen érték IMUL [eger], DX, 25hibás, mivel a cél operandus nem lehet memória operandus

44 2007Utasítások44-119 IMUL végrehajtása IMUL BL 15 87 0 AX0010100011111011 AL = –5 15 87 0 BXBX0110000000000011 BL = 3 15 87 0 AX1111111111110001 AX = –15

45 2007Utasítások45-119 IDIV előjeles osztás (Integer Divide) két előjeles egész szám maradékos osztása IDIV forrás nem állítja a jelzőbiteket, túlcsorduláskor kivétel lép fel a maradék előjele megegyezik az osztandó előjelével lehetséges operandusok: –DIV r/m8 –DIV r/m16 –DIV r/m32 Operandus méreteOsztandóOsztóHányadosMaradék word / byteAXr/m8ALAH dword / wordDX:AXr/m16AXDX qword / dwordEDX:EAXr/m32EAXEDX

46 2007Utasítások46-119 IDIV példák IDIV EBXEAX ← EDX:EAX div EBX; EDX ← EDX:EAX mod EBX IDIV word[eger]AX ← DX:AX div [eger]; DX ← DX:AX mod [eger], ahol eger egy 16 bites változó IDIV CLAL ← AX div CL; AH ← AX mod CL IDIV 1234hibás, mivel közvetlen operandus nem megengedett IDIV [SI]hibás, mivel az SI regiszter által mutatott változó mérete nem ismert, helyesen: IDIV byte [SI]AL ← AX div [SI]; AH ← AX mod [SI], ahol SI egy 8 bites változó címét tart. IDIV AX, BLhibás, mivel két operandust adtunk meg

47 2007Utasítások47-119 IDIV végrehajtása IDIV BL 15 87 0 AX1111111111101111 AX = –17 15 87 0 BXBX0110000000000011 BL = 3 15 87 0 AX1111111011111011 AL = –5 AH = –2

48 2007Utasítások48-119 CBW előjelhelyes kiterjesztés szóra (Convert byte to word) – az AL regiszter tartalmát előjelhelyesen kiterjeszti az AX regiszterre (az AL regiszter előjelbitjét átmásolja az AH regiszter minden bitjébe). előjeles osztás előtt használjuk, ha az osztandó csak az AL regiszterben van. CBW AX← AL előjelhelyes kiterjesztése nem módosítja a jelzőbiteket

49 2007Utasítások49-119 CBW végrehajtása CBW 15 87 0 AX1010111000000101 AL = 5 15 87 0 AX0000000000000101 AX = 5 15 87 0 AX1101010011111011 AL = –5 15 87 0 AX1111111111111011 AX = –5 CBW

50 2007Utasítások50-119 CWD előjelhelyes kiterjesztés duplaszóra (Convert word to doubleword) – 16 bites üzemmód – az AX regiszter tartalmát előjelhelyesen kiterjeszti a DX:AX regiszterpárra (az AX regiszter előjelbitjét átmásolja a DX regiszter minden bitjébe). előjeles osztás előtt használjuk, ha az osztandó csak az AX regiszterben van. CWD DX:AX← AX előjelhelyes kiterjesztése nem módosítja a jelzőbiteket

51 2007Utasítások51-119 CWDE előjelhelyes kiterjesztés dupla szóra (Convert word to doubleword) – 32 bites üzemmód – az AX regiszter tartalmát előjelhelyesen kiterjeszti az EAX regiszterre (az AX regiszter előjelbitjét átmásolja az EAX regiszter első 16 bitjébe). 32 bites előjeles osztás előtt használjuk, ha az osztandó csak az AX regiszterben van. CWDE EAX← AX előjelhelyes kiterjesztése nem módosítja a jelzőbiteket

52 2007Utasítások52-119 CDQ előjelhelyes kiterjesztés 8 byte-ra (Convert doubleword to quadword) – 32 bites üzemmód – az EAX regiszter tartalmát előjelhelyesen kiterjeszti a EDX:EAX regiszterpárra (az EAX regiszter előjel- bitjét átmásolja a EDX regiszter minden bitjébe). előjeles osztás előtt használjuk, ha az osztandó csak az EAX regiszterben van. CDQ EDX:EAX← EAX előjelhelyes kiterjesztése nem módosítja a jelzőbiteket

53 2007Utasítások53-119 NEG előjelcsere (Negate) a cél operandus 2-es komplementumát képezi, ami az előjel megváltoztatásának felel meg NEG cél cél ← 0 – cél jelzőbitek: –ha az operandus 0 a CF-et 0-ra, ellenkező esetben 1-re állítja; –az OF, SF, ZF, AF és PF értékét értelemszerűen állítja. lehetséges operandusok: – NEG r/m8 – NEG r/m16 – NEG r/m32

54 2007Utasítások54-119 NEG példák NEG BXBX ← 0 – BX NEG ECXECX ← 0 – ECX NEG [eger]hibás, mivel az operandus mérete nem ismert NEG word [eger]eger ← 0 – eger, ahol eger egy 16 bites változó NEG [BX]hibás, mivel az operandus mérete nem ismert NEG byte [BX][BX] ← 0 – [BX], ahol BX egy 8 bites változóra mutat NEG 1234hibás, közvetlen operandus nem megengedett

55 2007Utasítások55-119 INC Inkrementálás (Increment) – a cél operandus értékét eggyel növeli anélkül, hogy a CF-et módosítaná INC cél cél ← cél + 1 jelzőbitek: –CF-et nem módosítja. –OF, SF, ZF, AF és PF jelzőbitek értékét értelemszerűen állítja. lehetséges operandusok: –INC r/m8 –INC r/m16 –INC r/m32

56 2007Utasítások56-119 DEC dekrementálás (Decrement) – a cél operandus értékét eggyel csökkenti anélkül, hogy a CF-et módosítaná DEC cél cél ← cél – 1 jelzőbitek: –CF-et nem módosítja. –OF, SF, ZF, AF és PF jelzőbitek értékét értelemszerűen állítja. lehetséges operandusok: –DEC r/m8 –DEC r/m16 –DEC r/m32

57 2007Utasítások57-119 INC és DEC példák INC BXBX ← BX + 1 INC [eger]hibás, mivel az op. mérete nem ismert INC word [eger][eger] ←[eger] + 1, ahol eger 16 bites v. INC 1234hibás, mivel közvetlen op. nem megengedett DEC ECXECX ← ECX – 1 DEC [BX]hibás, mivel az op. mérete nem ismert DEC byte [BX][BX] ← [BX] – 1, ahol BX egy 8 bites változóra mutat DEC 1234hibás, mivel közvetlen op. nem megengedett

58 2007Utasítások58-119 CMP operandusok összehasonlítása (Compare) – a cél operandusból kivonja a forrás operandust és beállítja a jelzőbiteket anélkül, hogy a kivonás eredményét megjegyezné CMP cél, forrás temp ← cél – forrás módosított jelzőbitek: OF, SF, ZF, AF, CF és PF lehetséges operandusok – mint az ADD-nél

59 Logikai utasítások

60 2007Utasítások60-119 NOT Bitenkénti logikai tagadás (Logical bitwise not) – a cél operandust bitenként tagadja, azaz 1-es bitből 0, 0-ból 1-es lesz NOT cél cél ← NOT cél nem módosítja a jelzőbiteket lehetséges operandusok –NOT r/m8 –NOT r/m16 –NOT r/m32

61 2007Utasítások61-119 AND Bitenkénti logikai és (Logical bitwise and) – a két operandus bitenkénti konjunkcióját képezi. Egy bit értéke 1 lesz, ha mind a két megfelelő bit 1-es, különben 0. AND cél, forrás cél ← cél AND forrás jelzőbitek: –az OF és CF jelzőbiteket törli, –az SF, ZF és PF-et értelemszerűen állítja, –az AF változatlan marad lehetséges operandusok – mint az ADD-nél

62 2007Utasítások62-119 XOR Bitenkénti logikai kizáró vagy (Logical bitwise exclusive or) – a két operandus bitenkénti kizárólagos vagy-ot képezi. Egy bit értéke 0 lesz, ha a két megfelelő bit megegyezik, különben értéke 1. XOR cél, forrás cél ← cél XOR forrás jelzőbitek: –az OF és CF jelzőbiteket törli, –az SF, ZF és PF-et értelemszerűen állítja, –az AF változatlan marad lehetséges operandusok – mint az ADD-nél

63 2007Utasítások63-119 OR Bitenkénti logikai vagy (Logical bitwise or) – a két operandus bitenkénti diszjunkcióját képezi. Egy bit értéke 0 lesz, ha mind a két megfelelő bit 0, különben értéke 1. OR cél, forrás cél ← cél OR forrás jelzőbitek: –az OF és CF jelzőbiteket törli, –az SF, ZF és PF-et értelemszerűen állítja, –az AF változatlan marad lehetséges operandusok – mint az ADD-nél

64 2007Utasítások64-119 TEST Bitenkénti logikai teszt (Logical bitwise test) – bitenkénti AND utasítást végez, beállítja a jelzőbiteket, de az eredményt nem jegyzi meg. TEST cél, forrás temp ← cél AND forrás jelzőbitek: –az OF és CF jelzőbiteket törli, –az SF, ZF és PF-et értelemszerűen állítja, –az AF változatlan marad lehetséges operandusok – mint az ADD-nél

65 2007Utasítások65-119 AND és XOR végrehajtása AND AX, BX 15 87 0 AX1010111000000101 15 87 0 BX0110010001001100 15 87 0 AX0010010000000100 15 87 0 AX1100101001001001 XOR AX, BX

66 2007Utasítások66-119 Logikai utasítások alkalmazása regiszter nullázása: XOR AL,AL adott bitek értékének módosítása – megfelelő maszk használata bitek lenullázása AND BL,0DEh – 0 és 5-ös bit nullázása 7 BL 07507 BL 0 01101011 AND 1101111001001010 7 AL 07 AL 07 AL 0 01101011 XOR 0110101100000000

67 2007Utasítások67-119 Logikai utasítások alkalmazása bitek beállítása OR BL,28h – 3 és 5-ös bit beállítása bitek invertálása XOR BL,70h– 4, 5 és 6-os bit invertálása adott bit lekérdezése TEST BL,10h– 4-es bit lekérdezése 7 BL 075307 BL 0 01001011 OR 0010100001101011 7 BL 0740 ZF 01101011 TEST 000100001 7 BL 0765407 BL 0 01101011 XOR 0111000000011011

68 2007Utasítások68-119 Eltolások és forgatások az operandust jobbra vagy balra eltolja vagy elforgatja az eltolás értéke a 80386-os processzorig csak 1 lehet, de akkor is ki kell írni ha több pozícióval akarunk eltolni vagy forgatni az eltolás (forgatás) mértékét a CL regiszterben lehet megadni

69 2007Utasítások69-119 SHR Bitek eltolása jobbra (Shift right) – a cél operandus bitjeit jobbra tolja a második operandus által megadott pozicióval, a legmagasabb helyiértékű bit 0 lesz, az utolsó kifutó bit a CF-be kerül (előjel nélküli osztás 2 i ) SHR cél, számláló cél ← cél eltolt értéke jelzőbitek: –CF az utolsó kifutó bitet jegyzi meg, –az SF, ZF és PF-et értelemszerűen állítja, –OF-et csak az 1 bites művelet állítja, az eredeti operandus legmagasabb helyiértékű bitjére –az AF változatlan marad

70 2007Utasítások70-119 SHR lehetséges operandusok SHR r/m8,1 SHR r/m8,CL SHR r/m8,imm8 SHR r/m16,1 SHR r/m16,CL SHR r/m16,imm8 SHR r/m32,1 SHR r/m32,CL SHR r/m32,imm8 végrehajtás 15 87 0CF 01010111000000101 x 15 87 0CF 0101011100000010 1

71 2007Utasítások71-119 SHL Bitek eltolása balra (Shift left) – a cél operandus bitjeit balra tolja a második operandus által megadott pozicióval, a legalacsonyabb helyiértékű bit 0 lesz, az utolsó kifutó bit a CF-be kerül (szorzás 2 i -nel) SHL cél, számláló cél ← cél eltolt értéke jelzőbitek: –CF az utolsó kifutó bitet jegyzi meg, –az SF, ZF és PF-et értelemszerűen állítja, –OF-et csak az 1 bites művelet állítja, 0 lesz, ha az eredeti operandus legmagasabb helyiértékű két bitjére megegyezik –az AF változatlan marad

72 2007Utasítások72-119 SHL lehetséges operandusok SHL r/m8,1 SHL r/m8,CL SHL r/m8,imm8 SHL r/m16,1 SHL r/m16,CL SHL r/m16,imm8 SHL r/m32,1 SHL r/m32,CL SHL r/m32,imm8 végrehajtás CF15 87 0 x10101110000001010 CF15 87 0 10101110000001010

73 2007Utasítások73-119 SAR Bitek aritmetikai eltolása jobbra (Shift arithmetic right) – a cél operandus bitjeit jobbra tolja a második operandus által megadott pozicióval, az előjel bitet ismétli, az utolsó kifutó bit a CF-be kerül (előjeles osztás 2 i -nel) SAR cél, számláló cél ← cél eltolt értéke jelzőbitek: –CF az utolsó kifutó bitet jegyzi meg, –az SF, ZF és PF-et értelemszerűen állítja, –OF-et csak az 1 bites művelet állítja, az eredeti operandus legmagasabb helyiértékű bitjére –az AF változatlan marad

74 2007Utasítások74-119 SAR lehetséges operandusok SAR r/m8,1 SAR r/m8,CL SAR r/m8,imm8 SAR r/m16,1 SAR r/m16,CL SAR r/m16,imm8 SAR r/m32,1 SAR r/m32,CL SAR r/m32,imm8 végrehajtás 15 87 0CF 1010111000000101 x 15 87 0CF 1101011100000010 1

75 2007Utasítások75-119 SAL megegyzik SHL-lel (szorzásnál nincs különbség az előjeles és előjel nélküli művelet között)

76 2007Utasítások76-119 ROR Bitek forgatása jobbra (Rotate right) – a cél operandus bitjeit jobbra forgatja a második operandus által megadott pozicióval, az utolsó kifutó bit a CF-be kerül ROR cél, számláló cél ← cél elforgatott értéke jelzőbitek: –CF az utolsó kifutó bitet jegyzi meg, –OF-et csak az 1 bites művelet állítja, XOR az eredeti operandus legmagasabb helyiértékű két bitjére –az SF, ZF, AF és PF változatlan marad

77 2007Utasítások77-119 ROR lehetséges operandusok ROR r/m8,1 ROR r/m8,CL ROR r/m8,imm8 ROR r/m16,1 ROR r/m16,CL ROR r/m16,imm8 ROR r/m32,1 ROR r/m32,CL ROR r/m32,imm8 végrehajtás 15 87 0CF 1010111000000101 x 15 87 0CF 1101011100000010 1

78 2007Utasítások78-119 ROL Bitek forgatása balra (Rotate left) – a cél operandus bitjeit balra forgatja a második operandus által megadott pozicióval, az utolsó kifutó bit a CF-be kerül ROL cél, számláló cél ← cél elforgatott értéke jelzőbitek: –CF az utolsó kifutó bitet jegyzi meg, –OF-et csak az 1 bites művelet állítja, XOR az eredmény legmagasabb helyiértékű bitje és az új CF –az SF, ZF, AF és PF változatlan marad

79 2007Utasítások79-119 ROL lehetséges operandusok ROL r/m8,1 ROL r/m8,CL ROL r/m8,imm8 ROL r/m16,1 ROL r/m16,CL ROL r/m16,imm8 ROL r/m32,1 ROL r/m32,CL ROL r/m32,imm8 végrehajtás CF15 87 0 x1010111000000101 CF15 87 0 10101110000001011

80 2007Utasítások80-119 RCR Bitek forgatása átviteljelzőn át jobbra (Rotate through carry right) – a cél operandus CF-fel kiegészített bitjeit jobbra forgatja a második operandus által megadott pozicióval végrehajtás 15 87 0CF 1010111000000101 x 15 87 0CF x101011100000010 1

81 2007Utasítások81-119 RCL Bitek forgatása átviteljelzőn át balra (Rotate through carry left) – a cél operandus CF-fel kiegészített bitjeit balra forgatja a második operandus által megadott pozicióval végrehajtás CF15 87 0 x1010111000000101 CF15 87 0 1010111000000101x

82 2007Utasítások82-119 Karakterlánc-feldolgozó utasítások az operandusokat nem kell megadni forrásoperandus címe a DS:(E)SI regiszterpárban céloperandus címe az ES:(E)DI regiszterpárban az SI ill. DI regisztereket értelemszerűen, automatikusan módosítják (növelik vagy csökkentik) 1-, 2- vagy 4-gyel a DF kapcsolóbit mutatja meg a feldolgozás irányát (az elejétől a vége felé,vagy a végétől az eleje felé haladva) byte, szó illetve duplaszó változat, a mnemonikus kód utolsó betűje B, W vagy D egy utasítás a karakterlánc egy elemét dolgozza fel a teljes lánc feldolgozásához a REP előtag szükséges

83 2007Utasítások83-119 MOVSB, MOVSW, MOVSD Karakterlánc másolása (Move from string to string) – a DS:(E)SI címen levő byte-ot, szót vagy duplaszót átmásolja az ES:(E)DI címre, majd megfelelően módosítja az SI és DI regisztereket [ES:(E)DI] ← [DS:(E)SI] az SI és DI regiszterek módosítása nem állítja a jelzőbiteket

84 2007Utasítások84-119 CMPSB, CMPSW, CMPSD Karakterláncok összehasonlítása (Compare strings) – a cél operandusból kivonja a forrás operandust és beállítja a jelzőbiteket anélkül, hogy a kivonás eredményét megjegyezné temp ← [ES:(E)DI] – [DS:(E)SI] az SI és DI regiszterek módosítása módosított jelzőbitek: OF, SF, ZF, AF, CF és PF

85 2007Utasítások85-119 LODSB, LODSW, LODSD Karakterlánc betöltése (Load string) – a DS:(E)SI címen levő byte-ot, szót vagy duplaszót betölti az AL, AX vagy EAX regiszterbe, majd megfelelően módosítja az SI regisztert AL ← [DS:(E)SI]LODSB AX ← [DS:(E)SI]LODSW EAX ← [DS:(E)SI]LODSD az SI regiszter módosítása nem állítja a jelzőbiteket

86 2007Utasítások86-119 STOSB, STOSW, STOSD Karakterlánc mentése (Store string) – az AL, AX vagy EAX regisztert kimenti az ES:(E)DI címre, majd megfelelően módosítja a DI regisztert [ES:(E)DI] ← AL STOSB [ES:(E)DI] ← AX STOSW [ES:(E)DI] ← EAX STOSD a DI regiszter módosítása nem állítja a jelzőbiteket

87 2007Utasítások87-119 SCASB, SCASW, SCASD Keresés karakterláncban (Scan string) – az AL, AX vagy EAX regiszter tartalmát összehasonlítja az ES:(E)DI címen levő byte-tal, szóval vagy duplaszóval, beállítja a jelzőbiteket, majd megfelelően módosítja a DI regisztert temp ← AL – [ES:(E)DI] SCASB temp ← AX – [ES:(E)DI] SCASW temp ← EAX – [ES:(E)DI] SCASD a DI regiszter módosítása módosított jelzőbitek: OF, SF, ZF, AF, CF és PF

88 2007Utasítások88-119 STD irányjelző bit beállítása (Set direction flag) – 1-re állítja az irányjelző bitet DF ← 1 a többi jelzőbit változatlan marad a karakterláncok feldolgozását befolyásolja, a string végétől halad az eleje felé a string műveletek csökkentik az SI illetve DI regiszter tartalmát

89 2007Utasítások89-119 CLD irányjelző bit törlése (Clear direction flag) – 0-ra állítja az irányjelző bitet DF ← 0 a többi jelzőbit változatlan marad a karakterláncok feldolgozását befolyásolja, a string elejétől halad a vége felé (alapértelmezés) a string műveletek növelik az SI illetve DI regiszter tartalmát

90 2007Utasítások90-119 REP Karakterlánc-művelet ismétlés előtag (Repeat prefix) REP sművelet Amíg CX  0 ismételd sművelet CX ← CX – 1 Amíg vége Példa – karakterlánc másolása: MOV SI, a MOV DI, b MOVCX, 5 REPMOVSB

91 2007Utasítások91-119 REPE / REPZ Ismétlés, ha ZF = 1 (Repeat if equal / zero) REPE sművelet REPZ sművelet Amíg CX  0 ismételd sművelet CX ← CX – 1 Ha ZF = 0 Kilép amíg Amíg vége Példa – első különböző karakter megkeresése: MOV SI, a MOV DI, b MOVCX, 25 REPECMPSB

92 2007Utasítások92-119 REPNE / REPNZ Ismétlés, ha ZF = 0 (Repeat if not equal / not zero) REPNE sművelet REPNZ sművelet Amíg CX  0 ismételd sművelet CX ← CX – 1 Ha ZF = 1 Kilép amíg Amíg vége Példa – első „a” betű megkeresése: MOV DI, s MOVCX, 25 MOVAL, 61h REPNESCASB

93 2007Utasítások93-119 Végrehajtás-vezérlő utasítások

94 2007Utasítások94-119 Ugró utasítások Az IP (EIP) illetve CS regiszterek tartalmát módosítják lehetnek –rövid (short) – relatív ugrás, az (E)IP regiszterhez előjel- helyesen hozzáadja az operandusként szereplő közvetlen értéket (8 bit, ugrás előre max 127, vagy vissza max 128 byte) –közeli (near) – a megadott cím ugyanabban a szegmensben van, csak az (E)IP regisztert módosítja relatív – az (E)IP regiszterhez előjel-helyesen hozzáadja az operandus- ként szereplő közvetlen értéket (2 vagy 4 byte) abszolut – indirekt, a regiszterben vagy memóriában megadott címet betölti az (E)IP regiszterbe –távoli (far) – egy másik szegmensbe történő ugrás, a CS és (E)IP regisztereket módosítja a címet megadhatjuk címkével (relatív ugrás esetén is) vagy regiszter vagy memória operandusként.

95 2007Utasítások95-119 JMP Feltétel nélküli ugrás (Unconditional jump) – a vezérlést átadja a program egy más pontjára JMP cím shortnearfar JMP rel8JMP rel16JMP ptr16:16 JMP rel32JMP ptr16:32 JMP r/m16JMP m16:16 JMP r/m32JMP m16:32

96 2007Utasítások96-119 Jcc Feltételes ugrás (Jump if Condition Is Met) – ugrás, ha a jelzőbitek megfelelően vannak beállítva csak relatív ugrás lehet előjel nélküli összehasonlítás: –JA– jump if aboveCF = 0 és ZF = 0 JNBE– jump if not below or equal –JAE– jump if above or equal CF = 0 JNB– jump if not below JNC– jump if not carry –JB– jump if below CF = 1 JNAE– jump if not abive or equal JC– jump if carry –JNA– jump if not above CF = 1 vagy ZF = 1 JBE– jump if below or equal

97 2007Utasítások97-119 Jcc előjeles összehasonlítás –JG – jump if greater ZF = 0 és SF = OF JNLE– jump if not less or equal –JGE – jump if greater or equal SF = OF JNL– jump if not less –JL– jump if less SF  OF JNGE– jump if not greater or equal –JLE– jump if less or equal ZF = 1 vagy SF  OF JNG– jump if not greater egyenlőség –JZ – jump if zero ZF = 1 JE– jump if equal –JNZ– jump if not zero ZF = 0 JNE– jump if not equal

98 2007Utasítások98-119 Jcc egyes jelzőbitek ellenőrzése –JO– jump if overflowOF = 1 –JNO – jump if not overflow OF = 0 –JS– jump if signSF = 1 –JNS – jump if not signSF = 0 –JP– jump if parityPF = 1 JPE– jump if parity even –JNP– jump if not parityPF = 0 JPO– jump if parity odd CX regiszter ellenőrzése –JCXZ– jump if CX reg. is zero CX = 0 –JECXZ– jump if ECX reg. is zero ECX = 0

99 2007Utasítások99-119 LOOP Ciklus (Loop) – ciklusszervező utasítás, csökkenti a CX regisztert, amennyiben nem nulla a címkére ugrik csak short ugrás lehet (rövid relatív) LOOP címke CX ← CX – 1 Ha CX  0 akkor IP ← IP + d Nem állítja a jelzőbiteket

100 2007Utasítások100-119 LOOPZ / LOOPE Ciklus, ha ZF = 1 (Loop if zero / equal) – feltételes ciklusszervező utasítás, csökkenti a CX regisztert, amennyiben CX nem nulla és ZF = 1 a címkére ugrik csak short ugrás lehet (rövid relatív) LOOPZ címke LOOPE címke CX ← CX – 1 Ha CX  0 és ZF = 1 akkor IP ← IP + d Nem állítja a jelzőbiteket

101 2007Utasítások101-119 LOOP példa adjuk össze egy t tömb első 20 elemét tresw100  mov CX,20 movBX,t xorAX,AX ciklus: addAX, [BX] incBX loopciklus

102 2007Utasítások102-119 LOOPNZ / LOOPNE Ciklus, ha ZF = 0 (Loop if not zero / not equal) – feltételes ciklusszervező utasítás, csökkenti a CX regisztert, amennyiben CX nem nulla és ZF = 0 a címkére ugrik csak short ugrás lehet (rövid relatív) LOOPNZ címke LOOPNE címke CX ← CX – 1 Ha CX  0 és ZF = 0 akkor IP ← IP + d Nem állítja a jelzőbiteket

103 2007Utasítások103-119 Eljárások (1) eljáráshíváskor feltétel nélküli ugrás az eljárás első utasítására (belépési pont) a visszatérési cím megjegyzésével lehet közeli (szegmensen belüli), vagy távoli (más szegmens) eljáráshívás a visszatérési cím a verembe kerül –közeli hívás – a következő utasítás offsetje (IP regiszter), –távoli hívás –a szegmensregiszter (CS) és az IP regiszter

104 2007Utasítások104-119 Eljárások (2) visszatéréskor feltétel nélküli ugrás a veremben megjegyzett címre (IP, illetve CS:IP regiszter betöltése a veremből) a paramétereket átadhatjuk regiszterekben vagy a veremben (címzés a BP regiszter segítségével) az eljárásban verembe mentett értékeket az eljárás befejezése előtt el kell távolítani a veremből (visszatéréskor a verem tetején a visszatérési cím legyen)

105 2007Utasítások105-119 CALL Eljárás hívása (Procedure call) CALL cím PUSH (E)IPPUSH CS (E)IP ← címPUSH (E)IP CS ← seg cím (E)IP ← offset cím az operandusok lehetnek: közeli hívás CALL rel16 CALL rel32 CALL r/m16 CALL r/m32 távoli hívás CALL ptr16:16 CALL ptr16:32 CALL m16:16 CALL m16:32

106 2007Utasítások106-119 RET / RETN Visszatérés közeli eljárásból (Return near) – feltétel nélküli ugrás a veremben megjegyzett közeli címre RETRETN RET nRETN n (E)IP ← POP () (E)SP ← (E)SP + n

107 2007Utasítások107-119 RETF Visszatérés távoli eljárásból (Return far) – feltétel nélküli ugrás a veremben megjegyzett távoli címre RETF RETF n (E)IP ← POP () CS ← POP () (E)SP ← (E)SP + n

108 2007Utasítások108-119 INT Megszakítás generálása (Interrupt) – távoli hívás a megszakításvektor megfelelő elemére a verembe menti a flageket INT n PUSH Eflags[15:0] IF ← 0 (* interrupt flag törlése*) TF ← 0 (* trap flag törlése *) AC ← 0 (*AC flag törlése *) PUSH CS PUSH IP CS ← IDT(Descriptor (n * 4), selector)); EIP ← IDT(Descriptor (n * 4), offset));

109 2007Utasítások109-119 INTO Túlcsordulás megszakítás generálása (Interrupt on overflow) – a 4-es megszakítást generálja, ha az OF be van állítva

110 2007Utasítások110-119 IRET Visszatérés megszakításból (Interrupt return) IRET (E)IP ← POP () CS ← POP () Eflags[15:0] ← POP()

111 2007Utasítások111-119 STI Megszakítás-engedélyező bit beállítása (Set interrupt flag) IF ← 1 a többi jelzőbit változatlan marad engedélyezi a külső maszkolható megszakításokat a következő utasítás végrehajtása után

112 2007Utasítások112-119 CLI Megszakítás-engedélyező bit törlése (Clear interrupt flag) IF ← 0 a többi jelzőbit változatlan marad letiltja a külső maszkolható megszakításokat

113 2007Utasítások113-119 Különféle utasítások

114 2007Utasítások114-119 STC Átviteljelző bit beállítása (Set carry flag) CF ← 1 a többi jelzőbit változatlan marad általában alprogramokból való visszatéréskor hibák jelzésére használjuk

115 2007Utasítások115-119 CLC Átviteljelző törlése (Clear carry flag) CF ← 0 a többi jelzőbit változatlan marad

116 2007Utasítások116-119 CMC Átviteljelző bit komplementálása (Complement carry flag) CF ← NOT CF a többi jelzőbit változatlan marad

117 2007Utasítások117-119 NOP Üres utasítás (No operation)

118 2007Utasítások118-119 HLT Utasítások végrehajtásának felfüggesztése (Halt)

119 2007Utasítások119-119 Forrás Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2A: Instruction Set Reference, A-M http://www.intel.com/design/processor/manuals/253666.pdf Volume 2B: Instruction Set Reference, N-Z http://www.intel.com/design/processor/manuals/253667.pdf


Letölteni ppt "Számítógép architektúra Utasítások – valós üzemmód."

Hasonló előadás


Google Hirdetések