Kuvitettu opetusohjelma Assemblerissä. Kokoamisaritmeettiset ohjeet

Tiimi ADC(Add with Carry) kuuluu ryhmään kokonaislukukomennot(tai binääri)aritmeettinen (Binääriaritmeettiset ohjeet) ja suorittaa kahden etumerkillisen tai etumerkittömän operandin kokonaislukulisäyksen ( DEST Ja SRC) Ja kantaa lippua EFLAGS.CF . Ensimmäinen operandi ( kohdeoperandi, DEST) voi olla muuttuja rekisterissä tai muistissa ( , r16, r32 , r/m8, r/m16, r/m32). Toinen operandi ( lähdeoperandi, SRC) - välitön merkitys ( imm8, imm16, imm32), muuttuja rekisterissä tai muistissa. Tässä tapauksessa molemmat operandit eivät voi samanaikaisesti olla muuttujia muistissa.

Lisäyksen tulos komennolla ADC sijoitetaan ensimmäisen operandin tilalle ( DEST). EFLAGS-rekisterin liput asetetaan tuloksen mukaan.

Kun lisäät suoran arvon imm8 tai imm16 kaksi- tai nelitavuisella operandilla välitön arvo laajennetaan ensin etumerkillä ensimmäisen operandin kokoon ja vasta sitten suoritetaan summaus.

Tiimi ADC käytetään yleensä monitavuisena tai monisanaisena ( monisanainen) lisäystoiminnot. Tässä tapauksessa se noudattaa ADD-käskyä, joka palauttaa monitavuisten (monisanaisten) operandien matalan kertaluvun bittien summan, jolloin siirto voidaan ottaa huomioon lisättäessä korkean kertaluvun bittejä. Esimerkiksi:

mov edx, 0; EDX = 0
mov eax, 0FFFFFFFFh ; Ensimmäinen 32-bittinen lisäys sijoitetaan EAX:hen
lisää eax, 0FFFFFFFFh ; toinen 32-bittinen lisäys - 0x FFFFFFFFh, lisäämme kaksi 32-bittistä operandia
adc edx, 0; EDX = EDX + CF, ota huomioon siirto
; EDX:EAX = 0000000lh:FFFFFFFEh - tuloksena oleva 64-bittinen tulos

Tiimi ADC mahdollistaa kokonaislukuoperandien manipuloinnin kuten allekirjoittamaton muoto, ja sisään allekirjoitettu muoto. Kun lisäät tietoja merkillä merkki lippu EFLAGS.SF heijastaa saadun tuloksen merkkiä. Ylivuoto lippu EFLAGS.OF asetetaan arvoon 1, jos kahden komplementin tai kahden komplementin etumerkillisiä kokonaislukuja lisättäessä tapahtuu ylivuoto (kuljettuna merkittävimmästä bitistä, jota etumerkkibittiä edeltävä bitti vastaa), eli tuloksena saatava tulos ylittää käytettävissä olevan operandi -nimitysten koon ( DEST). Pohjimmiltaan tämä on samanlainen kuin EFLAGS.CF-lippu heijastaa ylivuotoa (carry) lisättäessä etumerkittömät operandit. Esimerkiksi kun lisäät kaksi 32-bittistä arvoa, jotka esitetään käänteisessä koodissa, se saattaa näyttää tältä:

mov eax, operandi1 ; EAX = operandi1, ensimmäinen 32-bittinen lisäys sijoitetaan EAX:ään
lisää eax, operandi2 ; lisäämme kaksi 32-bittistä operandia käänteisessä koodissa
sisään ; hyppää keskeyttämään käsittelijää ylivuodon sattuessa

adc eax, 0 ; EAX = EAX + CF, ota huomioon siirto (tarvitaan lisäämistä varten käänteisessä koodissa)
; EAX = operandi1 + operandi2 - summauksen tulos käänteisessä koodissa
jns m1; siirtymä, jos tulos on positiivinen
xor eax, 7FFFFFFFFh ; muuntaa negatiivisen arvon EAX:ssä suoraksi koodiksi
m1: ; EAX - lisäyksen tulos suorassa koodissa

Apu lippu(tai lisää)siirtää EFLAGS.AF auttaa käsittelemään tietoja BCD-muodossa ( pakattu BCD-muoto). Se asetetaan, jos summauksen aikana tapahtuu siirto tuloksen alemman tavun matalasta tetradista korkeaan tetradiin. Käytä DAA-komentoa välittömästi komennon jälkeen ADC, on mahdollista tuottaa ns desimaalikorjaus yhteenlaskun tulos ja saada summa samalla pakattu BCD-muodossa, samoin kuin alkuperäiset ehdot.

