Ilustrirana vadnica o Assemblerju. Aritmetična navodila v zbirnem jeziku

Ekipa ADC(Dodaj s Carry) pripada skupini celoštevilski ukazi(oz dvojiško)aritmetika (Binarna aritmetična navodila) in izvede celoštevilsko seštevanje dveh predznačenih ali nepredznačenih operandov ( DEST in SRC) In nositi zastavo EFLAGS.CF . prvi operand ( ciljni operand, DEST) je lahko spremenljivka v registru ali v pomnilniku ( , r16, r32 , r/m8, r/m16, r/m32). drugi operand ( izvorni operand, SRC) — takojšnja vrednost ( imm8, imm16, imm32), spremenljivko v registru ali v pomnilniku. V tem primeru oba operanda ne moreta biti hkrati spremenljivki v pomnilniku.

Rezultat ukaza za dodajanje ADC se postavi na mesto prvega operanda ( DEST). Zastavice v registru EFLAGS se nastavijo glede na rezultat.

Pri dodajanju takojšnje vrednosti imm8 oz imm16 pri dvo- ali štiribajtnem operandu se takojšnja vrednost najprej predznačno razširi na velikost prvega operanda in šele nato se izvede seštevanje.

Ekipa ADC običajno uporablja v večbajtnih ali večbesednih ( večbesedni) operacije dodajanja. V tem primeru sledi ukazu ADD, ki vrne vsoto nižjih bitov večbajtnih (večbesednih) operandov, kar omogoča, da se pri dodajanju višjih bitov upošteva prenos. Na primer:

mov edx, 0; EDX = 0
mov eax, 0FFFFFFFFh ; prvi 32-bitni izraz je postavljen v EAX
dodaj eax, 0FFFFFFFFh ; drugi 32-bitni izraz - 0x FFFFFFFFh, dodajte dva 32-bitna operanda
adc edx, 0; EDX = EDX + CF, upoštevajte prenos
; EDX:EAX = 0000000lh:FFFFFFFEh - prejet 64-bitni rezultat

Ekipa ADC vam omogoča, da manipulirate s celimi operandi kot v nepodpisana oblika, kot tudi v podpisan format. Dodajanje podpisanih podatkov znak zastava EFLAGS.SF bo odražal predznak rezultata. zastavica za prelivanje EFLAGS.OF bo nastavljen na 1, če ima dodatek celoštevilskih vrednosti s predznakom, predstavljenih v inverzni kodi ali v kodi komplementa dveh, preliv (prenos iz najpomembnejšega bita, ki ustreza bitu pred bitom predznaka), to je , dobljeni rezultat presega razpoložljivo velikost cilja operanda ( DEST). V bistvu je to podobno temu, kako zastavica EFLAGS.CF odraža prelivanje (prenos) pri dodajanju nepodpisani operandi. Na primer, ko dodate dve 32-bitni vrednosti, predstavljeni v obratni kodi, je lahko videti takole:

mov eax, operand1 ; EAX = operand1, postavite prvi 32-bitni izraz v EAX
dodaj eax, operand2 ; izvesti seštevanje dveh 32-bitnih operandov v obratni kodi
v; skoči na upravljalnik prekinitev v primeru prelivanja

adc eax, 0; EAX = EAX + CF, upoštevajte prenos (potreben za dodatek v povratni kodi)
; EAX = operand1 + operand2 - rezultat seštevanja v obratni kodi
jns m1; skok, če je rezultat pozitiven
xor eax, 7FFFFFFFh ; pretvorbo negativne vrednosti v EAX v neposredno kodo
m1: ; EAX - rezultat seštevanja v neposredni kodi

Pomožna zastava(oz dodatno)prenos EFLAGS.AF pomaga manipulirati s podatki v formatu BCD ( pakiran format BCD). Nastavljeno je, če seštevanje povzroči prenos iz nižje tetrade v višjo tetrado nizkega bajta rezultata. Z uporabo ukaza DAA takoj za ukazom ADC, možna je izdelava t.i decimalni popravek rezultat seštevanja in v istem dobite vsoto pakiran format BCD, kot izvirni pogoji.

