INTEL 8088-80386 -------------------------------- Symbolisen konekielen opas 0.01ÿÿ -------------------------------- -------------------------------------------------- ***** * * **** * * * * ***** * ** * * * * * * * * * ***** * * * *** * * * * * **** * ** * * * * * * * ** * ***** **** **** ***** * * * ***** Kirjoittanut: JUHA YL™NEN Voitte ilmoittaa mielipiteenne t„st„ oppaasta Bugline XXBBS:„„n P. 941 - 283158, avoinna klo 20 - 08 tai kirjoittaa osoitteeseen: JUHA YL™NEN KULOTTAJANTIE 1E 72 40340 JYVŽSKYLŽ --------------------------------------------------- HAKEMISTO ESIPUHE ............................................. 0.0.0 Merkint„tapa .................................... 0.1.0 PERUSTIETOA ......................................... 1.0.0 Yleiset rekisterit .............................. 1.1.0 Datatyypit .................................. 1.1.1 Osoitusmuodot ............................... 1.1.2 Muistinosoitusj„rjestelm„ ................... 1.1.3 Osoittimet .................................. 1.1.4 Indeksirekisterit ........................... 1.1.5 Segmenttirekisterit ............................. 1.2.0 Koodisegmentti .............................. 1.2.1 Datasegmentti ............................... 1.2.2 Pinosegmentti ............................... 1.2.3 Erikoissegmentti ............................ 1.2.4 Liput ........................................... 1.3.0 Bin„„rilukuj„rjestelm„........................... 1.3.1 KŽSKYT .............................................. 2.0.0 I/O Osoitteet ....................................... 3.0.0 0.0.0 ESIPUHE T„st„ on toivottavasti apua niille, jotka eiv„t ole koskaan olleet miss„„n tekemisiss„ symbolisen konekielen kanssa. 0.1.0 Merkint„tapa Lukujen per„ss„ saattaa esiinty„ kirjaimet b, d tai h. Jos luvun per„ss„ EI ole mit„„n kirjainta, on se silloin normaalissa desimaalimuodossa. 'h' kirjain tarkoittaa heksadesimaalilukua ja 'b' bin„„„rilukua. L„hes kaikissa k„skyiss„ miss„ on kaksi osapuolta, on ensimm„inen aina kohde ja toinen l„hde esim. MOV AX,BX BX:n sis„lt” kopioidaan AX:„„n. K„yskyjen ohessa esiintyv„ "Aika" on suhteellinen suoritusaika, kelpa vain vertaitavaksi muihin k„skyihin. 1.0.0 PERUSTIETOA 1.1.0 Yleiset rekisterit 8088 sis„lt„„ 4 kpl 16:sta bitin rekisteri„, joita voidaan my”s k„ytt„„ kahdeksan bitin rekisterein„: ÚÄÄÄ AH Rekisterit ovat siis 16- AX ÄÄ´ Accumulator bittisi„ ja ne voidaan ÀÄÄÄ AL jakaa 'alempaan' tavuun ÚÄÄÄ BH ja 'ylemp„„n' tavuun, jotka BX ÄÄ´ Base ovat 8-bittisi„ lukuja. ÀÄÄÄ BL ÚÄÄÄ CH Esim. luvun 1234h alempi tavu CX ÄÄ´ Count on 34h ja ylempi tavue 12h. ÀÄÄÄ CL ÚÄÄÄ DH Mm. Turbo Pascalissa on DX ÄÄ´ Data funktiot Lo ja Hi tavujen ÀÄÄÄ DL laskemiseen. 1.1.1 Datatyypit Nimi Koko Engl. Pascal ----------------------------------------------------------- Bitti 1 bitti„ Bit Tavu 8 bitti„ Byte Byte Sana 16 bitti„ Word Word Kaksoissana 32 bitti„ Doubleword Longint Tavujono n tavua Sanajono n sanaa 1.1.2 Osoitusmuodot Nimi Esimerkki ----------------------------------------------------------- Itseisosoitus MOV AH, 16 Rekisteriosoitus MOV DS, AX Suora osoitus MOV AX, DATA Ep„suora rekisteriosoitus MOV AX, [BX] Suhteellinen osoitus LEA [BX]+3 Suhteellinen osoitus LEA 3[BX] suhteellinen osoitus LEA [BX+3] Indeksoitu suora osoitus MOV AX, DATA[SI] Indeksoitu perusosoitus MOV AX, ALKIO[BX][DI] 1.1.3 Muistinosoitusj„rjestelm„ 20-bittinen osoite muodostetaan kahdesta 16 bitin luvusta, jotka ovat segmentti (segment) ja siirros (offset). Segmenttirekisteri sis„lt„„ luvun, joka kerrottuna 16:lla osoittaa ns. pohjaosoitteen (base address). Segmentti- rekisterin osoittamaan pohjaosoitteeseen lis„t„„n toinen 16-bittinen luku (siirros), joka osoittaa muistipaikkaa segmentin sis„ll„. Muistia osoitetaan 64 kilotavun segmenttein„ sill„ 65535 tai FFFFh (64k) on suurin arvo, jonka 16-bittinen luku pystyy ilmaisemaan. (16 * Segmenttirekisteri) + Siirros = Fyysinen osoite       ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ 16 16 20 Esim. datasegmentiss„ oleva muistipaikka "PAIKKA" ("PAIKKA" = 16-bittinen osoite) 7 0 ------ ---------------- 0 -------------------- | | | | | | | | 16*DS+"PAIKKA"| | | __ 16*DS | | | | / | | | | / | | |--------------| <------- | | | | | | | | "PAIKKA" | | | ______ |______________| | 64Kb | 1Mb |--------------| | | | | | | | | | | |--------------| -------- | | | | | | | | | | | | | | | | ---------------- FFFF -------------------- 1.1.4 Osoittimet Nimi ----------------------------------------------------------- Pino-osoitin Stack pointer SP 'Pohja'-osoitin Base pointer BP Ohjelmalaskuri Instruction pointer IP 1.1.5 Indeksirekisterit Nimi ----------------------------------------------------------- Source Index L„hdeindeksi SI Destination Index Kohdeindeksi DI 1.3.1 Bin„„rilukuj„rjestelm„ Jotta voisi tehd„ ohjelmia symboolisella konekielell„ on osattava muuttaa numerotietoja eri lukuj„rjestelmien v„lill„, l„hinn„ desimaali, bin„„ri, hexadesimaali. Bin„„rilukujen painoarvot (16bit): 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À---- 1 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À------- 2 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À---------- 4 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À------------- 8 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À---------------- 16 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À------------------- 32 ³ ³ ³ ³ ³ ³ ³ ³ ³ À---------------------- 64 ³ ³ ³ ³ ³ ³ ³ ³ À------------------------- 128 ³ ³ ³ ³ ³ ³ ³ À---------------------------- 256 ³ ³ ³ ³ ³ ³ À------------------------------- 512 ³ ³ ³ ³ ³ À---------------------------------- 1024 ³ ³ ³ ³ À------------------------------------- 2048 ³ ³ ³ À---------------------------------------- 4096 ³ ³ À------------------------------------------- 8192 ³ À---------------------------------------------- 16384 À------------------------------------------------- 32768 Hexadesimaalilukujen painoarvot (16bit): 0 1 2 3 4 5 6 7 8 9 A B C D E F ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À---- 15 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À------- 14 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À---------- 13 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À------------- 12 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À---------------- 11 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ À------------------- 10 ³ ³ ³ ³ ³ ³ ³ ³ ³ À---------------------- 9 ³ ³ ³ ³ ³ ³ ³ ³ À------------------------- 8 ³ ³ ³ ³ ³ ³ ³ À---------------------------- 7 ³ ³ ³ ³ ³ ³ À------------------------------- 6 ³ ³ ³ ³ ³ À---------------------------------- 5 ³ ³ ³ ³ À------------------------------------- 4 ³ ³ ³ À---------------------------------------- 3 ³ ³ À------------------------------------------- 2 ³ À---------------------------------------------- 1 À------------------------------------------------- 0 Esim. Otetaan luku 1001110101001011 joka pit„„ muuttaa desimaaliluvuksi, lasketaan bin„„riluvun niitten kohtien painoarvot yhteen miss„ on "1" seuraavasti: 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 32768+0+0+4096+2048+1024+0+512+0+128+0+0+8+0+2+1 = 40267d Kun muutetaan Hexadesimaaliseksi ko. bin„„riluku niin menetell„„n seuraavasti, jaetaan bin„„riluku nelj„n bitin ryhmiin ja lasketaan 4-bitin painoarvot yhteen ja muutetaan luku hexadesimaaliseen muotoon: ³1001³1101³0100³1011³ ³ ³ ³ ³ ³ ³ ³ À---> 8+0+2+1 = 11d = Bh ³ ³ À--------> 0+4+0+0 = 4d = 4h ³ À-------------> 8+4+0+1 = 13d = Dh À------------------> 8+0+0+1 = 9d = 9h Saatiin hexaluku 9E4Ah = 40267d = 1001110101001011b ----------------------------------------------------------- 1.2.0 Segmenttirekisterit Segmenttirekistereit„ on nelj„ kappaletta ja ne ovat kaikki 16-bittisi„: CS Code Segment Koodisegmentti DS Data Segment Datasegmentti SS Stack Segment Pinosegmentti ES Extra Segment Erikoissegmentti Eri segmenttien k„ytt”tarkoituksia voidaan sekoittaa keske- n„„n, mutta t„ytyy olla tarkkana! Kannattaa yleens„ k„ytt„„ segmenttej„ niiden oikeisiin tarkoituksiin. 1.2.1 Koodisegmentti CS osoittaa koodisegmenttiin, jossa varsinainen ohjelma- koodi sijaitsee. Seuraavan k„skyn osoite = 16*CS+IP. CS voidaan my”s esitt„„ muodossa CS:IP. Koodisegmentti alustetaan assemblerk„skyll„ END[startaddress]. 1.2.2 Datasegmentti DS osoittaa datasegmenttiin, jossa ohjelman k„ytt„m„ data sijaitsee. Datasegmentiss„ sijaitsevan muistipaikan DS:"PAIKKA" todellinen osoite saadaan kertomalla DS 16:lla ja lis„„m„ll„ "PAIKKA" tuloon, eli todellinen osoite = 16*DS+"PAIKKA". Alustetaan k„skyll„ MOV AX,[XXXX] MOV DS,AX [XXXX] = 16-bittinen luku Turbo Assemblerissa (v1.0) voidaan osoittaa datasegmenttiin seuraavasti: MOV DX,@DATA MOV DS,DX DS on yleens„ koodisegmentin viereinen segmentti. 1.2.3 Pinosegmentti SS osoittaa pinosegmenttiin, joka alustetaan automaatti- sesti. Sit„ voidaan tarvittaessa my”s muuttaa. Ensimm„inen k„ytt„m„t”n paikka pinossa on SS:SP. 1.2.4 Erikoissegmentti ES segmentti„ voidaan k„ytt„„ vapaavalintaisiin teht„viin, mutta se t„ytyy alustaa ennen k„ytt”„. 1.3.0 Liput Liput ovat yleens„ apuna erilaisissa laskutoimituksissa ja ne voivat olla ylh„„ll„ tai alhaalla. Ne toimivat automaattisesti, mutta niiden arvoa voidaan muuttaa erikseen niille varatuilla k„skyill„. CF: Muistilippu. Jos yhteenlaskussa syntyy muistinumero tai v„hennyslaskussa lainaus, lippu nousee. PF: Pariteettilippu. Jos tuloksen ykk”sten lukum„„r„ on parillinen, lippu nousee. AF: Apumuistilippu. Jos yhteenlaskussa syntyy muistinumero bitist„ 3 bittiin 4, lippu nousee. K„ytet„„n ainoastaan BCD lukujen yhteenlaskussa, joten t„m„n perusteella ei suoriteta haarautumisia. ZF: Nollalippu (Zero Flag). Jos suoritetun k„skyn tulos on nolla, lippu nousee. Esim. XOR AL,AL. SF: Etumerkkilippu. Jos operaation tuloksen eniten merkit- sev„ bitti (MSB = Most significant bit) on yksi, lippu nousee. OF: Ylivuotolippu (Overflow Flag). TF, IF, DF: Vaikuttavat suoraan prosessorin toimintaan: TF:n (Trace Flag) ollessa ylh„„ll„ prosessori toimii askeltaen. IF:n (Interrupt Flag) ollessa ylh„„ll„ ulkoiset keskeytykset sallitaan, muutoin kiellet„„n. Kts. STI ja CLI. DF:n ollessa ylh„„ll„ v„hennet„„n SI tai DI rekistereit„ automaattisesti, muutoin lis„t„„n automaatisesti. Kts. STD ja CLD. IOPL, NT: Suojatun tilan kontrollointiin (386). 2.0.0 KŽSKYT Intel 8088=> prosessorien tuntemat k„skyt on lueteltu aakkosj„rjestyksess„. Jotkut komennot eiv„t v„ltt„m„tt„ toimi joidenkin DOS:in DEBUG versioiden kanssa, vaan saattavat n„ky„ oikein vain Turbo Debuggerissa tai Microsoftin CodeViewiss„. Otsikossa on komento ja sen alla k„skyn tarkoitus, liput, joita se k„ytt„„ ja tavu, joka on Se Lopullinen konekielinen koodi. Englannin- kielisess„ kirjallisuudessa on yleisesti k„yt”ss„ termi "opcode" joka vastaa t„ss„ heksadesimaalisessa muodossa ilmoitettua tavua. Joissain tapauksissa, esim. AAD, voi olla useampia tavuja. Muuta tietoa ovat k„skyn k„ytt”, mahdollisesti esimerkki, ja vastaavat komennot. ----------------------------------------------------------- AAA Tarkoitus: AL:n ASCII-tarkistus yhteenlaskun j„lkeen (ASCII Adjust AL After Addition) Liput: AF, CF Tavu: 37h Aika: 4 Esimerkki: K„sky„ k„ytet„„n ADD k„skyn j„lkeen, ADD palauttaa tuloksen AL rekisteriin, AAA muuttaa AL:n sis„ll”n kymmenluvuksi mik„li se t„ytt„„ tietyt ehdot. Jos AL:n nelj„ matalinta bitti„ muodostaa luvun v„lill„ 0 - 9 niin AL:n nelj„ ylimm„sit„ bitti„ nollataan, ja mik„li CF on yl„„ll„ niin lasketaan AF ja CF. Mik„li nelj„ alimmaista bitti„ muodostaa luvun joka on suurempi kuin 9 tai AF on yl„„ll„ niin AL rekisteriin lis„t„„n 6 ja AH:n 1, liput AF ja CF nostetaan ja AL:n nelj„ ylint„ bitti„ asetetaan nollaksi. MOV AL,06 ; AL = 06h ADD AL,09 AAA ----------------------------------------------------------- AAD Tarkoitus: Tarkistaa AX:n ennen jakolaskua (ASCII adjust AX beforre division) Liput: PF, SF, ZF Tavu: D5h 0Ah Aika: 19 Esimerkki: Muuttaa AX:n sis„lt”„ seuraavasti, AL = AL + (10 * AH) ja nollaa AH:n. MOV AX,1111h ; AX = 1111h AAD ----------------------------------------------------------- AAM Tarkoitus: Tarkistaa AX:n kertolaskun j„lkeen (ASCII Adjust AX After Multiply) Liput: SF, ZF, PF Tavu: D4h 0Ah Aika: 17 Esimerkki: Suoritetaan MUL k„skyn j„lkeen, k„sky jakaa AL:n sis„ll”n 10:ll„ siten ett„ eniten merkitsev„ numero tallettuu AH:n ja jakoj„„nn”s AL:„n. MOV AX,33h ; AX = 33h MUL 22h AMM ----------------------------------------------------------- AAS Tarkoitus: Tarkistaa AL:n v„hennyslaskun j„lkeen (ASCII Adjust AL After Subtraction) Liput: AF, CF Tavu: 3Fh Aika: 4 Esimerkki: Jos Al:n nelj„ alinta bitti„ muodostavat suuremman luvun kuin 9, tai AF on y l„„ll„ niin AL rekisterist„ v„hennet„„n 6 ja AH:ta 1, liput AF ja CF nostetaan. Muutoin AF ja CF lasketaan. AAS ----------------------------------------------------------- ADC Tarkoitus: Laskee yhteen kaksi lukua muistiluvun kanssa (Add with carry) Liput: OF, SF, ZF, AF, PF, CF Tavu: Aika: 2-7 Esimerkki: MOV AX,FFFFh ; AX = FFFFh MOV BX,0063h ; BX = 0063h ADC AX,BX AX:ss„ on operaation j„lkeen 0062h ja CF on noussut yl”s, eli se pit„„ lis„t„ 0062h:n eteen, ett„ saadaan oikea tulos eli 10062h. ----------------------------------------------------------- ADD Tarkoitus: Laskee yhteen kaksi lukua (ADDition) Liput: AF, CF, OF, PF, SF, ZF Tavu: Aika: 2-7 Esimerkki: MOV AX,1234h ; AX = 1234h MOV DX,3232h ; DX = 3232h ADD [DX],AX Lasketaan yhteen DX:n osoittaman muistipaikan (ofset) sis„lt” AX:n sis„ll”n kanssa, tulos (4466h) talletetaan DX:n osoittamaan muistipaikkaan. ----------------------------------------------------------- AND Tarkoitus: Suorittaa loogisen AND operaation kahden luvun v„lill„ (Logical AND) Liput: OF, CF, PF, SF, ZF Tavu: Aika: 2-7 Esimerkki: MOV AX,AAh ; AX = 00AAh MOV BX,63h ; BX = 0063h AND AX,BX Tulos palautuu AX-rekisteriss„ ja t„ss„ tapauksessa se on 22h. CF lippu on ylh„„ll„, eli kaikki kohdat miss„ AX:n ja BX:n bitit ovat tosia (1) palautetaan AX:„„n yhten„. 00100110b ; 38 01001101b ; 77 -------- 00000100b ; 4 * ----------------------------------------------------------- ARPL Tarkoitus: Tarkistaa EA-sanan RPL:n (Adjust RPL field if selector) Liput: ZF Tavu: Aika: 20-21 ----------------------------------------------------------- BOUND Tarkoitus: INT 5 generoidaan, ellei sanarekisteri ole rajojen sis„ll„ (Check array index against bounds) Liput: - Tavu: Aika: 10 ----------------------------------------------------------- BSF/BSR (386) Tarkoitus: Etsii 16 tai 32 bittisest„ luvusta bitti„ joka on asettunut 1:ksi (Scan bit forward/reverse) Liput: AF,CF,OF,PF,SF Tavu: Aika: 10+3*n n = scannaus kerrat ----------------------------------------------------------- BT/BTS/BTR/BTC (386) Tarkoitus: Suorittaa operaatioita yhdell„ bitill„ (Bit test/set/reset/complement) Liput: AF,CF,OF,PF,ZF Tavu: Aika: 13 ------------------------------------------------------------ CALL Tarkoitus: Kutsuu aliohjelmaa annetusta osoitteesta (Call a procedure) Liput: - Tavu: Aika: 3-275 Esimerkki: CALL 1010h Ohjelman suoritusta jatketaan osoitteesta 1010h. Ennenkuin hyp„t„„n ko. osoitteeseen talletetaan CALL k„sky„ seuraavan k„skyn osoite pinoon, jotta osataan jatkaa ohjelmaa aliohjelman j„lkeen. Aliohjelmasta palataan RET k„skyll„. ----------------------------------------------------------- CBW Tarkoitus: Muuttaa tavun sanaksi (Convert Byte into Word) Liput: - Tavu: 98h Aika: 3 Esimerkki: Muuttaa etumerkillisen tavul AL:ss„ etumerkilliseksi sanaksi AX:„„n. MOV AL,F5h ; AL = F5h CBW ----------------------------------------------------------- CLC Tarkoitus: Laskee CF:n alas (Clear Carry flag) Liput: CF Tavu: F8h Aika: 2 Esimerkki: CLC Katso: STC ----------------------------------------------------------- CLD Tarkoitus: Laskee DF:n alas (Clear Direction flag) Liput: DF Tavu: FCh Aika: 2 Esimerkki: Kasvattaa SI:t„ ja DI:t„ jokaisen suori- tuskerran j„lkeen. CLD Katso: STD ----------------------------------------------------------- CLI Tarkoitus: Laskee IF:n alas, est„„ keskeytykset (Clear Interrupt flag) Liput: IF=0 Tavu: FAh Aika: 3 Esimerkki: CLI Laskee IF:n alas ja est„„ samalla kaikki muut keskeytykset paitsi NMI (Non-Maskable Interrupt). Katso: STI ----------------------------------------------------------- CMC Tarkoitus: Ottaa komplementin CF:st„ (Complement Carry flag) Liput: CF Tavu: F5h Aika: 2 Esimerkki: CMC CF:n ollessa ylh„„ll„ CF lasketaan, muutoin nostetaan. ----------------------------------------------------------- CMP Tarkoitus: Vertaa kahta lukua (Compare two operands) Liput: OF, SF, ZF, AF, PF, CF Tavu: Aika: 2-6 Esimerkki: MOV AX,FFh ; AX = 00FFh MOV BX,DDh ; BX = 00DDh CMP AX,BX Vertaa AX:„„ BX:„„n (AX - BX). Vertailun tulos palautuu lipuissa: AX > BX PF = 1 AX = BX ZF = 1, PF = 1 AX < BX CF = 1, SF = 1, AF = 1 Esimerkiss„ PF nousee. ----------------------------------------------------------- CMPS/CMPSB/CMPSW Tarkoitus: Vertaa tavuha/sanoja ES:[DI] DS:[SI] tai ES:[EDI] DS:[ESI] (Compare string operands) Liput: AF,CF,OF,PF,SF,ZF Tavu: Aika: 10 Esimerkki: MOV SI,7676h ; SI = 7676h MOV DI,2121h ; DI = 2121h CMPS DS:BYTE PTR[SI],ES:[DI] Vertaa muistipaikan ES:SI sis„lt”„ muistipaikan DS:DI sis„lt””n. ----------------------------------------------------------- CWD Tarkoitus: Muuttaa sanan kaksoissanaksi (Convert Word to Doubleword) Liput: - Tavu: 99h Aika: 2 Katso: CBW ----------------------------------------------------------- DAA Tarkoitus: Tarkistaa AL:n desimaalit yhteenlaskun j„lkeen (Desimal adjust after addition) Liput: AF, CF, SF, ZF, PF Tavu: 27h Aika: 4 Esimerkki: MOV AL,5h ; AL = 5h ADD AL,6h DAA ADD k„skyn j„lkeen on AL:ss„ (Ah), DAA k„skyn j„lkeen on AL:ss„ (11d). Jos AL on suurempi kuin 9 tai, CF on yl„„ll„, lis„t„„n AL:„„n 6 ja AF nostetaan yl”s, muutoin AF lasketaan. Jos AL on suurempi luku kuin 9Fh, tai CF on yl„„ll„ niin AL:„„n lis„t„„n 60h ja CF nostetaan yl”s, muutoin CF lasketaan alas. ----------------------------------------------------------- DAS Tarkoitus: Tarkistaa AL:n desimaalit v„hennyslaskun j„lkeen (Desimal adjust AL after substraction) Liput: AF, CF, SF, PF, ZF Tavu: 2Fh Aika: 4 Esimerkki: MOV AL,11h ; AL = 11h SUB AL,3h DAS SUB k„skyn j„lkeen on AL:ss„ on (Eh), DAS k„skyn j„lkeen AL:ss„ on (8d). Jos AL on suurempi kun 9 tai, jos AF on yl„„ll„ niin AL:st„ v„hennet„„n 6 ja AF nostetaan yl”s. Jos AL on suurempi kun 9Fh tai, jos CF on ylh„„ll„, v„hennet„„n AL:st„ 60h ja CF nostetaan, muutoin CF lasketaan. ----------------------------------------------------------- DEC Tarkoitus: V„hent„„ lukua yhdell„ (Decrement by 1) Liput: SF, OF, ZF, AF, PF Tavu: Aika: 2-6 Esimerkki: MOV AX,34h ; AX = 0034h DEC AX V„hent„„ AX:„„ yhdell„ jolloin tulokseksi tulee 33h. ----------------------------------------------------------- DIV Tarkoitus: Suorittaa etumerkitt”m„n jakolaskun (Unsigned division) Liput: - Tavu: Aika: 14-41 Esimerkki: MOV AX,3333h ; AX = 3333h MOV BL,12h ; BL = 12h DIV BL Jos jakaja on tavu, jaetaan AX:n sis„lt” sill„ siten ett„ osam„„r„ tulee AL:„„n ja jakoj„„nn”s AH:n. Jos jakaja on sana, jaetaan DX:AX rekisteriparin muodostama sana, ylempi tavu on DX:ss„ ja alempi AX:ss„. ----------------------------------------------------------- ENTER Tarkoitus: Tekee pinokehyksen proseduuriparametrille (Make stack frame for procedure parameters) Liput: - Tavu: Aika: 10-19 Esimerkki: ----------------------------------------------------------- HLT Tarkoitus: Pys„ytt„„ ohjelman suorituksen (Halt) Liput: - Tavu: F4h Aika: 5 Esimerkki: HLT ----------------------------------------------------------- IBTS (386) Tarkoitus: Lis„„ bittej„ muistiin tai rekisteriin (Insert bit string) Liput: AF,CF,OF,PF,ZF Tavu: Aika: 19 ----------------------------------------------------------- IDIV Tarkoitus: Suorittaa etumerkillisen jakolaskun (Integer division (signed)) Liput: - Tavu: Aika: 19-42 DX:AX:n etumerkillinen jakolasku. Jos jakaja on tavu, jaetaan AX t„ll„ tavulla, jolloin jakoj„„nn”s menee AH:n ja osam„„r„ AL:„„n. Jos jakaja on sana niin jaetaan DX:AX:n muodostama luku jakajalla siten ett„ osam„„r„ menee AX:„„n ja jakoj„„nn”s DX:„„n. Esimerkki: MOV AX,AAAAh ; AX = AAAAh MOV CX,00FFh ; CX = 00FFh IDIV CX Tulos palautuu AX:ss„ ja t„ss„ tapauksessa se on BAh. MOV AX,5678h ; DX:AX = 12345678h MOV DX,1234h MOV CX,3333h ; CX = 3333h IDIV CX Tulos laskusta on 5B06h ja on AX-rekisteriss„. 386-koneilla voidaan k„ytt„„ 64-bittist„ jaettavaa ja jakaja on 32-bittinen. ----------------------------------------------------------- IMUL Tarkoitus: Suorittaa etumerkillisen kertolaskun (Integer multiply) Liput: OF, CF Tavu: Aika: 9-41 Esimerkki: MOV AX,0012h ; 0012h MOV CX,000Dh ; 000Dh IMUL CX ; CX * AX Tulos eli EAh on AX:ss„. Mik„li CF tai OF on alhaalla, on AL:n etumerkki AH:ssa. AX tai AL toimivat kertojina. ----------------------------------------------------------- IN Tarkoitus: Lukee I/O-portin AL:„„n tai AX:„„n (Input byte or word) Liput: - Tavu: Aika: 5-6 Esimerkki: MOV DX,2F8h ; DX = 02F8h IN AX,DX Kasky lukee COM2-tilan AX-rekisteriin. Jos halutaan k„ytt„„ yli FFh osoitteita, t„ytyy k„ytt„„ DX-rekisteri„ esimerkin mukaisesti apuna. IN AX,C0H Lukee DMA ohjaimen I/O portista AX:„„n. ----------------------------------------------------------- INC Tarkoitus: Lis„„ lukua yhdell„ (Increment by 1) Liput: AF,OF,PF,SF,ZF Tavu: Aika: 2-7 Esimerkki: MOV AX,ACh ; AX = 00ACh INC AX K„sky kasvattaa AX:n sis„lt”„ yhdell„ eli AX:ss„ on k„skyn j„lkeen ADh. ----------------------------------------------------------- INS/INSB/INSW Tarkoitus: Lukee I/O-portista sanan/tavun ES:DI n„ytt„m„„n muistipaikkaan (Input from to string) Liput: - Tavu: Aika: 5-8 Esimerkki: MOV DI,100h ; DI = 100h MOV DX,C9h ; DX = C9h INSB INS/INSB/INSW k„skyt lis„„/v„hent„„ DI:n sis„lt”„ jokaisella suorituskerralla. Jos DF on ylh„„ll„ niin DI:n arvoa v„hennet„„n 1:ll„ mik„li k„sky on INSB, INSW k„skyll„ v„hennet„„n 2:lla. Jos taas DF on alhaalla niin lis„t„„n DI:n arvoa yll„olevaan tapaan. INS k„sky„ k„ytett„ess„ on portin osoite aina annettava DX:n avulla. ----------------------------------------------------------- INT Tarkoitus: Suorittaa kesketyksen (Interrupt) Liput: kaikki Tavu: CDh Aika: 33-287 Esimerkki: MOV AH,00h ; AH = 00h MOV AL,12h ; AL = 12h INT 10h Esimerkki asettaa n„yt”n 640 * 480 * 16 (VGA) grafikkatilaan. ----------------------------------------------------------- INTO Tarkoitus: Suorittaa kesketyksen 4 vain jos OF on ylh„„ll„ (interrupt) Liput: Vaikuttaa kaikkiin lippuihin jos OF on ylh„„ll„ Tavu: CEh Aika: 33-287 Jos OF on alhaalla, k„sky vastaa NOP:ia. Katso: NOP ----------------------------------------------------------- IRET Tarkoitus: Palaa keskeytysaliohjelmasta (Interrupt return) Liput: kaikki Tavu: CFh Aika: 22-275 Esimerkki: CS:0100 MOV AX,FFh ; AX = 00FFh CS:0103 MOV CX,EEh ; CX = 00EEh CS:0106 DEC AX ; AX = AX - 1 CS:0107 1) PUSH CS CS:0108 2) CALL F000h CS:010B SUB AX,AX CS:XXXX ======= CS:F000 MOV AX,1010h ; AX = 1010h CS:F003 MOV CX,0000h ; CX = 0000h CS:F006 3) IRET CS:XXXX CS:XXXX Esimerkki tekee seuraavaa: 1) Laitetaan pinoon CS:n arvo, jotta IRET:in j„lkeen palataan oikeaan koodisegmenttiin. 2) Kutsutaan aliohjelmaa joka sijaitsee osoitteessa F000h ja jatketaan ohjelman suoritusta sielt„. 3) Palataan p„„ohjelmaan, IRET nostaa pinosta luvun ja sijoittaa sen CS:n arvoksi, siksi se pit„„ laittaa pinoon ennenkuin hyp„ttiin aliohjelmaan. ----------------------------------------------------------- JA/JNBE = Hyppy jos yl„puolella Tarkoitus: Liput: - Tavu: Aika: 7 Esimerkki: CS:0100 MOV AX,EEh ; AX = 00EEh CS:0103 MOV BX,AAh ; BX = 00AAh CS:0106 INC BX ; BX = BX + 1 CS:0107 1) CMP AX,BX CS:0109 2) JA 0106h Esimerkki tekee seuraavaa: 1) Vertaa AX:„„ BX:„„n (AX - BX). 2) Jos AX > BX hyp„t„„n osoitteeseen 0106h. JA k„sky ohitetaan kun BX = EEh. ----------------------------------------------------------- JB = JNAE = Hyppy jos alapuolella/ei yl„puolella tai yht„suuri (etumerkit”n) Aika: 7 ----------------------------------------------------------- JAE = JNB = Hyppy jos yl„puolella tai yht„suuri/ei alapuolella (etumerkit”n) Aika: 7 ----------------------------------------------------------- JBE = JNA = Hyppy jos alapuolella tai yht„suuri/ei yl„puolella (etumerkit”n) Aika: 7 ----------------------------------------------------------- JA = JNBE = Hyppy jos yl„puolella/ei alapuolella tai yht„suuri (etumerkit”n) Aika: 7 ----------------------------------------------------------- JE = JZ = Hyppy jos yht„suuri (zero) Aika: 7 ----------------------------------------------------------- JNE = JNZ = Hyppy jos ei yht„suuri (not zero) Aika: 7 ----------------------------------------------------------- JL = JNGE = Hyppy jos v„hemm„n/ei enemm„n tai yht„suuri (etumerkillinen) Aika: 7 ----------------------------------------------------------- JGE = JNL = Hyppy jos enemm„n tai yht„suuri/ei v„hemm„n (etumerkillinen) Aika: 7 ----------------------------------------------------------- JS = Hyppy jos etumerkki (negatiivinen) Aika: 7 ----------------------------------------------------------- JNS = Hyppy jos ei etumerkki„ (positiivinen) Aika: 7 ----------------------------------------------------------- JC = Hyppy jos CF (sama kuin JB) Aika: 7-9 ----------------------------------------------------------- JNC = Hyppy jos ei CF (sama kuin JAE) Aika: 7 ----------------------------------------------------------- JO = Hyppy jos OF jump if overflow Aika: 7 ----------------------------------------------------------- JNO = Hyppy jos ei OF jump if not overflow Aika: 7 ----------------------------------------------------------- JP = JPE = Hyppy jos pariteetti/parillinen pariteetti Aika: 7 ----------------------------------------------------------- JNP = JPO = Hyppy jos ei pariteettia/pariton pariteetti Aika: 7 ----------------------------------------------------------- JMP Tarkoitus: Suorittaa ehdottoman hypyn annettuun osoitteeseen (JuMP) Liput: kaikki Tavu: Aika: 7-268 Esimerkki: JMP 0000h:0000h ; hypp„„ osoitteeseen 0:0 JMP 0120h ; hypp„„ segmentin sis„ll„ ----------------------------------------------------------- LAHF Tarkoitus: Lataa liput AH-rekisteriin (Load AH from flags) Liput: Tavu: 9Fh Aika: 2 bitti 7 6 5 4 3 2 1 0 SF ZF ?? AF ?? PF ?? CF Oletus: CF, PF ja ZF ylh„„ll„. Bitit 1, 3 ja 5 ovat merkityksett”mi„. Esimerkki: LAHF K„skyn j„lkeen AH:ssa on 47h, joka on bin„„risen„ 01000111b. LAHF lataa liput AF,CF,PF,SF,ZF AH:n. Katso: SAHF ----------------------------------------------------------- LAR Tarkoitus: Lataa k„ytt”oikeudet-tavun (Load access rights kbyte) Liput: ZF Tavu: Aika: 15-16 ----------------------------------------------------------- LDS/LES (286-386), LSS/LFS/LGS (386) Tarkoitus: LataaEA DW:nDS/ES:„„n ja sanarekisteriin (Load doubleword pointer) Liput: - Tavu: Aika: 7 ----------------------------------------------------------- LEA Tarkoitus: Lataa l„hteen siirroksen vastaanottajaan (Load effective addres offset) Liput: - Tavu: Aika: 2 Esimerkki: LEA DX,[010E] MOV AH,09h ; parametri rivitulostukselle INT 21 ; DOS keskeytys INT 20 Siirroksesta 010Eh alkaa tekstirivi jonka viimeinen merkki on $, LEA k„skyll„ saadaan tekstin siirros helposti DX rekisteriin. Esimerkki tulostaa tekstin ruudulle. ----------------------------------------------------------- LEAVE Tarkoitus: Muodostaa proseduuripaluun lausekielille (High-level procedure exit) Liput: - Tavu Aika: 4 ------------------------------------------------------------ LGDT/LIDT Tarkoitus: Lataa muistin GDT- tai IDT-rekisteriin (Load global/interrupt descriptor table register) Liput: - Tavu: Aika: 11 ------------------------------------------------------------ LLDT Tarkoitus: Lataa valitsimen paikalliseen kuvaajataulukkorekisteriin (Load local descriptor table register) Liput: - Tavu: Aika: 20 ------------------------------------------------------------ LMSW Tarkoitus: Lataa EA-sanan konetilasanaan (Load machine status word) Liput: - Tavu: Aika: 10-13 ------------------------------------------------------------- LOCK Tarkoitus: Aktivoi BUS LOCK signaalin (Activate the BUS LOCK signal) Liput: - Tavu: Aika: - -------------------------------------------------------------- LODS/LODSB/LODSW Tarkoitus: Kopioi DS:SI sis„ll”n AL:„„n (Load byte or word string) Liput: - Tavu: ACh Aika: 5 SI:t„ askelletaan automaattisest joko yl”s tai alasp„in, riippuen DF lipun asennosta, kun DF on yl„„ll„ niin SI:t„ v„hennet„„n 1:ll„ tai 2:lla riippuen kumpi kumpi k„sky on k„yt”ss„ (LODSB = 1:ll„) (LODSW = 2:lla). Esimerkki: MOV DS,40h ; DS = 0040h MOV SI,17h ; SI = 0017h LODSB Lukee DS:SI n„ytt„m„n muistipaikan sis„ll”n AL:„„n. ----------------------------------------------------------- LOOP Tarkoitus: Suorittaa silmukkaa kunnes CX on nolla (Loop control with CX counter) Liput: - Tavu: Aika: 11 Esimerkki: MOV CX,55h ; CX = 55h taas: MOV AX,1111h ; AX = 1111h LOOP taas Silmukkaa suoritetaan kunnes CX-rekisterin arvo on nolla tai t„ytet„„n tietty ehto. Kaikissa LOOP* k„skyiss„ CX v„hennet„„n aina yhdell„. ----------------------------------------------------------- LOOPE Tarkoitus: Suorittaa silmukkaa jos ZF on ylh„„ll„ Liput: Tavu: Aika: 11 ----------------------------------------------------------- LOOPNE Tarkoitus: Suorittaa silmukaa jos ZF on alhaalla Liput: Tavu: Aika: 11 ----------------------------------------------------------- LOOPZ Tarkoitus: Suorittaa silmukkaa jos ZF on ylh„„ll„ Liput: Tavu: Aika: 11 ----------------------------------------------------------- LOOPNZ Tarkoitus: Suorittaa silmukkaa jos ZF on alhaalla Liput: Tavu: Aika: 11 ----------------------------------------------------------- LSL Tarkoitus: Lataa segmenttirajan, valitsimen (Load segment limits) Liput: ZF Tavu: Aika: 20-26 ------------------------------------------------------------ LTR Tarkoitus: Lataa EA-sanan teht„v„rekisteriin (Load task register) Liput: - Tavu: Aika: 23-27 ------------------------------------------------------------ MOV Tarkoitus: Kopioi dataa paikasta toiseen (Move) Liput: - Tavu: Aika: 2-22 Esimerkki: MOV AX,BX ; siirt„„ BX:n sis„ll”n AX:„„n MOV CX,2000h ; CX = 2000h MOV DX,ES:[DI] ; siirt„„ ES:DI:n sis„ll”n DX:„„n ----------------------------------------------------------- MOV CRn (386) Tarkoitus: Lataa CRn rekisteriin/Tallettaa CRn rekisteriin (Load and store control register) Liput: AF,CF,OF,PF,ZF Tavu: Aika: 2-4 ----------------------------------------------------------- MOV TRn (386) Tarkoitus: Lataa testirekisterin/Tallettaa testirekisterin (Load and store test registers) Liput: - Tavu: Aika: 2-4 ----------------------------------------------------------- MOVS/MOVSB/MOVSW Tarkoitus: Kopioi tavun/sana DS:[SI] tai ES:[DI] DS:[ESI] tai ES:[EDI] (Move byte or word string) Liput: - Tavu: A4h Aika: 2-22 SI- ja DI-rekistereit„ v„hennet„„n automaatti- sesti 1:ll„ tai 2:lla riippuen kumpaa k„sky„ k„ytet„„n (MOVSB = 1:ll„) (MOVSW = 2:lla), jos DF on ylh„„ll„, muutoin kasvatetaan. ----------------------------------------------------------- MOVZX/MOVSX Tarkoitus: Kopioi 8/16-bittisen data:n laajennettuun 16/32-bittiseen rekisteriin (Move reg./mem to sign/zero extension 16/32-bit register) Liput: - Tavu: Aika: 3-6 ----------------------------------------------------------- MUL Tarkoitus: Suorittaa kertolaskun ilman etumerkki„ (Multiply, unsigned) Liput: CF, OF Tavu: Aika: 9-41 Esimerkki: MOV AX,FFFh ; AX = 0FFFh MUL AX ; kerrotaan AX * AX Tulon arvo palautuu DX:AX:ss„, ylempi sana DX:ss„ ja alempi AX:ss„. ----------------------------------------------------------- NEG Tarkoitus: Ottaa kahden komplementin luvusta (Two's complement negation) Liput: AF,CF,OF,PF,SF,ZF Tavu: Aika: 2-6 Esimerkki: MOV AH,33h ; AH = 33h NEG AH CF nousee yl”s, paitsi silloin kun luku josta kahden komplementti otetaan on 0. ----------------------------------------------------------- NOP Tarkoitus: Ei suorita mit„„n, mutta aikaa kuluu "turhaan" (No Operation) Liput: Tavu: 90h Aika: 3 Esimerkki: NOP ----------------------------------------------------------- NOT Tarkoitus: Suorittaa loogisen NOT operaation luvulle, invertointi (Logical NOT) Liput: - Tavu: Aika: 2-6 Esimerkki: MOV AX,33h ; AX = 0033h, 110011b NOT AX 001100b K„„nt„„ kaikki AX:ss„ olevan luvun bitit toisinp„in. HUOM! (Turbo) Pascalin NOT operaatio ei invertoi lukua vaan toimii esim. Boolean vertailujen kanssa (while not x=13 jne.) Turbo Pascalissa voidaan looginen NOT toteuttaa seuraavasti: function Inverse (A : word) : word; inline($58/ { pop ax } $F7/$D0); { not ax } ----------------------------------------------------------- OR Tarkoitus: Suorittaa loogisen OR operaation luvulle (Logical inclusive OR) Liput: CF, OF, PF, SF, ZF Tavu: Aika: 2-7 Esimerkki: MOV AX,66h ; AX = 0066h, 01100110b MOV BX,88h ; BX = 0088h, 10001000b OR AX,BX ; AX = 00EEh, 11101110b Kaikki kohdat miss„ jommankumman rekisterin bitti on 1, palautetaan se AX:„„n 1:n„, my”s jos kummankin rekisterin bitit on 1:si„ niin AX:„„n palautetaan 1. ----------------------------------------------------------- OUT Tarkoitus: Kirjoittaa I/O - porttiin AX:n sis„ll”n (Output byte or word) Liput: - Tavu: Aika: 3-4 Jos halutaan k„ytt„„ suurempia osoitteita kuin FFh, annetaan portin osoite DX-rekisteriin. Esimerkki: MOV DX,3F8h ; DX = 03F8h OUT DX,44h Kirjoitetaan COM1:een luku 44h. ----------------------------------------------------------- OUTS, OUTSB, OUTSW Tarkoitus: Kirjoittaa tavun, sanan [SI],DS:[SI] DX osoittaamaan I/O - porttiin (Output string to port) Liput: - Tavu: Aika: 7 Periaate sama kuin INS, INSB, INSW k„skyiss„. ----------------------------------------------------------- POP Tarkoitus: Sijoittaa pinon huipun annettuun paikkaan (Pop word off stack to destination) Liput: - Tavu: Aika: 5-7 K„sky kasvattaa SP:t„ kahdella. Esimerkki: POP AX Ottaa pinosta luvun ja sijoittaa sen AX:„„n. ----------------------------------------------------------- POPA Tarkoitus: Lataa rekisterit DI, SI, BP, SP, BX, DX, CX ja AX (Pop all general registers) Liput: - Tavu: Aika: 24 Esimerkki: POPA ----------------------------------------------------------- POPF Tarkoitus: Lataa pinosta kaikki liput (Pop flags off stack) Liput: - Tavu: 9Dh Aika: 5 Esimerkki: POPF ----------------------------------------------------------- PUSH Tarkoitus: Tallentaa pinoon jonkun luvun (Push word onto stack) Liput: - Tavu: Aika: 2-5 Esimerkki: PUSH AX Tallentaa AX-rekisterin pinoon. ----------------------------------------------------------- PUSHA Tarkoitus: Tallentaa rekisterit DI, SI, BP, SP, BX, DX, CX ja AX pinoon (Push all general registers) Liput: - Tavu: Aika: 18 Esimerkki: PUSHA ----------------------------------------------------------- PUSHF Tarkoitus: Tallentaa kaikki liput pinoon (Push flags register onto the stack) Liput: - Tavu: 9Ch Aika: 4 Esimerkki: PUSHF ----------------------------------------------------------- RCL/RCR/ROL/ROR Tarkoitus: Py”ritysk„sky (Rotate instructions) Liput: CF, OF Tavu: Aika: 3-10 Esimerkki: MOV AH,12h ; AH = 12h = 10010b ROL AH,1 ; AH = 5h = 00101b Py”ritysk„sky siirt„„ joko oikealle tai vasemmalle bittej„, siirtojen m„„r„ osoitetaan toisella operandilla. ROL k„sky siirt„„ bittej„ vasemmalle (Rotate left), ROR k„sky siirt„„ bittej„ oikealle (Rotate right). RCL ja RCR CF:„„ py”ritett„v„n luvun osana, RCL siirt„„ CF:n v„hiten merkitsev„ksi bitiksi ja eniten merkitsev„ bitti siirret„„n CF:„„n, RCR toimiin p„invastoin kuin RCL. ----------------------------------------------------------- REP/REPZ/REPE/REPNE/REPNZ Tarkoitus: Toistok„sky (Repeat string operation) Liput: - Tavu: Aika: 5+9 * n n=suorituskertojen m„„r„ K„sky„ toistetaan kunnes CX on 0 tai t„ytet„„n tietty ehto. Esimerkki: MOV AL,BBh ; AL = BBh MOV CX,10h ; CX = 10h MOV DI,200h ; DI = 0200h REP STOSB Kirjoittaa siirroksesta 0200h alkaen lukua BBh muistiin 16 kertaa p„„ttyen siirrokseen 020Eh. Katso: STOSB ----------------------------------------------------------- RET Tarkoitus: Palaa aliohjelmasta (Return from procedure) Liput: - Tavu: Aika: 10-68 Paluuosoite on pinossa. Katso: CALL ----------------------------------------------------------- SAHF Tarkoitus: Sijoittaa AH:n sis„ll”n lippuihin (Store AH in flags) Liput: AF, CF, PF, SF ja ZF Tavu: 9Eh Aika: 3 bitti 7 6 5 4 3 2 1 0 SF ZF ?? AF ?? PF ?? CF Bitit 1, 3 ja 5 ovat merkityksett”mi„. Katso: LAHF ----------------------------------------------------------- SAL/SAR/SHL/SHR Tarkoitus: Py”ritt„„ bittej„ (Shift instruction) Liput: AF, CF, OF, PF ja SF Tavu: Aika: 3-7 Esimerkki: MOV AX,3434h ; AX = 3434h SHR AX,1 SAL ja SHL siirt„v„t bittej„ vasemmalle siten ett„ eniten merkitsev„ bitti siirret„„n CF:„„n ja v„hiten merkitsev„ bitti asetetaan 0:ksi. SAR ja SHR siirt„v„t bittej„ oikealle siten ett„ v„hiten merkitsev„ bitti siirtyy CF:„„n. SAR k„sky suorittaa etumerkillisen jakolaskun eniten merkitsev„n bitin pysyess„ ennallaan. SHR k„sky suorittaa jakolaskun ilman etumerkki„ ja eniten merkitsev„ bitti muutetaan 0:ksi. ----------------------------------------------------------- SBB Tarkoitus: Suorittaa kokonaislukuv„hennyslaskun lainauksella (Substract with borrow) Liput: AF, CF, OF, PF ja ZF Tavu: Aika: 2-7 Esimerkki: MOV AX,AAh ; AX = 00AAh MOV BX,33h ; BX = 0033h SBB AX,BX ; suoritetaan jakolasku Tulos on AX:ss„, joka on 77h. ----------------------------------------------------------- SCAS/SCASB/SCASW Tarkoitus: Vertaa tavua(AL), sanaa(AX) ES:[DI]:n tai ES:[EDI]:n kanssa (Compare string data) Liput: AF, CF, OF, PF, SF ja ZF Tavu: Aika: 7 Esimerkki: V„hent„„ AL tai AX rekisterist„ ES:DI:n osoittaman muistipaikan sis„ll”n, tulosta ei talleteta mihink„„n mutta lippu nostetaan/lasketaan. DI:n arvoa joko kasvatetaan tai v„hennet„„n automaattisesti 1:ll„ tai 2:lla jokaisen k„skykerran j„lkeen seuraavasti: Jos DF on yl„„ll„ niin v„hennet„„n ja kun DF on alhaalla niin kasvatetaan, (SCASB = 1:ll„) (SCASW = 2:lla). ----------------------------------------------------------- SGDT/SIDT Tarkoitus: Tallentaa GDT- tai IDT-rekisterin muistiin (Store global/interrupt descriptor table register) Liput: - Tavu Aika: 9 ------------------------------------------------------------ SETcond. (386) Tarkoitus: K„sky asettaa valitun tavub joko 0:ksi tai 1:ksi riippuen 16:sta ehdosta (Byte set on condition) Liput: - Tavu: Ehdot: SETO ylivuoto SETNO ei ylivuotoa SETB alapuolella (unsigned) SETNAE ei yl„puolella tai sama kuin SETNB ei alapuolella SETAE yl„puolella tai sama kuin (unsigned) SETE sama kuin SETZ nolla SETNE ei sama kuin SETNZ ei nolla SETBE alapuolella tai sama kuin SETNA ei yl„puolella SETNBE ei alapuolella tai sama kuin SETA yl„puolella SETS etumerkki SETNS ei etumerkki„ SETP pariteetti SETPE pariteetti tasan SETNP ei pariteetti„ SETPO periton pariteetti SETL v„hemm„n kuin (signed) SETNGE ei suurempi tai yht„suuri SETNL ei v„hemm„n kuin SETGE suurempi tai yht„suuri SETLE pienempi tai yht„suuri SETNG ei suurempi kuin SETNLE ei pienempi kuin tai yht„suuri SETG suurempi kuin (signed) ------------------------------------------------------------- SHLD/SHRD (386) Tarkoitus: Siirt„„... (Double- shift instructions) Liput: AF Tavu: Aika: 3-7 ------------------------------------------------------------- SMSW Tarkoitus: Tallentaa konetilasanan EA-sanaan (Store machine status word) Liput: - Tavu: Aika: 2 ------------------------------------------------------------- STC Tarkoitus: Nostaa CF:n yl”s (Set Carry flag) Liput: CF Tavu: F9h Aika: 2 Esimerkki: STC Katso: CLC ----------------------------------------------------------- STD Tarkoitus: Nostaa DF:n yl”s (Set Direction flag) Liput: DF Tavu: FDh Aika: 2 Esimerkki: STD Katso: CLD ----------------------------------------------------------- STI Tarkoitus: Nostaa IF:n yl”s (Set interrupt enable flag) Liput: IF Tavu: FBh Aika: 3 Esimerkki: STI Sallitaan keskeytykset. Katso: CLI ----------------------------------------------------------- STOS/STOSB/STOSW Tarkoitus: Tallentaa AL:n tai AX:n ES:[DI]:iin tai ES:[EDI]iin (Store string data) Liput: - Tavu: Aika: 4 DI:t„ kasvatetaan/v„henet„„n joka kerta 1:ll„ tai 2:lla, jos DF on ylh„„ll„ niin v„hennet„„n ja jos DF on alhaalla niin kasvatetaan (STOSB = 1:ll„) (STOSW = 2:lla). Esimerkki: MOV AL,BBh ; AL = BBh MOV CX,10h ; CX = 10h MOV DI,200h ; DI = 0200h REP STOSB Kirjoittaa siirroksesta 0200h alkaen lukua BBh muistiin 16 kertaa p„„ttyen siirrokseen 020Eh. Katso: REP ----------------------------------------------------------- STR Tarkoitus: Tallentaa teht„v„rekisterin EA-sanaan (Store task register) Liput: - Tavu: Aika: 23-27 ----------------------------------------------------------- SUB Tarkoitus: Suorittaa kokonaislukuv„hennyslaskun (Subtract) Liput: AF, CF, OF, PF, SF ja ZF Tavu: Aika: 2-7 Esimerkki: MOV AX,FFh ; AX = 00FFh MOV CX,0Fh ; CX = 000Fh SUB AX,CX Esimerkiss„ tulos palautuu AX:ss„, joka operaation j„lkeen on F0h. ----------------------------------------------------------- TEST Tarkoitus: Testaa kahta lukua bitti bitilt„ (Test. logical compare) Liput: CF, PF, SF ja ZF Tavu: Aika: 2-5 K„sky toimii kuten AND mutta rekisterien sis„lt”j„ ei muuteta. Esimerkki: MOV AX,AAh ; AX = 00AAh MOV BX,A9h ; BX = 00A9h TEST AX,BX Mik„li AX on pienempi kuin BX, niin PF nousee, muutoin se on alhaalla. ----------------------------------------------------------- VERR/VERW Tarkoitus: Testaa voidaanko tietyst„ segmentist„ lukea dataa (Verify a segment for reading or writing) Liput: - Tavu: Aika: 10-16 ZF nousee jos segmentist„ voidaan lukea. ----------------------------------------------------------- WAIT Tarkoitus: Odottaa ulkoista keskeytyst„ Liput: - Tavu: 9Bh Aika: 6 Esimerkki: WAIT Odottaa ulkoista keskeyst„ niin kauan, ett„ ulkoinen keskeytys tulee. ----------------------------------------------------------- XBTS (386) Tarkoitus: Poimii bittijonosta oikealle-tasattuun rekisteriin (Extract bit string) Liput: AF, CF, OF, PF ja ZF Tavu: Aika: 6-13 ----------------------------------------------------------- XCHG Tarkoitus: Vaihtaa rekisterien sis„ll”t kesken„„n (Exchange) Liput: - Tavu: Aika: 3-5 Esimerkki: MOV AX,FFh ; AX = 00FFh MOV CX,AAh ; CX = 00AAh XCHG AX,CX AX:n ja CX:n sis„ll”t vaihdetaan kesken„„n. ----------------------------------------------------------- XLAT Tarkoitus: Suorittaa taulukkohakuk„„nn”ksen (Translate) Liput: - Tavu: D7h Aika: 5 AL-rekisteri toimii indeksi taulukolle, jonka osoite muodostetaan DS:BX:n avulla. Tavu indeksoidaan DS:BX:ll„ ja data kopioidaan AL:„„n. Esimerkki: LEA BX,[10] MOV AL,05h ; AL = 05h XLAT Esimerkki toimii seuraavasti: BX+AL muodostavat paikan taulukon sis„ll„ (15h), joka sijaitsee DS:n osoittamassa segmentiss„. XLAT hyv„ksyy sis„ll”n ja siirt„„ sen AL:„„n. ----------------------------------------------------------- XOR Tarkoitus: Suorittaa loogisen XOR operaation kahden luvun v„lill„ (Logical exclusive OR) Liput: CF, OF, PF, SF ja ZF Tavu: Aika: 2-7 Esimerkki: MOV AX,AAh ; 170d = 10101010b MOV BX,60h ; 96d = 11000000b XOR AX,BX ; 202d = 01101010b = CAh Tulos palautuu AX-rekisteriss„ (CAh) ja vastaava XOR-operaatio Pascalilla voisi olla seuraavanlainen: ax:=ax xor bx; ----------------------------------------------------------- 3.0.0 I/O Osoitteet T„ss„ on lyhesti kaikki PC koneen I/O osoitteet. ----------------------------------------------------------- 000 - 01Fh Laite/osoite: DMA1 (Direct Access Controller 1) ----------------------------------------------------------- 020 - 03Fh Laite/osoite: Master Interrupt Controller 1 ----------------------------------------------------------- 040 - 05Fh Laite/osoite: Timer/Counter ----------------------------------------------------------- 060 - 06Fh Laite/osoite: Keyboard Controller ----------------------------------------------------------- 061h Laite/osoite: On-Board Testing Register ----------------------------------------------------------- 070,71Fh Laite/osoite: Clock/Calendar ----------------------------------------------------------- 70h,bit 7 Laite/osoite: NMI Mask ----------------------------------------------------------- 078h Laite/osoite: On-Board Test Stimulus Register ----------------------------------------------------------- 080 - 09Fh Laite/osoite: DMA Page Register ----------------------------------------------------------- 0A0 - 0BFh Laite/osoite: Slave Interrupt Controller ----------------------------------------------------------- 0C0 - 0DFh Laite/osoite: Direct Memory Access Controller (DMA2) ----------------------------------------------------------- 0F0h Laite/osoite: Clear the BUSY Signal of the Microprocessor ----------------------------------------------------------- 0F1h Laite/osoite: Reset the Math CoProcessor ----------------------------------------------------------- 0F8 - 0FFh Laite/osoite: Math CoProcessor ----------------------------------------------------------- 1F0 - 1F8h Laite/osoite: Fixed Disk ----------------------------------------------------------- 200 - 207h Laite/osoite: Game I/O ----------------------------------------------------------- 278 - 27Fh Laite/osoite: Parallel Printer Port 2 (LPT2) ----------------------------------------------------------- 2E8 - 2EFh Laite/osoite: Serial Port 4 (COM4) ----------------------------------------------------------- 2F8 - 2FFh Laite/osoite: Serial Port 2 (COM2) ----------------------------------------------------------- 300 - 31Fh Laite/osoite: Prototype Card ----------------------------------------------------------- 360 - 36Fh Laite/osoite: Reserved ----------------------------------------------------------- 378 - 37Fh Laite/osoite: Parallel Printer Port 1 (LPT1) ----------------------------------------------------------- 380 - 38Fh Laite/osoite: SDLC, Bisynchronous 1 ----------------------------------------------------------- 3A0 - 3AFh Laite/osoite: Bisynchronous 1 ----------------------------------------------------------- 3B0 - 3BFh Laite/osoite: Monochrome Display and Printer Adapter ----------------------------------------------------------- 3C0 - 3CFh Laite/osoite: Enhanced Graphics Display Adapter ----------------------------------------------------------- 3D0 - 3DFh Laite/osoite: Color Graphics Display Adpter ----------------------------------------------------------- 3E8 - 3EFh Laite/osoite: Serial Port 3 (COM3) ----------------------------------------------------------- 3F0 - 3FFh Laite/osoite: Diskette Controller ----------------------------------------------------------- 3F8 - 3FFh Laite/osoite: Serial Port 1 (COM1) ----------------------------------------------------------- The AND