Tiimi ADC kohdeoperandilla ( DEST), joka on muistimuuttuja, voidaan käyttää yhdessä LOCK-lukkoetuliitteen kanssa, mikä varmistaa komennon atomin suorittamisen.

Lisäyskomennot - ADD, ADC

ADD (add) ja ADC (add with carry) -käskyt voivat lisätä sekä 8- että 16-bittisiä operandeja.

ADD-käsky lisää lähdeoperandin ja kohdeoperandin sisällön ja sijoittaa tuloksen kohdeoperandiin.

Komentomuoto: ADD vastaanotin, lähde

Symbolisessa merkinnässä sen toimintaa voidaan kuvata seuraavasti: nielu:= nielu + lähde (nieluon kirjoitetaan nielun ja lähteen sisällön summa).

ADC-komento toimii samoin kuin ADD-komento, mutta ei lisää kahta, vaan kolmea termiä: kohde, lähde ja siirtolippu.

Komentomuoto: ADC-vastaanotin, lähde + CF

Symbolisella merkinnällä sen toimintaa voidaan kuvata seuraavasti:

sink:= pesuallas + lähde + kantolipun sisältö.

Kuljettaminen binäärilukuja lisättäessä on samanlaista kuin desimaalilukujen lisääminen sarakkeeseen. Kun tietokone lisää binäärilukuja ja summa ei mahdu kohdeoperandiin, syntyy siirto. Kuten tiedät, 8-bittisessä rekisterissä voi olla etumerkittömiä arvoja välillä 0 - 255. Jos esimerkiksi suoritamme lukujen 250 ja 10 binäärilisäyksen, saamme seuraavan tuloksen:

1111 1010; binääriesitys luvusta 250.

0000 1010 ; luvun 10 binääriesitys.

1 0000 0100; binääriesitys summasta, joka on yhtä suuri kuin 260.

Tulos on oikea, mutta vie 9 binaaribittiä. Jos käytettiin 8-bittisiä rekistereitä, alemmat 8 bittiä syötetään kohderekisteriin ja yhdeksäs bitti siirtolippuun CF.

Nyt ymmärrämme, miksi 8086-mikroprosessorissa on kaksi erilaista lisäysohjetta. Yksi niistä (ADD) voi lisätä arvoja, joita edustavat tavut tai sanat, sekä korkean tarkkuuden arvojen alemmat osat. Toista ohjetta (ADC) käytetään suuren tarkkuuden arvojen lisäämiseen.

Lisättävät operandit voivat olla muistissa, rekisterissä tai niillä voi olla välitön arvo. Esimerkiksi:

LISÄÄ AX,MEM_WORD; lisää muistisolun sisältö rekisteriin,

LISÄÄ MEM_WORD,AX; tai päinvastoin, lisää rekisterin sisältö muistisoluun.

LISÄÄ AL, 10; lisää vakio rekisterin sisältöön.

LISÄÄ MEM_BYTE, 8H; lisää vakio ja muistisolun sisältö.

Useimmat mahdolliset yhdistelmät ovat sallittuja, mutta se on kielletty lisää kahden muistisolun sisältö tai käytä suoraa arvoa (numeroa) vastaanottimena.

ADD- ja ADC-komennot voivat vaikuttaa seuraaviin kuuteen lippuun:

kantaa lippua CF on 1, jos summauksen tulos ei mahdu kohdeoperandiin, muuten se on 0;

pariteetin lippu PF on 1, jos tuloksessa on parillinen määrä bittejä arvolla 1, muuten se on 0;

AF on yhtä suuri kuin 1, jos desimaalilukujen yhteenlaskettu tulos vaatii korjausta;

nolla lippu ZF on 1, jos tulos on 0;

merkki lippu SF on 1, jos tulos on negatiivinen (merkittävin bitti on 1), muuten se on 0;

ylivuoto lippu OF on yhtä suuri kuin 1, jos kahden saman merkin luvun summa ylittää vastaanottimen hyväksyttävien arvojen alueen käänteisessä koodissa, ja vastaanotin itse vaihtaa etumerkkiä. Muussa tapauksessa OF-lippu on 0.

Komento suurentaa vastaanottimen arvoa yhdellä - INC

Tiimi INC(inkrementti) lisää 1:n rekisterin tai muistisolun sisältöön, mutta toisin kuin ADD-käsky, se ei vaikuta siirtolippuun CF. Komentomuoto: INC vastaanotin.

INC-käsky on hyödyllinen laskurien kasvattamiseen käskysilmukoissa. Sitä voidaan käyttää myös indeksirekisterin arvon kasvattamiseen käytettäessä peräkkäisiä muistisoluja. Operandi tulkitaan etumerkittömäksi numeroksi.