Ekipa ADC s ciljnim operandom ( DEST), ki je spremenljivka v pomnilniku, se lahko uporablja v povezavi s predpono ključavnice LOCK, ki bo zagotovila, da se ukaz atomično izvede.

Ukazi za dodajanje - ADD, ADC

Navodila ADD (dodaj - dodaj) in ADC (dodaj s prenosom) lahko dodajo tako 8-bitne kot 16-bitne operande.

Ukaz ADD doda vsebino izvornega operanda in ciljnega operanda ter rezultat postavi v ciljni operand.

Oblika ukaza: DODAJ sprejemnik, vir

V simbolnem zapisu lahko njegova dejanja opišemo na naslednji način: ponor: = ponor + izvor (vsota vsebine ponora in vira je zapisana v ponor).

Ukaz ADC deluje enako kot ukaz ADD, le da doda tri izraze namesto dveh: cilj, izvor in zastavico za prenos.

Oblika ukaza: ADC sprejemnik, vir + CF

V simbolnem zapisu lahko njegova dejanja opišemo kot:

destinacija:= destinacija + vir + vsebina nosilne zastavice.

Prenos pri dodajanju binarnih števil je podoben prenašanju pri dodajanju decimalnih števil v stolpcu. Ko računalnik doda binarna števila in se vsota ne prilega sprejemnemu operandu, se ustvari prenos. Kot veste, lahko 8-bitni register vsebuje nepodpisane vrednosti v območju od 0 do 255. Če na primer izvedemo binarno seštevanje števil 250 in 10, dobimo naslednji rezultat:

1111 1010; binarna predstavitev števila 250.

0000 1010 ; binarna predstavitev števila 10.

1 0000 0100; dvojiška predstavitev vsote, ki je enaka 260.

Rezultat je pravilen, vendar zavzema 9 binarnih bitov. Če so bili uporabljeni 8-bitni registri, bo spodnjih 8 bitov vnesenih v ciljni register, deveti bit pa v prenosno zastavo CF.

Zdaj je jasno, zakaj ima mikroprocesor 8086 dve različni navodili za dodajanje. Eden od njih (ADD) lahko doda vrednosti, ki jih predstavljajo bajti ali besede, pa tudi spodnje dele visoko natančnih vrednosti. Drugo navodilo (ADC) se uporablja za dodajanje višjih delov vrednosti višje natančnosti.

Operandi, ki jih je treba dodati, so lahko v pomnilniku, registru ali imajo takojšnjo vrednost. Na primer:

ADD AX,MEM_WORD; dodati vsebino pomnilniške celice v register,

ADD MEM_WORD,AX; ali obratno, dodajte vsebino registra v pomnilniško celico.

DODAJ AL, 10; dodati konstanto v vsebino registra.

ADD MEM_BYTE,8H; dodajte konstanto in vsebino pomnilniške celice.

Dovoljena je večina možnih kombinacij, vendar je prepovedano dodati vsebino dveh pomnilniških celic ali uporabiti takojšnjo vrednost (število) kot sprejemnik.

Ukaza ADD in ADC lahko vplivata na naslednjih šest zastavic:

nositi zastavo CF je 1, če se rezultat dodajanja ne prilega ciljnemu operandu, sicer je 0;

paritetna zastava PF je 1, če ima rezultat sodo število bitov z vrednostjo 1, drugače je 0;

AF je enak 1, če rezultat seštevanja decimalnih števil zahteva popravek;

ničelna zastavica ZF je 1, če je rezultat 0;

znak zastava SF je 1, če je rezultat negativen (najpomembnejši bit je 1), drugače je 0;

zastavica za prelivanje OF je enak 1, če vsota dveh števil istega znaka presega obseg dovoljenih vrednosti sprejemnika v inverzni kodi in sam sprejemnik spremeni znak. V nasprotnem primeru je zastavica OF 0.

Ukaz za povečanje vrednosti sprejemnika za eno - INC