Esimerkiksi:

INC CX; lisää 16-bitin arvoa

INC AL; tai 8-bittinen rekisteri yksikköä kohti.

INC MEM_BYTE; lisää tavun arvoa

INC MEM_WORD; tai muistisanoja yksikköä kohti.

Välitöntä arvoa ei saa käyttää operandina.

Vähennyskomennot - SUB ja vähennyslasku SBB:tä lainaamalla

Joukkueet SUB(vähentä - vähennä) ja SBB(vähentä lainalla) ovat samankaltaisia ​​kuin summauskomennot ADD ja ADC, vain vähennettäessä siirtolippu CF toimii merkkinä lainasta. Komentomuoto: SUB-vastaanotin, lähde;

SUB-komento vähentää lähdeoperandin kohdeoperandista ja sijoittaa tuloksen kohteeseen symbolisella merkinnällä:

sink:= sink – lähde.

Tiimi SBB tekee saman asian, mutta lisäksi vähentää CF-siirtolipun arvon vastaanottimesta:

SUB-vastaanotin, lähde – CF;

Kohde:= nielu - lähde - siirtolipun sisältö.

Kuten lisäyksen yhteydessä, SUB- ja SBB-käskyt suorittavat kaksi erillistä toimintoa. Ensimmäinen komento vähentää tavu- tai sanakokoiset luvut sekä erittäin tarkkojen lukujen matalan kertaluvun bitit (luvun alemman kertaluvun osa sijaitsee AX-rekisterissä ja korkean kertaluvun osa on DX-rekisteri). Toinen komento vähentää tarkkojen lukujen merkittävimmät bitit. Esimerkiksi komento SUB AX,CX; Vähentää CX-rekisterin sisällön AX-rekisterin sisällöstä ja palauttaa tuloksen AX-rekisteriin.

Jos operandikoot ylittävät 16 bittiä, on käytettävä seuraavaa komentosarjaa:

SUB AX, CX; Vähennä alhainen 16 bittiä;

SBB BX, DX; ja sitten merkittävin 16 bittiä.

Tässä vähennetään AX- ja BX-rekistereihin sijoitetusta 32-bittisestä luvusta CX- ja DX-rekistereissä oleva 32-bittinen luku. Kun DX-rekisterin sisältöä vähennetään BX-rekisterin sisällöstä, SBB-käsky ottaa huomioon lainausmahdollisuuden ensimmäistä vähennyslaskua suoritettaessa.

SUB AX, MEM; Vähennä muistisolun sisältö rekisteristä.

SUB MEM, AX; Vähennä rekisteri muistisolusta.

SUB AL,1O; Vähennä vakio rekisteristä.

SUB MEM_BYTE,OFh; Vähennä vakio muistisolusta.

Ei voi suoraan vähentää yhden muistisolun sisältö toisesta tai käytä välitöntä arvoa kohteena.

SUB- ja SBB-komennot voivat vaikuttaa kuuteen lippuun seuraavasti:

· Asentaa kantaa lippua CF on 1, jos lainaa vaaditaan, muuten se on 0;

· Asentaa pariteetin lippu PF on 1, jos vähennyksen tuloksessa on parillinen määrä bittejä arvolla 1, muuten se on 0;

· Asentaa ylimääräinen kantolippu AF on 1, jos desimaalivähennystulos vaatii korjausta, muuten se on 0;

· Asentaa nolla lippu ZF 1:ksi, jos tulos on 0, muuten se on 0;

· Asentaa merkki lippu SF on 1, jos tulos on negatiivinen (merkittävin bitti on 1), muuten lippu on 0;

· Asentaa ylivuoto lippu OF on 1, jos vähennystulos ylittää käänteisen koodin vastaanottimen arvojen alueen ja vastaanotin itse vaihtaa etumerkkiä.

SF- ja OF-lipuilla on järkeä vain, kun vähennetään etumerkittyjä lukuja, ja AF-lipulla on järkeä vain desimaalilukuja vähennettäessä.

Pienennä määränpään sisältöä -komento - DEC

Tiimi DEC vastaanotin(decrement) vähentää 1:n rekisterin tai muistipaikan sisällöstä, mutta (toisin kuin SUB-käsky) ei vaikuta siirtolippuun CF.

DEC-käskyä käytetään usein silmukoissa laskurin arvon pienentämiseen, kunnes siitä tulee nolla tai negatiivinen. Sitä voidaan käyttää myös indeksirekisterin tai osoittimen arvon vähentämiseen käytettäessä peräkkäisiä muistipaikkoja. Esimerkiksi:

DEC CX; Pienennä 16-bittistä arvoa,

DEC AL; tai 8-bittinen rekisteri.

DEC MEM_BYTE; Pienennä tavun arvoa,

DEC MEM_WORD; tai sanamuistisolu.

Jakokomennot - DIV, IDIV

Tiimi DIV(jakaa - jakaa) suorittaa etumerkittömän numeroiden jaon ja komennon IDIV(kokonaislukujako - kokonaislukujen jakaminen) suorittaa lukujen etumerkillisen jaon. Näillä komennoilla on muoto:

DIV lähde; Missä lähde- tavun tai sanan koon jakaja,

IDIV lähde;sijaitsee yleiseen rekisteriin tai muistipaikkaan.

Huomioi seuraavat asiat:

1. Osingon tulee olla kaksinkertainen jakajan suhteen.

2. Osingon tulee aina olla AX-rekisterissä (jaettuna 8-bittisellä luvulla) tai DX- ​​ja AX-rekistereissä (jakattaessa 16-bittisellä luvulla).

3. Komennon tulokset palautetaan seuraavasti:

· jos lähdeoperandi on tavu, osamäärä palautetaan AL-rekisteriin ja jäännös AN-rekisteriin;

· Jos lähdeoperandi on sana, osamäärä palautetaan AX-rekisteriin ja jäännös DX-rekisteriin.

Molemmat käskyt jättävät lippujen tilan määrittelemättä, mutta jos osamäärä ei mahdu kohderekisteriin (AL tai AX), mikroprosessori generoi tyypin 0 keskeytyksen (jako 0:lla).

4. Jakotuloksen ylivuoto tapahtuu seuraavissa olosuhteissa:

· jakaja on 0;

· jaettaessa tavuja ilman etumerkkiä jako on vähintään 256 kertaa jakaja;

· jaettaessa sanoja ilman etumerkkiä osinko on vähintään 65 536 kertaa jakaja;

· kun tavuja jaetaan etumerkillä, osamäärä on alueen -128 - +127 ulkopuolella;

· kun sanoja jaetaan merkillä, osamäärä on alueen ulkopuolella

32768 - 32767.

Tässä on joitain tyypillisiä esimerkkejä jakotoiminnoista:

DIV BX; Jaa DX:AX BX:llä, allekirjoittamaton.

DIV MEM_BYTE; Jaa AX tavuun muistiin, etumerkittömäksi.

IDIV DL; Jaa AX DL:llä merkillä.

IDIV MEM WORD; Jaa DX:AX etumerkityksi muistisanaksi.

DIV- ja IDIV-käskyt eivät jaa suoraan välittömällä arvolla, koska prosessori ei voi määrittää jakajan tietotyyppiä.

Kertolaskuohjeet - MUL, IMUL

Tiimi MUL(kertoja) kertoo etumerkittömät luvut, a IMUL(integer multiply) kertoo etumerkityt kokonaisluvut. Molempien käskyjen kertojan ja kertoimen on oltava sama tietotyyppi, eli tavut, sanat, kaksoissanat jne.

Näillä komennoilla on seuraava muoto:

MUL-lähde; Missä lähde- yleiskäyttöinen rekisteri,

IMUL-lähde; tai tavu- tai sanakokoinen muistisolu.

MUL- ja IMUL-käskyt käyttävät ensimmäisenä operandina (kerrotettavana) AL-rekisterin (tavuoperaatioille) tai AX-rekisterin (sanojen operaatioille) sisältöä. Tuote on kaksinkertainen ja palautetaan seuraavasti:

· kertolasku tavua-palauttaa 16-bittisen tuotteen rekistereihin AN (high byte) ja AL (low byte);

· kertolasku sanat-palauttaa 32-bittisen tuotteen DX (high word) ja AX (low word) rekistereihin. Näin ollen tuotteen koko n- bittitekijät ovat yhtä suuret 2n.

ADC:n kokonaislukujen lisäys siirrolla

Tiimi adc suorittaa ensimmäisen ja toisen operandin summauksen lisäämällä tulokseen siirtolipun CF arvon. Ensimmäisen operandin (kohteen) alkuperäinen arvo menetetään, ja se korvataan lisäyksen tuloksella. Toinen operandi on ennallaan. Komennon ensimmäisenä operandina adc

Operandit voivat olla tavuja tai sanoja ja edustaa etumerkillisiä tai etumerkittömiä lukuja. Tiimi adc(yhdessä joukkueen kanssa lisätä) käytetään yleensä 32-bittisten numeroiden lisäämiseen. Komento vaikuttaa lippuihin OF, SF, ZF, AF, PF ja CF.

Esimerkki 1:

Mov AX,1125h adc AX,2C25h; AX=3D4Bh, jos CF oli = 1;AX=3D4Ah, jos CF oli = 0

Esimerkki 2:

; Tietokentissä: numlow dw 0FFFFh; 2. termin alhainen osa numhigh dw 000Sh; 2. lukukauden korkein osa;Numero 0005FFFFh=393215;Ohjelmasegmentissä: mov AX,000Sh; Alhainen osa 1. termistä mov BX,0002h; Ensimmäisen jakson korkein osa; Numero 00020005h=131077 lisää AX,numlow; Junioriosien lisäys. AX=4, CF=1 adc BX, numhigh; Korkeampien osien lisäys kantoineen. BX:AX=0008:0004h. ;Numero 00080004h=524292

32-bittisten operandien ja 32-bittisten prosessorien lisäosoitusmuotojen käyttö on hyväksyttävää. Tiimi adc 32-bittisten operandien kanssa voidaan lisätä 64-bittisiä kokonaislukuja.

Esimerkki:

; Tietokentissä mem321 dd 0FFFFFFFFh; Alhainen osa 1. lukukaudesta mem32h dd 98765432h; 1. lukukauden korkein osa; Ohjelmasegmentissä mov EAX,1; Alhainen osa 2. termistä mov EBX,0; Toisen termin korkein osa lisää EAX,mem321; Lisää alemmat puolikkaat;Sum=100000000h>32 bittiä;EAX=000000h, kuljettaa adc EBX,mem32h; Taita vanhemmat puolikkaat ja siirrä eteenpäin. EBX = 90000001h; Määrä: 9876543300000000h

LISÄÄ kokonaislukujen lisäys

Tiimi lisätä suorittaa ensimmäisen ja toisen operandin lisäyksen. Ensimmäisen operandin (kohteen) alkuperäinen arvo menetetään, ja se korvataan lisäyksen tuloksella. Toinen operandi on ennallaan. Komennon ensimmäisenä operandina lisätä Voit määrittää rekisterin (lukuun ottamatta segmenttiä) tai muistisolun, toinen voi olla rekisteri (paitsi segmentti), muistisolu tai välitön arvo, mutta molempia operandia ei saa määrittää samanaikaisesti muistiksi. soluja.

Operandit voivat olla tavuja tai sanoja ja edustaa etumerkillisiä tai etumerkittömiä lukuja. Add-komennolla voidaan lisätä sekä tavallisia kokonaislukuja että binäärisiä desimaalilukuja (käyttäen AX-rekisteriä tulosten tallentamiseen). Jos pakkaamattomia binäärikoodattuja desimaalilukuja (BCD) lisätään komennon jälkeen lisätä aaa-komentoa tulisi käyttää; jos pakatut numerot lisätään, niin komento Joo. Komento vaikuttaa lippuihin OF, SF, ZF, AF, PF ja CF.

Esimerkki 1:

Mov BX,lFFEh mov CX,3 lisää BX,CX; BX=2001h, CX=0003h

Esimerkki 2:

Mov AX,25h lisää AX,12h; AX=0037h

Esimerkki 3:

; Tietokentissä: mem dw 128 ;Ohjelmasegmentissä: lisää mem,100; muisti = 228

ADC:n kokonaislukujen lisäys siirrolla

Adc-komento lisää ensimmäisen ja toisen operandin ja lisää tulokseen siirtolipun CF arvon. Ensimmäisen operandin (kohteen) alkuperäinen arvo menetetään, ja se korvataan lisäyksen tuloksella. Toinen operandi on ennallaan. Adc-käskyn ensimmäinen operandi voi olla rekisteri (paitsi segmentti) tai muistisolu, toinen operandi voi olla rekisteri (paitsi segmentti), muistisolu tai välitön arvo, mutta sitä ei saa määrittää molemmat operandit samanaikaisesti muistisoluina. Operandit voivat olla tavuja tai sanoja ja edustaa etumerkillisiä tai etumerkittömiä lukuja. Adc-komentoa (yhdessä add-komennon kanssa) käytetään yleisesti 32-bittisten lukujen lisäämiseen. Komento vaikuttaa lippuihin OF, SF, ZF, AF, PF ja CF.

Esimerkki 1