Ekipa INC(inkrement - inkrement) doda 1 vsebini registra ali pomnilniške lokacije, vendar za razliko od ukaza ADD ne vpliva na nosilno zastavico CF. Oblika ukaza: INC sprejemnik.

Instrukcija INC je uporabna za inkrementiranje števcev v ukaznih zankah. Uporablja se lahko tudi za povečanje vrednosti indeksnega registra pri dostopu do zaporednih pomnilniških lokacij. Operand se interpretira kot nepredznačeno število.

Na primer:

INC.CX; povečati vrednost 16-bit

I.N.C.AL; ali 8-bitni register na enoto.

INC MEM_BYTE; povečati vrednost bajta

INC MEM_WORD; ali besed spomina na enoto.

Takojšnja vrednost ni dovoljena kot operand.

Ukazi za odštevanje - SUB in odštevanje z izposojo SBB

Ekipe SUB(odšteti - odšteti) in SBB(odštevanje z izposojo - odštevanje z izposojo) so podobni navodilom za seštevanje ADD oziroma ADC, le da pri odštevanju zastavica CF deluje kot znak izposoje. Oblika ukaza: SUB sprejemnik, vir;

Ukaz SUB odšteje izvorni operand od ciljnega operanda in rezultat postavi v cilj v simbolnem zapisu:

ponor:= ponor - vir.

Ekipa SBB naredi isto, vendar dodatno odšteje vrednost nosilne zastavice CF od sprejemnika:

SUB sprejemnik, vir - CF;

Cilj:= cilj - vir - vsebina nosilne zastavice.

Kot pri dodajanju, ukazi SUB in SBB opravljata dve ločeni funkciji. Prvi ukaz odšteje števila v velikosti bajtov ali besed, pa tudi nižje bite števil z visoko natančnostjo (nižji del števila se nahaja v registru AX, višji del pa v registru DX). ). Drugi ukaz odšteje višje bite števil z večjo natančnostjo. Na primer ukaz SUB AX,CX; Odšteje vsebino CX od vsebine AX in vrne rezultat v AX.

Če velikosti operandov presegajo 16 bitov, je treba uporabiti naslednje zaporedje ukazov:

SUB AX, CX; Odštejte spodnjih 16 bitov;

SBB BX,DX; in nato zgornjih 16 bitov.

Tukaj od 32-bitnega števila v registrih AX in BX odštejemo 32-bitno število v registrih CX in DX. Pri odštevanju vsebine registra DX od vsebine registra BX inštrukcija SBB upošteva možnost izposoje ob izvedbi prvega odštevanja.

SUB SEKIRA, MEM; Odštejte vsebino pomnilniške celice od registra.

PODMEM,OS; Odštej register iz pomnilniške celice.

SUB AL,1O; Odštejte konstanto od registra.

SUB MEM_BYTE,OFh; Od pomnilniške celice odštejte konstanto.

Ni ga mogoče neposredno odšteti vsebino ene pomnilniške lokacije z druge ali uporabite takojšnjo vrednost kot cilj.

Ukaza SUB in SBB lahko vplivata na šest zastavic, kot sledi:

namestite nositi zastavo CF na 1, če je potrebno posojilo, sicer je 0;

namestite paritetna zastava PF na 1, če ima rezultat odštevanja sodo število bitov z vrednostjo 1, sicer je 0;

namestite pomožna nosilna zastavica AF na 1, če je treba rezultat odštevanja decimalnih števil popraviti, sicer je 0;

namestite ničelna zastavica ZF na 1, če je rezultat 0, drugače je 0;

namestite znak zastava SF na 1, če je rezultat negativen (najpomembnejši bit je 1), sicer je zastavica 0;

namestite zastavica za prelivanje OF na 1, če rezultat odštevanja presega obseg sprejemnikovih vrednosti v inverzni kodi in sam sprejemnik spremeni znak.

Zastavici SF in OF sta smiselni samo pri odštevanju predznačenih števil, zastavica AF pa samo pri odštevanju decimalnih števil.