Mov AX,1125h adc AX,2C25h ;AX=3D4Bh, jos CF oli = 1 ;AX=3D4Ah, jos CF oli = 0
Esimerkki 2; Tietokentissä: numlow dw 0FFFFh ;Toisen termin alhainen osa numhigh dw 000Sh ;2. termin korkea osa; Numero 0005FFFFh=393215 ;Ohjelmasegmentissä: mov AX,000Sh ;Matala osa termistä BX1. 0002h ; 1. lukukauden korkein osa; Numero 00020005h=131077 lisää AX,numlow;Alempien osien lisäys. AX=4, CF=1 adc BX, numhigh ;Korkeampien osien lisäys;siirto.BX:AX=0008:0004h. ;Numero 00080004h=524292
32-bittisten operandien ja 32-bittisten prosessorien lisäosoitusmuotojen käyttö on hyväksyttävää. 32-bittisten operandien adc-käskyn avulla voidaan lisätä 64-bittisiä kokonaislukuja. Esimerkki 3; Tietokentissä mem321 dd 0FFFFFFFFh ;Alhainen osa 1. termistä mem32h dd 98765432h ;Ylempi osa 1. termistä; Ohjelmasegmentissä mov EAX,1 ;2. termin alaosa mov EBX,0 ;2. termin yläosa lisää EAX,mem321 ;Lisää alapuoliskot;Summa=100000000b>32 bittiä;EAX=000000h, carry adc EBX,mem32h ;Lisää vanhemmat puolikkaat ja siirrä. EBX=90000001h ;Määrä: 9876543300000000h
LISÄÄ kokonaislukujen lisäys

Add-komento lisää ensimmäisen ja toisen operandin. Ensimmäisen operandin (kohteen) alkuperäinen arvo menetetään, ja se korvataan lisäyksen tuloksella. Toinen operandi on ennallaan. Add-komennon ensimmäinen operandi voidaan määrittää rekisteriksi (paitsi segmentti yksi) tai muistisoluksi ja toinen operandi voi olla rekisteri (paitsi segmentti yksi), muistisolu tai välitön arvo, mutta se on ei saa määrittää molempia operandeja samanaikaisesti muistisoluiksi. Operandit voivat olla tavuja tai sanoja ja edustaa etumerkillisiä tai etumerkittömiä lukuja. Add-komennolla voidaan lisätä sekä tavallisia kokonaislukuja että binäärisiä desimaalilukuja (käyttäen AX-rekisteriä tulosten tallentamiseen). Kun lisäät pakkaamattomia binäärikoodattuja desimaalilukuja (BCD), käytä aaa-komentoa add-komennon jälkeen; jos pakatut numerot lisätään, niin komento daa. Komento vaikuttaa lippuihin OF, SF, ZF, AF, PF ja CF. Esimerkki 1

Mov BX,lFFEh mov CX,3 lisää BX,CX ;BX=2001h, CX=0003h
Esimerkki 2 mov AX,25h lisää AX,12h ;AX=0037h
Esimerkki 3; Tietokentissä: mem dw 128 ;Ohjelmasegmentissä: lisää mem,100 ;mem=228
Esimerkki 4 mov AX,0507h ;BCD purettu 57 lisää AL,05h ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
Esimerkki 5 mov AL,57h ;BCD pakattu 57 add AL,05h ;BCD 5, AL=5Ch daa ;AL=62h, BCD 62

32-bittisten operandien ja 32-bittisten prosessorien lisäosoitusmuotojen käyttö on hyväksyttävää. Esimerkki

Mov EAX,98765432h lisää EAX,11111111h ; EAX=A9876543h
JA Looginen JA

and-komento suorittaa ensimmäisen operandin loogisen (bittikohtaisen) kertolaskun toisella. Ensimmäisen operandin (kohteen) alkuperäinen arvo menetetään, ja se korvataan kertolaskulla. and-komennon ensimmäinen operandi voi olla rekisteri (paitsi segmentti yksi) tai muistisolu, toinen operandi voi olla rekisteri (paitsi segmentti), muistisolu tai välitön arvo, mutta se ei saa olla määrittää molemmat operandit samanaikaisesti muistisoluiksi. Operandit voivat olla tavuja tai sanoja. Komento vaikuttaa SF-, ZF- ja PF-lippuihin. Säännöt bittikohtaiseen kertolaskuun:

Ensimmäinen operandibitti 0101 Toinen operandibitti 0011 Tulosbitti 0001 Esimerkki 1 mov AX,0FFEh ja AX,5555h ;AX=0554h Esimerkki 2; Tietokentissä: mem dw 0С003h ;Ohjelmasegmentissä: mov AX,700Eh ja AX,mem ;AX=4002h

32-bittisten operandien ja 32-bittisten prosessorien lisäosoitusmuotojen käyttö on hyväksyttävää. Esimerkki

Mov EDX, 0FA8 8 0 0 4 lh ja EDX,0FF00000Fh ; EDX = FA000001h
386P+ ARPL
Pyydetyn valitsimen käyttöoikeustason säätäminen