Ukaz za zmanjšanje vsebine sprejemnika - DEC

Ekipa sprejemnik DEC(dekrement) odšteje 1 od vsebine registra ali pomnilniške lokacije, vendar (za razliko od ukaza SUB) ne vpliva na nosilno zastavico CF.

Ukaz DEC se pogosto uporablja v zankah za zmanjševanje števca, dokler ni nič ali negativen. Uporablja se lahko tudi za zmanjšanje indeksnega registra ali kazalca pri dostopu do zaporednih pomnilniških lokacij. Na primer:

DECCX; Zmanjšajte vrednost 16-bitnega,

NALEPKA; ali 8-bitni register.

DEC MEM_BYTE; Zmanjšajte vrednost bajta,

DEC MEM_WORD; ali besedno spominsko celico.

Divizijski ukazi - DIV, IDIV

Ekipa DIV(divide - divide) izvede deljenje brez predznaka in ukaz IDIV(integer divide - deli cela števila) izvaja deljenje predpisanih števil. Ti ukazi so v formatu:

vir div; Kje vir- velikost delilnika v bajtih ali besedah,

vir IDIV;ki se nahaja v splošnem registru ali pomnilniški lokaciji.

Bodite pozorni na naslednje:

1. Dividenda glede na delitelj mora imeti dvojno velikost.

2. Dividenda mora biti vedno v registru AX (če je deljeno z 8-bitnim številom) ali v registrih DX in AX (če je deljeno s 16-bitnim številom).

3. Rezultati ukaza so vrnjeni na naslednji način:

· če je izvorni operand bajt, potem se količnik vrne v register AL, ostanek pa v register AH;

· če je izvorni operand beseda, se količnik vrne v register AX, ostanek pa v register DX.

Oba ukaza pustita stanje zastavic nedefinirano, če pa količnik ne sodi v ciljni register (AL ali AX), potem mikroprocesor generira prekinitev tipa 0 (deljenje z 0).

4. Do presežka rezultata deljenja pride pod naslednjimi pogoji:

delitelj je 0;

· pri deljenju nepredznačenih bajtov je dividenda vsaj 256-kratnik delitelja;

· pri deljenju nepredznačenih besed je dividenda najmanj 65,536-kratnik delitelja;

· pri deljenju predznačenih bajtov količnik leži izven območja od -128 do +127;

pri deljenju besed z znakom je količnik zunaj območja od

32768 do 32767.

Tu je nekaj tipičnih primerov operacij deljenja:

DIV BX; Deli DX:AX z BX, brez predznaka.

DIV MEM_BYTE; Razdeli AX z bajtom pomnilnika, brez predznaka.

IDIV DL; Deli AX s predpisanim DL.

IDIV MEM WORD; Razdelite DX:AX s predpisano spominsko besedo.

Navodila DIV in IDIV ne delijo neposredno s takojšnjo vrednostjo, ker procesor ne more določiti vrste podatkov delitelja.

Navodila za množenje - MUL, IMUL

Ekipa MUL(množi-množi) množi nepredznačena števila, a IMUL(integer multiply) pomnoži cela števila s predznakom. Množitelj in množitelj obeh ukazov morata biti iste vrste podatkov, tj. bajtov, besed, dvojnih besed itd.

Ti ukazi imajo naslednjo obliko:

vir MUL; Kje vir- splošni register,

vir IMUL; ali pomnilniško celico z velikostjo bajtov ali besedo.

Kot prvi operand (množilnik) ukazi MUL in IMUL uporabljajo vsebino registra AL (za operacije nad bajti) ali registra AX (za operacije nad besedami). Izdelek ima dvojno velikost in se vrača na naslednji način:

· množenje bajtov- vrne 16-bitni produkt v registrih AH (visoki bajt) in AL (nizki bajt);

· množenje besede- vrne 32-bitni izdelek v registra DX (visoka beseda) in AX (nizka beseda). Torej velikost izdelka n- bitni faktorji so enaki 2n.

ADC Integer seštevanje s prenosom

Ekipa adc izvede seštevanje prvega in drugega operanda ter rezultatu doda vrednost nosilne zastavice CF. Prvotna vrednost prvega operanda (sprejemnika) je izgubljena in nadomeščena z rezultatom seštevanja. Drugi operand je nespremenjen. Kot prvi operand ukaza adc

Operandi so lahko bajti ali besede in predstavljajo predznačena ali nepredznačena števila. Ekipa adc(skupaj z ekipo dodati) se običajno uporablja za seštevanje 32-bitnih števil. Ukaz vpliva na zastavice OF, SF, ZF, AF, PF in CF.

Primer 1:

Mov AX,1125h adc AX,2C25h; AX=3D4Bh, če je bil CF = 1; AX=3D4Ah, če je bil CF = 0

Primer 2:

; V podatkovnih poljih: numlow dw 0FFFFh; Spodnji del 2. člena numhigh dw 000Sh; Zgornji del 2. roka;Številka 0005FFFFh=393215 ;V programskem segmentu: mov AX,000Sh; Spodnji del 1. člena mov BX,0002h; Najvišji del 1. člena;Številka 00020005h=131077 add AX,numlow; Dodajanje manjših delov. AX=4, CF=1 adc BX, numhigh; Dodatek višjih delov s prenosom. BX:AX=0008:0004h. ;Številka 00080004h=524292

Dovoljena je uporaba 32-bitnih operandov in dodatnih načinov naslavljanja 32-bitnih procesorjev. Ekipa adc z 32-bitnimi operandi lahko uporabite za dodajanje 64-bitnih celih števil.

Primer:

; V podatkovnih poljih mem321 dd 0FFFFFFFFh; Spodnji del 1. člena mem32h dd 98765432h; Starejši del 1. roka; V segmentu programa mov EAX,1; Spodnji del 2. člena mov EBX,0; Visoki del 2. člena add EAX,mem321; Dodajte spodnje polovice;Sum=100000000h>32 bitov;EAX=000000h, prenos adc EBX,mem32h; Zgornje polovice prepognemo in preložimo. EBX=90000001h; Znesek: 9876543300000000h

ADD Integer seštevanje

Ekipa dodati izvede seštevanje prvega in drugega operanda. Prvotna vrednost prvega operanda (sprejemnika) je izgubljena in nadomeščena z rezultatom seštevanja. Drugi operand je nespremenjen. Kot prvi operand ukaza dodati lahko določite register (razen segmenta ena) ali pomnilniško celico, kot drugo - register (razen segmenta ena), pomnilniško celico ali takojšnjo vrednost, vendar ni dovoljeno definirati obeh operandov hkrati. kot spominske celice.

Operandi so lahko bajti ali besede in predstavljajo predznačena ali nepredznačena števila. Ukaz add se lahko uporablja za dodajanje običajnih celih števil in binarnih decimalnih mest (z uporabo registra AX za shranjevanje rezultata). Če so dodana nepakirana binarno kodirana decimalna (BCD) števila, za ukazom dodati uporabiti je treba ukaz aaa; če so dodane pakirane številke, potem ukaz daa. Ukaz vpliva na zastavice OF, SF, ZF, AF, PF in CF.

Primer 1:

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

Primer 2:

Mov AX,25h dodaj AX,12h; AX=0037h

Primer 3:

; V podatkovnih poljih: mem dw 128 V segmentu programa: add mem,100; mem=228

ADC Integer seštevanje s prenosom

Ukaz adc sešteje prvi in ​​drugi operand ter rezultatu doda vrednost zastavice za prenos CF. Prvotna vrednost prvega operanda (sprejemnika) je izgubljena in nadomeščena z rezultatom seštevanja. Drugi operand je nespremenjen. Kot prvi operand ukaza adc lahko določite register (razen segmenta) ali pomnilniško celico, kot drugi - register (razen segmenta), pomnilniško celico ali takojšnjo vrednost, vendar ne sme podati obeh operandov hkrati kot pomnilniške celice. Operandi so lahko bajti ali besede in predstavljajo predznačena ali nepredznačena števila. Ukaz adc (skupaj z ukazom add) se običajno uporablja za dodajanje 32-bitnih števil. Ukaz vpliva na zastavice OF, SF, ZF, AF, PF in CF.