Aprl-komento vertaa valitsinta malliin, joka sisältää suurimman sallitun käyttöoikeustason (yleensä CS-valitsin) ja asettaa testattavan arvon kahdesta käyttöoikeustasosta alempaan. Jos tason muutosta ei vaadita, ZF-lippu nollataan; tarvittaessa se asetetaan. Aprl-käskyn ensimmäinen operandi voi olla 16-bittinen rekisteri tai muistisana, jossa on tarkistettava valitsin; toinen operandi on 16-bittinen rekisteri kuvionvalitsimella. 386+ SIDOTUA
Tarkistetaan taulukkoindeksiä rajojen ulkopuolella olevan taulukon varalta

Sidottu komento tarkistaa, onko määritetty indeksi, jota pidetään etumerkillisenä numerona, toisen operandin määrittämien rajojen sisällä. Jos indeksi ylittää ala- tai yläpuolella olevan taulukon rajojen, syntyy keskeytys vektorilla 5. Ensimmäisen operandin tulee olla tarkistettavan indeksin sisältävä rekisteri, toisen - muistikentän osoite, jossa on kaksi taulukon rajaa. tarkistetaan. Sidottu komento sallii sekä 16-bittiset että 32-bittiset operandit (mutta sekä ensimmäisen että toisen operandin on oltava samaa tyyppiä).

Kokoonpanija- Nukkejen kokoonpanokieli