Primer 1

Mov AX,1125h adc AX,2C25h ;AX=3D4Bh, če je bil CF = 1 ;AX=3D4Ah, če je bil CF = 0
Primer 2; V podatkovnih poljih: numlow dw 0FFFFh ;Spodnji del 2. člena numhigh dw 000Sh ;Višji del 2. člena;Številka 0005FFFFh=393215 ;V segmentu programa: mov AX,000Sh ;Spodnji del 1. člena mov BX,0002h ; Najvišji del 1. člena;Številka 00020005h=131077 add АХ,numlow ;Seštevanje spodnjih delov. AX=4, CF=1 adc BX, numhigh ;Številka 00080004h=524292
Dovoljena je uporaba 32-bitnih operandov in dodatnih načinov naslavljanja 32-bitnih procesorjev. Ukaz adc z 32-bitnimi operandi je mogoče uporabiti za dodajanje 64-bitnih celih števil. Primer 3; V podatkovnih poljih mem321 dd 0FFFFFFFFh ;Spodnji del 1. člena mem32h dd 98765432h ;Višji del 1. člena; V programskem segmentu mov EAX,1 ;Nižji del 2. člena mov EBX,0 ;Višji del 2. člena dodaj EAX,mem321 ;Dodaj spodnje polovice;Sum=100000000b>32 bitov;EAX=000000h, nosi adc EBX,mem32h ; Mi dodajte starejše polovice in prenesite. EBX=90000001h ; Znesek: 9876543300000000h
ADD Integer seštevanje

Ukaz add doda prvi in ​​drugi operand. Prvotna vrednost prvega operanda (sprejemnika) je izgubljena in nadomeščena z rezultatom seštevanja. Drugi operand je nespremenjen. Kot prvi operand ukaza add lahko določite register (razen segmenta) ali pomnilniško celico, kot drugi - register (razen segmenta), pomnilniško celico ali takojšnjo vrednost, vendar ne sme definirati obeh operandov hkrati kot pomnilniške celice. Operandi so lahko bajti ali besede in predstavljajo predznačena ali nepredznačena števila. Ukaz add se lahko uporablja za dodajanje običajnih celih števil in binarnih decimalnih mest (z uporabo registra AX za shranjevanje rezultata). Če se dodajajo nepakirana binarna decimalna (BCD) števila, je treba za ukazom za dodajanje uporabiti ukaz aaa; če se pakirana števila seštejejo, potem ukaz daa. Ukaz vpliva na zastavice OF, SF, ZF, AF, PF in CF. Primer 1

Mov BX,lFFEh mov CX,3 dodaj BX,CX ;BX=2001h, CX=0003h
Primer 2 mov AX,25h dodaj AX,12h ;AX=0037h
Primer 3; V podatkovnih poljih: mem dw 128 ;V programskem segmentu: dodajte mem,100 ;mem=228
Primer 4 mov AX,0507h ;BCD nepakirano 57 dodaj AL,05h ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
Primer 5 mov AL,57h ;BCD pakirano 57 dodaj AL,05h ;BCD 5, AL=5Ch daa ;AL=62h, BCD 62

Dovoljena je uporaba 32-bitnih operandov in dodatnih načinov naslavljanja 32-bitnih procesorjev. Primer

Mov EAX,98765432h dodaj EAX,11111111h ; EAX=A9876543h
IN Logično IN

Ukaz in izvede logično (bitno) množenje prvega operanda z drugim. Prvotna vrednost prvega operanda (sprejemnika) se izgubi in jo nadomesti rezultat množenja. Kot prvi operand ukaza in lahko določite register (razen segmenta) ali pomnilniško celico, kot drugi - register (razen segmenta), pomnilniško celico ali takojšnjo vrednost, vendar je ni dovoljeno definirati obeh operandov hkrati kot pomnilniške celice. Operandi so lahko bajti ali besede. Ukaz vpliva na zastavice SF, ZF in PF. Pravila bitnega množenja:

Prvi operand bit 0101 Drugi operand bit 0011 Rezultat bit 0001 Primer 1 mov AX,0FFEh in AX,5555h ;AX=0554h Primer 2; V podatkovnih poljih: mem dw 0С003h ;V segmentu programa: mov AX,700Eh in AX,mem ;AX=4002h

Dovoljena je uporaba 32-bitnih operandov in dodatnih načinov naslavljanja 32-bitnih procesorjev. Primer

Mov EDX, 0FA8 8 0 0 4 lh in EDX,0FF00000Fh ; EDX=FA000001h
386P+ARPL
Popravek zahtevane ravni privilegijev izbirnika

Ukaz aprl primerja izbirnik z vzorcem, ki vsebuje največjo dovoljeno raven privilegijev (običajno izbirnik CS) in nastavi vrednost, ki jo je treba preveriti, na nižjo od dveh ravni privilegijev. Če sprememba ravni ni bila potrebna, se zastavica ZF ponastavi, če je potrebna, se nastavi. Prvi operand ukaza aprl je lahko 16-bitni register ali pomnilniška beseda z izbirnikom, ki ga je treba preveriti; kot drugi operand 16-bitni register z izbirnikom vzorcev. 386+ ZVEZANO
Preverjanje indeksa matrike za matriko izven meja

Ukaz bound preveri, ali podani indeks, obravnavan kot predznačeno število, leži znotraj meja, ki jih določa drugi operand. Če je indeks zunaj meja na dnu ali vrhu matrike, se generira prekinitev z vektorjem 5. Prvi operand mora biti register, ki vsebuje indeks, ki se preverja, drugi operand mora biti naslov pomnilniškega polja z dvema meje polja, ki se preverja. Vezani ukaz sprejme tako 16-bitne kot 32-bitne operande (vendar morata biti tako prvi kot drugi operand istega tipa).

sestavljalec- Sestavljalnik za lutke