Nukkejen kokoonpanokieli.(#2) (C) Mikhail Spitsyn 1995 Liput Prosessorin rekisteriä "F" kutsutaan lipuksi. Mikä se on? Lippu on muuttuja, jolla voi olla kaksi tilaa: asetettu (yhtä kuin yksi) ja tyhjennetty (yhtä kuin nolla). Siksi "F"-rekisteriä voidaan pitää kahdeksan lippubitin joukona. Voimme käyttää vain neljää niistä: nollalippua, siirtolippua, merkkilippua ja pariteettiylivuodon lippua.Aritmeettiset operaatiot. Aritmetiikka on erittäin, erittäin hyödyllinen tiede; laskemme jatkuvasti jotain: lisäämme, vähennämme, jaamme, kerromme. Puhumme nyt siitä, kuinka tämä tehdään assemblerissä. Aloitamme yksinkertaisimmalla, lisäämällä johonkin johonkin, esimerkiksi rekisteröimään "A": *************************** *** ** LD A,NUBER INC A RET ************************************ Kuten näet, se on hyvin yksinkertainen tähän on komento "INC" - inkrementti (lisää yhdellä), jota seuraa operandi, ts. jokin rekisteri tai rekisteripari: ************************************ INC A INC HL INC H INC DE INC E INC IY INC E INC (HL) INC (IX+N) INC (IY+N) ********************************** ** Jos haluat lisätä mitä tahansa muistisolua yhdellä, tee näin: ************************************* ****** *** LD HL, OSOITE LD IX, ADDRES INC (HL) INC (IX+0) RET RET ********************* *************** ***** Ensimmäinen vaihtoehto toimii nopeammin ja on kätevämpi, jos työskentelet yhden muistisolun kanssa, mutta jos työskentelet taulukossa, se ei ole taloudellinen ja ruma. Vertaa: meidän on lisättävä taulukon ensimmäistä, viidettä ja kymmenes tavua yhdellä: *********************************** * LD HL,TABL+1 LD IX,TABL INC (HL) INC (IX+1) LD HL,TABL+5 INC (IX+5) INC (HL) INC (IX+10) LD HL,TABL+10 RET INC (HL) RET ************************************ Kaikki yllä sanottu yhden korotuksesta on totta ja vähentämiseksi, ts. pienentää yhdellä: ************************************ JOULUKUU A DEC HL DEC L JOULUKUU IX JOULUKUU H JOULUK. E JOULUK. eKr JOULUKUU D JOULUKUU IY JOULUKUU C JOULUKUU IX JOULUKUU B JOULUK. (HL) JOULUK. (IX+N) JOULUK. (IX+N) ********************* *********** Oletetaan nyt, että rekisteriä "A" ei tarvitse lisätä yhdellä, vaan vaikkapa kymmenellä: **************** ***************** LD A,NUMERO ADD A,10 RET ************************* * ****** Voit lisätä rekisterin "A" numerolla ja muilla rekistereillä sekä muistisolulla, joka on osoitettu rekisteripareilla "HL", "IX" ja "IY". Voit myös lisätä rekisteripareja "HL", "IX" ja "IY". (PureBasic - tiedostojärjestelmä) ******************************** LISÄÄ A,N LISÄÄ A,(HL) LISÄÄ A ,A LISÄÄ A,(IX+N) LISÄÄ A,B LISÄÄ A,(IY+N) LISÄÄ A,C LISÄÄ HL,HL LISÄÄ A,D LISÄÄ HL,BC LISÄÄ A,E LISÄÄ HL,DE LISÄÄ A,H ADD HL,SP ADD IX,IX ADD IX,BC ADD IX,DE ADD IX,SP ******************************* ** Kuten näet, komentosarja on melko suuri. Tätä komentoa suoritettaessa voi tapahtua virhe: ************************************ LD A,45 LD B,230 ADD A ,B RET ******************************** "A" ja "B" summa ylitti 255 ja siksi "A" "" ei ole 275, vaan 20 (rekisteri "A" ei ole kumia); Ilmoittaakseen ylivuodon tapahtuneesta prosessori asettaa siirtolipun arvoon yksi. Jäljelle jää vain tarkistaa se. Aivan kuten "INC":ssä on "DEC", "ADD":ssä on myös "pari", tämä on "SUB", ja sillä on omat ominaisuutensa. "SUB"-komento toimii vain "A"-rekisterin kanssa, joten kun kirjoitetaan tämän komennon muistiinpanoja, "A" jätetään pois: ********************* *********** SUB N SUB C SUB A SUB H SUB B SUB D SUB E SUB (HL) SUB (IX+N) SUB (IY+N) ******** * ********************** Komento vaikuttaa siirtolippuun samalla tavalla kuin "LISÄÄ". Komentoparin "ADD" ja "SUB" lisäksi on toinen pari. "ADC"- ja "SBC"-komennot toimivat ottaen huomioon siirtolipun, ts. Kun lisäät tai vähennät, siirtolipun arvo lisätään (vähennetään) tulokseen. Siirtolipun asettamiseen on kaksi erikoiskomentoa - "SCF" ja "CCF". "SCF" - aseta kantolipun arvoksi yksi. "CCF" - aseta siirtolippu nollaan. ******************************** ADC A, N SBC A, N ADC A, A SBC A, A ADC A ,H SBC A,H ADC A,L SBC A,L ADC A,D SBC A,D ADC A,E SBC A,E ADC A,B SBC A,B ADC A,C SBC A,C ADC A,( HL) SBC A,(HL) ADC A,(IX+N) SBC A,(IX+N) ADC A,(IY+N) SBC A,)IY+N) ADC HL,HL SBC HL,HL ADC HL ,BC SBC HL,BC ADC HL,DE SBC HL,DE ADC HL,SP SBC HL,SP ******************************** **** Ja nyt esimerkkejä komentojen "ADC" ja "SBC" toiminnasta: ********************************* ************ * LD A,10 LD A,10 LD B,5 LD B,5 CCF CCF SBC A,B ADC A,B RET RET A=5 B=5 A=15 B=5 ******** *********************** Kahden komennon "CCF" ja "SBC A,B" sijaan voi yksinkertaisesti laittaa "SUB B", tulos on sama . ******************************** LD A, 10 LD A, 10 LD B, 5 LD B, 5 SCF SCF SBC A,B ADC A,B RET RET A=4 B=5 A=16 B=5 ******************************** **** Kuten tuloksista näkyy, siirtolippu vaikuttaa merkittävästi operaation tulokseen. Vähennettäessä se vähennetään tuloksesta, ja kun lisätään, se lisätään tulokseen. Lähes kaikki on käsitelty yhteen- ja vähennysoperaatioista, nyt puhutaan jako- ja kertolaskuista. Valitettavasti SPECCYssä ei ole jako- ja kertolaskukäskyjä, mutta nämä komennot voivat koostua useista muista. Meidän on esimerkiksi kerrottava kahden rekisterin sisältö - "A" ja "C": ********************************* ********** *** LD A,10 LD C,5 LD B,A XOR A LOOP ADD A,C DJNZ LOOP RET *************** ********** ******* Esimerkissä on kaksi uutta komentoa - "XOR A" ja "DJNZ LOOP". "XOR A" tyhjentää rekisterin "A", ja komento "DJNZ LOOP" toistaa kaikki komennot nimimerkillä merkitystä komennosta (esimerkiksi "LOOP") komentoon "DJNZ" (jota seuraa sama nimiö). ka, kuten syklin alussa); toistojen määrä on määritelty rekisterissä "B". Käyttämällä sitä tosiasiaa, että M:n kertominen N:llä lisää luvun M itseensä N kertaa, voit ymmärtää yllä olevan esimerkin. Tätä omaisuutta voidaan käyttää myös jakamiseen. Kokeile itse. Seuraavalla kerralla puhumme komennoista bittien vertailuun ja niiden kanssa työskentelemiseen.________________________________

Muita julkaisun artikkeleita:





Yläosa