Sestavljalnik za lutke.(#2) (C) Mikhail Spitsyn 1995 Zastave Register "F" procesorja se imenuje zastavica. Kaj je to? Zastavica je spremenljivka, ki ima lahko dve stanji - nastavljeno (enako ena) in počiščeno (enako nič). Zato si lahko register "F" predstavljamo kot niz osmih zastavic. Uporabimo lahko le štiri od njih: ničelno zastavo, nosilno zastavo, predznakovalno zastavico in paritetno-prelivno zastavico.Aritmetične operacije. Aritmetika je zelo, zelo uporabna veda, nenehno nekaj štejemo: seštevamo, odštevamo, delimo, množimo. O tem, kako to storiti v monterju, bomo zdaj govorili. Začnimo z najpreprostejšim, dodamo enega nečemu, na primer v register "A": ***************************** * ** LD A,NUBER INC A RET *********************************** Kot lahko vidite, je zelo preprosto, za to obstaja ekipa "INC" - inkrement (povečanje za eno), za njim pride operand, tj. nek register ali registrski par: *********************************** INC A INC HL INC H INC DE INC E INC IY INC E INC (HL) INC (IX+N) INC (IY+N) ***************************** * ** Če morate katero koli pomnilniško celico povečati za eno, naredite to: ******************************* * *** LD HL,NASLOV LD IX,NASLOV INC (HL) INC (IX+0) RET RET ************************** **** ***** Prva možnost je hitrejša in priročnejša, če delate z eno pomnilniško celico, če pa delate v tabeli, ni ekonomična in grda. Primerjaj: prvi, peti in deseti bajt v tabeli moramo povečati za ena: ******************************* **** 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 *********************************** Vse, kar je zgoraj povedano o povečanju z eno velja in za dekrement, tj. zmanjšati za eno: *********************************** DEC A DEC HL DEC L DEC IX DEC H DEC DE DEC E DEC BC DEC D DEC IY DEC C DEC IX DEC B DEC (HL) DEC (IX+N) DEC (IX+N) ***************** *** *********** In zdaj predpostavimo, da moramo register "A" povečati ne za eno, ampak, recimo, za deset: ************ ******** *************** LD A,ŠTEVILKA ADD A,10 RET ******************* ******** ****** Registru "A" lahko dodate številko in druge registre ter pomnilniško celico, naslovljeno s pari registrov "HL", "IX" in "IY". Dodate lahko tudi registrske pare z "HL", "IX" in "IY". (PureBasic - datotečni sistem) *********************************** ADD A,N ADD A,(HL ) ADD A ,A ADD A,(IX+N) ADD A,B ADD A,(IY+N) ADD A,C ADD HL,HL ADD A,D ADD HL,BC ADD A,E ADD HL,DE ADD A,H ADD HL,SP ADD IX,IX ADD IX,BC ADD IX,DE ADD IX,SP *************************** *** ** Kot lahko vidite, je nabor ukazov precej velik. Pri izvajanju tega ukaza lahko pride do napake: *********************************** LD A,45 LD B ,230 ADD A ,B RET ******************************** Vsota "A" in "B" presežena 255 in zato se v "A" ne bo izkazalo 275, ampak 20 (register "A" ni guma); tako da vemo, da je prišlo do prelivanja, procesor nastavi zastavico za prenos na ena. Ostaja samo še preveriti. Tako kot ima "INC" "DEC", ima "ADD" tudi "par", to je "SUB" in ima svoje značilnosti. Ekipa "SUB" deluje samo z registrom "A", zato se pri pisanju mnemonike tega ukaza "A" izpusti: ********************* ** ********* SUB N SUB C SUB A SUB H SUB B SUB D SUB E SUB (HL) SUB (IX+N) SUB (IY+N) ********* ** *********************** Ukaz vpliva na zastavico prenosa na enak način kot "ADD". Poleg para ukazov "ADD" in "SUB" obstaja še en par. Ukaza "ADC" in "SBC" delujeta z zastavico za prenos, tj. pri seštevanju ali odštevanju se rezultatu prišteje (odšteje) vrednost nosilne zastavice. Obstajata dva posebna ukaza za nastavitev zastavice za prenos - to sta "SCF" in "CCF". "SCF" - nastavite zastavico za prenos na eno. "CCF" - nastavite zastavico za prenos na nič. ******************************** 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 **************************** **** In zdaj primera ukazov "ADC" in "SBC": ******************************* * 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 ********* * ************************ Namesto dveh ukazov "CCF" in "SBC A, B" lahko vnesete samo "SUB B", rezultat bo bodi enak. ******************************** 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 **************************** **** Kot je razvidno iz rezultatov, nosilna zastavica pomembno vpliva na rezultat operacije. Pri odštevanju se od rezultata odšteje, pri seštevanju pa prišteje rezultatu. O operacijah seštevanja in odštevanja je skoraj vse povedano, zdaj bomo govorili o deljenju in množenju. Na žalost SPECCY nima ekip za deljenje in množenje, vendar te ekipe lahko sestavlja več drugih. Na primer, moramo pomnožiti vsebino dveh registrov - "A" in "C": ***************************** *** LD A,10 LD C,5 LD B,A XOR A ZANKA ADD A,C DJNZ ZANKA RET ************************* ******* V primeru sta dva nova ukaza - "XOR A" in "DJNZ LOOP". "XOR A" ponastavi register "A", ukaz "DJNZ LOOP" pa ponovi vse ukaze, od ukaza, označenega z oznako (na primer "LOOP"), do ukaza "DJNZ" (slediti mu mora ista oznaka).ka, kot na začetku cikla); število ponovitev je nastavljeno v registru "B". Z uporabo dejstva, da množenje M z N pomeni dodajanje M samemu sebi N-krat, se lahko lotite zgornjega primera. To lastnino lahko uporabite tudi za delitev. Poskusite to narediti sami. Naslednjič bomo govorili o ukazih za primerjavo in bitne manipulacije.________________________________

Drugi članki številke:





Vrh