Ilustrovaný návod na Assembler. Montážne aritmetické pokyny

Tím ADC(Add with Carry) patrí do skupiny celočíselné príkazy(alebo binárne)aritmetika (Binárne aritmetické inštrukcie) a vykoná sčítanie celého čísla dvoch operandov so znamienkom alebo bez znamienka ( DEST A SRC) A niesť vlajku EFLAGS.CF . Prvý operand ( cieľový operand, DEST) môže byť premenná v registri alebo v pamäti ( , r16, R32 , r/m8, r/m16, r/m32). Druhý operand ( zdrojový operand, SRC) - bezprostredný význam ( imm8, imm16, imm32), premenná v registri alebo v pamäti. V tomto prípade oba operandy nemôžu byť súčasne premennými v pamäti.

Výsledok sčítania príkazom ADC sa umiestni na miesto prvého operandu ( DEST). Podľa výsledku sa nastavia príznaky v registri EFLAGS.

Pri pridávaní priamej hodnoty imm8 alebo imm16 pri dvojbajtovom alebo štvorbajtovom operande sa okamžitá hodnota najskôr rozšíri so znamienkom na veľkosť prvého operandu a až potom sa vykoná sčítanie.

Tím ADC zvyčajne sa používa vo viacbajtových alebo viacslovných ( viacslovný) operácie sčítania. V tomto prípade nasleduje inštrukcia ADD, ktorá vracia súčet bitov nižšieho rádu viacbajtových (viacslovných) operandov, čo umožňuje brať do úvahy prenos pri pridávaní bitov vyššieho rádu. Napríklad:

mov edx, 0 ; EDX = 0
mov eax, 0FFFFFFFFh ; Prvý 32-bitový doplnok je umiestnený v EAX
pridaj eax, 0FFFFFFFFh ; druhý 32-bitový doplnok - 0x FFFFFFFFh, pridáme dva 32-bitové operandy
adc edx, 0; EDX = EDX + CF, berte do úvahy prenos
; EDX:EAX = 0000000lh:FFFFFFFEh – výsledný 64-bitový výsledok

Tím ADC umožňuje manipuláciu s celočíselnými operandmi ako v nepodpísaný formát, a v podpísaný formát. Pri pridávaní údajov so znamienkom podpísať vlajku EFLAGS.SF bude odrážať znamienko získaného výsledku. Vlajka pretečenia EFLAGS.OF sa nastaví na 1, ak pri pridávaní celočíselných hodnôt so znamienkom reprezentovaných dvojkovým doplnkom alebo dvojkovým doplnkom dôjde k pretečeniu (pretečeniu od najvýznamnejšieho bitu, ktorému zodpovedá bit predchádzajúci znamienkovému bitu), tj. výsledný výsledok presahuje dostupnú veľkosť operandov -ustanovenia ( DEST). V podstate je to podobné tomu, ako príznak EFLAGS.CF odráža pretečenie (carry) pri pridávaní nepodpísané operandy. Napríklad pri pridávaní dvoch 32-bitových hodnôt znázornených v reverznom kóde to môže vyzerať takto:

mov eax, operand1 ; EAX = operand1, prvý 32-bitový doplnok je umiestnený v EAX
pridať eax, operand2 ; pridáme dva 32-bitové operandy v reverznom kóde
do ; skok na obsluhu prerušenia v prípade pretečenia

adc eax, 0 ; EAX = EAX + CF, berte do úvahy prenos (potrebné na pridanie v opačnom kóde)
; EAX = operand1 + operand2 - výsledok sčítania v opačnom kóde
jns ml; prechod, ak je výsledok pozitívny
xor eax, 7FFFFFFFFh ; prevod zápornej hodnoty v EAX na priamy kód
m1: ; EAX - výsledok sčítania v priamom kóde

Pomocná vlajka(alebo dodatočné)prevod EFLAGS.AF pomáha manipulovať s údajmi vo formáte BCD ( zabalený formát BCD). Nastaví sa, ak počas sčítania dôjde k prenosu z nižšej tetrády na vysokú tetrádu nízkeho bajtu výsledku. Použitie príkazu DAA bezprostredne po príkaze ADC, je možné vyrobiť tzv desiatková korekcia výsledok sčítania a získajte súčet v tom istom zabalený formát BCD, ako aj pôvodné podmienky.

Tím ADC s cieľovým operandom ( DEST), čo je pamäťová premenná, je možné použiť v spojení s predponou LOCK lock, ktorá zabezpečí atomické vykonanie príkazu.

Príkazy na sčítanie - ADD, ADC

Inštrukcie ADD (add) a ADC (add with carry) môžu pridať 8- aj 16-bitové operandy.

Inštrukcia ADD pridá obsah zdrojového operandu a cieľového operandu a umiestni výsledok do cieľového operandu.

Formát príkazu: PRIDAŤ prijímač, zdroj

V symbolickom zápise možno jeho pôsobenie opísať takto: drez:= drez + zdroj (súčet obsahu drezu a zdroja sa zapisuje do drezu).

Príkaz ADC robí to isté ako príkaz ADD, ale nepridáva dva, ale tri výrazy: cieľ, zdroj a príznak prenosu.

Formát príkazu: ADC prijímač, zdroj + CF

V symbolickom zápise možno jeho akcie opísať ako:

sink:= sink + zdroj + obsah prenášacieho príznaku.

Prenášanie pri pridávaní binárnych čísel je podobné prenášaniu pri pridávaní desatinných čísel do stĺpca. Keď počítač pridá binárne čísla a súčet sa nezmestí do cieľového operandu, vygeneruje sa prenos. Ako viete, 8-bitový register môže obsahovať hodnoty bez znamienka v rozsahu od 0 do 255. Ak napríklad vykonáme binárne sčítanie čísel 250 a 10, dostaneme nasledujúci výsledok:

1111 1010; binárne znázornenie čísla 250.

0000 1010 ; binárne znázornenie čísla 10.

1 000 0100; binárne vyjadrenie sumy rovnajúcej sa 260.

Výsledok je správny, ale zaberá 9 binárnych bitov. Ak boli použité 8-bitové registre, potom sa spodných 8 bitov vloží do cieľového registra a deviaty bit do CF príznaku prenosu.

Teraz chápeme, prečo má mikroprocesor 8086 dve rôzne inštrukcie na sčítanie. Jeden z nich (ADD) môže pridávať hodnoty reprezentované bajtmi alebo slovami, ako aj spodné časti vysoko presných hodnôt. Ďalšia inštrukcia (ADC) sa používa na pridanie hodnôt s vysokou presnosťou.

Operandy, ktoré sa majú pridať, môžu byť v pamäti, v registri alebo môžu mať okamžitú hodnotu. Napríklad:

PRIDAŤ AX,MEM_WORD; pridať obsah pamäťovej bunky do registra,

PRIDAŤ MEM_WORD,AX; alebo naopak, pridajte obsah registra do pamäťovej bunky.

PRIDAŤ AL, 10; pridať konštantu k obsahu registra.

PRIDAŤ MEM_BYTE,8H; pridajte konštantu a obsah pamäťovej bunky.

Väčšina možných kombinácií je povolená, ale je zakázané pridajte obsah dvoch pamäťových buniek alebo použite priamu hodnotu (číslo) ako prijímač.

Príkazy ADD a ADC môžu ovplyvniť nasledujúcich šesť príznakov:

niesť vlajku CF je 1, ak sa výsledok sčítania nezmestí do cieľového operandu, inak je 0;

paritná vlajka PF je 1, ak má výsledok párny počet bitov s hodnotou 1, inak je 0;

AF sa rovná 1, ak výsledok sčítania desatinných čísel vyžaduje opravu;

nulová vlajka ZF je 1, ak je výsledok 0;

podpísať vlajku SF je 1, ak je výsledok záporný (najdôležitejší bit je 1), inak je 0;

vlajka pretečenia OF sa rovná 1, ak súčet dvoch čísel rovnakého znamienka prekročí rozsah prijateľných hodnôt prijímača v reverznom kóde a samotný prijímač zmení znamienko. V opačnom prípade je príznak OF 0.

Príkaz na zvýšenie hodnoty prijímača o jeden - INC

Tím INC(prírastok) pridá 1 k obsahu registra alebo pamäťovej bunky, ale na rozdiel od inštrukcie ADD neovplyvní CF príznak prenosu. Formát príkazu: Prijímač INC.

Inštrukcia INC je užitočná pre inkrementáciu počítadiel v inštrukčných slučkách. Môže sa použiť aj na zvýšenie hodnoty indexového registra pri prístupe k bunkám sekvenčnej pamäte. Operand sa interpretuje ako číslo bez znamienka.

Napríklad:

INC CX; zvýšiť hodnotu 16-bit

INC AL; alebo 8-bitový register na jednotku.

INC MEM_BYTE; zvýšiť hodnotu bajtu

INC MEM_WORD; alebo pamäťové slová na jednotku.

Nie je dovolené používať okamžitú hodnotu ako operand.

Príkazy na odčítanie - SUB a odčítanie s požičaním SBB

Tímy SUB(odčítať - odčítať) a SBB(odčítať s požičať) sú podobné príkazom na sčítanie ADD a ADC, len pri odčítaní funguje príznak prenosu CF ako znak pôžičky. Formát príkazu: SUB prijímač, zdroj;

Príkaz SUB odčíta zdrojový operand od cieľového operandu a umiestni výsledok do cieľa v symbolickom zápise:

drez:= drez – zdroj.

Tím SBB robí to isté, ale navyše odpočítava hodnotu príznaku prenosu CF od prijímača:

SUB prijímač, zdroj – CF;

Destination:= sink - source - obsah prenášacieho príznaku.

Rovnako ako pri sčítaní, inštrukcie SUB a SBB vykonávajú dve samostatné funkcie. Prvý príkaz odpočítava čísla o veľkosti bajtov alebo slov, ako aj bity nízkeho rádu vysoko presných čísel (nižšia časť čísla sa nachádza v registri AX a časť vyššieho rádu je v DX register). Druhý príkaz odpočítava najvýznamnejšie bity vysoko presných čísel. Napríklad príkaz SUB AX,CX; Odčíta obsah registra CX od obsahu registra AX a vráti výsledok do registra AX.

Ak veľkosť operandov presiahne 16 bitov, musí sa použiť nasledujúca postupnosť príkazov:

SUB AX,CX; Odčítať nízkych 16 bitov;

SBB BX,DX; a potom najvýznamnejších 16 bitov.

Tu odpočítame od 32-bitového čísla umiestneného v registroch AX a BX 32-bitové číslo umiestnené v registroch CX a DX. Pri odčítaní obsahu registra DX od obsahu registra BX inštrukcia SBB zohľadňuje možnosť požičania pri vykonávaní prvého odčítania.

SUB AX, MEM; Odčítajte obsah pamäťovej bunky z registra.

SUB MEM ,AX; Odčítajte register od pamäťovej bunky.

SUB AL,10; Odčítajte konštantu z registra.

SUB MEM_BYTE,OFh; Odčítajte konštantu z pamäťovej bunky.

Nedá sa priamo odčítať obsah jednej pamäťovej bunky z druhej, alebo použiť okamžitú hodnotu ako cieľ.

Príkazy SUB a SBB môžu ovplyvniť šesť príznakov takto:

· Inštalácia niesť vlajku CF je 1, ak sa vyžaduje úver, inak je 0;

· Inštalácia paritná vlajka PF je 1, ak má výsledok odčítania párny počet bitov s hodnotou 1, inak je 0;

· Inštalácia pomocná nosná vlajka AF je 1, ak výsledok desiatkového odčítania vyžaduje korekciu, inak je 0;

· Inštalácia nulová vlajka ZF na 1, ak je výsledok 0, inak je 0;

· Inštalácia podpísať vlajku SF je 1, ak je výsledok záporný (najdôležitejší bit je 1), inak je príznak 0;

· Inštalácia vlajka pretečenia OF je 1, ak výsledok odčítania prekročí rozsah hodnôt prijímača v reverznom kóde a samotný prijímač zmení znamienko.

Príznaky SF a OF majú zmysel iba pri odčítaní čísel so znamienkom a príznak AF má zmysel iba pri odčítaní desatinných čísel.

Príkaz na zníženie obsahu cieľa - DEC

Tím DEC prijímač(dekrementácia) odpočítava 1 od obsahu registra alebo pamäťového miesta, ale (na rozdiel od inštrukcie SUB) neovplyvňuje CF príznak prenosu.

Inštrukcia DEC sa často používa v slučkách na zníženie hodnoty počítadla, kým sa nestane nulou alebo zápornou hodnotou. Môže sa tiež použiť na zníženie hodnoty indexového registra alebo ukazovateľa pri prístupe k sekvenčným pamäťovým miestam. Napríklad:

DEC CX; Znížiť 16-bitovú hodnotu,

DEC AL; alebo 8-bitový register.

DEC MEM_BYTE; Znížiť hodnotu bajtu,

DEC MEM_WORD; alebo pamäťová bunka slov.

Divízne príkazy - DIV, IDIV

Tím DIV(rozdeliť - rozdeliť) vykoná delenie čísel bez znamienka a príkaz IDIV(celočíselné delenie - delenie celých čísel) vykonáva delenie čísel so znamienkom. Tieto príkazy majú formát:

Zdroj DIV; Kde zdroj- deliteľ veľkosti bajtu alebo slova,

Zdroj IDIV;umiestnené vo všeobecnom registri alebo pamäťovom mieste.

Upozorňujeme na nasledujúce:

1. Dividenda musí mať dvojnásobnú veľkosť vo vzťahu k deliteľovi.

2. Dividenda musí byť vždy v registri AX (pri delení 8-bitovým číslom) alebo v registroch DX a AX (pri delení 16-bitovým číslom).

3. Výsledky príkazu sa vrátia takto:

· ak je zdrojový operand bajt, potom sa podiel vráti do registra AL a zvyšok do registra AN;

· Ak je zdrojový operand slovo, potom sa podiel vráti do registra AX a zvyšok do registra DX.

Obidve inštrukcie nechávajú stav príznakov nedefinovaný, ale ak sa podiel nezmestí do cieľového registra (AL alebo AX), potom mikroprocesor vygeneruje prerušenie typu 0 (delenie 0).

4. Pretečenie výsledku delenia nastáva za nasledujúcich podmienok:

· deliteľ je 0;

· pri delení bajtov bez znamienka je dividenda najmenej 256-násobkom deliteľa;

· pri delení slov bez znamienka je delenec aspoň 65 536-násobok deliteľa;

· pri delení bajtov znamienkom leží podiel mimo rozsahu -128 až +127;

· pri delení slov znamienkom leží podiel mimo rozsahu od

32768 až 32767.

Tu je niekoľko typických príkladov operácií delenia:

DIV BX; Vydeľte DX:AX BX, bez znamienka.

DIV MEM_BYTE; Rozdeľte AX na bajt pamäte, bez znamienka.

IDIV DL; Vydeľte AX DL so znamienkom.

IDIV MEM WORD; Rozdeľte DX:AX na podpísané pamäťové slovo.

Inštrukcie DIV a IDIV sa priamo nedelia okamžitou hodnotou, pretože procesor nedokáže určiť typ údajov deliteľa.

Návod na násobenie - MUL, IMUL

Tím MUL(násobí) násobí čísla bez znamienka, a IMUL(integer multiply) násobí celé čísla so znamienkom. Násobiteľ a násobiteľ oboch inštrukcií musia byť rovnakého dátového typu, teda bajty, slová, dvojité slová atď.

Tieto príkazy majú nasledujúci formát:

zdroj MUL; Kde zdroj- všeobecný register,

Zdroj IMUL; alebo pamäťová bunka veľkosti bajtu alebo slova.

Ako prvý operand (multiplikovateľný) inštrukcie MUL a IMUL využívajú obsah registra AL (pre operácie s bajtami) alebo registra AX (pre operácie so slovami). Produkt má dvojnásobnú veľkosť a vracia sa nasledovne:

· násobenie bajtov-vráti 16-bitový produkt do registrov AN (vysoký bajt) a AL (dolný bajt);

· násobenie slová-vráti 32-bitový produkt do registrov DX (vysoké slovo) a AX (nízke slovo). Teda veľkosť produktu n- bitové faktory sú rovnaké 2n.

ADC Integer sčítanie s prenosom

Tím adc vykoná pridanie prvého a druhého operandu, pričom k výsledku pridá hodnotu CF príznaku prenosu. Pôvodná hodnota prvého operandu (cieľa) sa stratí a nahradí sa výsledkom sčítania. Druhý operand je nezmenený. Ako prvý operand príkazu adc

Operandy môžu byť bajty alebo slová a predstavujú čísla so znamienkom alebo bez znamienka. Tím adc(spolu s tímom pridať) sa zvyčajne používa na sčítanie 32-bitových čísel. Príkaz ovplyvňuje príznaky OF, SF, ZF, AF, PF a CF.

Príklad 1:

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

Príklad 2:

; V dátových poliach: numlow dw 0FFFFh; Nízka časť 2. termínu numhigh dw 000Sh; Najvyššia časť 2. termínu;Číslo 0005FFFFh=393215;V programovej časti: mov AX,000Sh; Najnižšia časť 1. termínu mov BX,0002h; Najvyššia časť 1. členu;Číslo 00020005h=131077 pridať AX,numlow; Pridanie juniorských dielov. AX=4, CF=1 adc BX, numhigh; Pridanie vyšších dielov s nosením. BX:AX=0008:0004h. ;Číslo 00080004h=524292

Použitie 32-bitových operandov a dodatočných režimov adresovania 32-bitových procesorov je prijateľné. Tím adc s 32-bitovými operandami možno použiť na pridanie 64-bitových celých čísel.

Príklad:

; V dátových poliach mem321 dd 0FFFFFFFFh; Nízkoobjednávková časť 1. termínu mem32h dd 98765432h; Najvyššia časť 1. funkčného obdobia; V programovom segmente mov EAX,1; Spodná časť 2. termínu mov EBX,0; Najvyššia časť 2. funkčného obdobia pridať EAX,mem321; Pridajte spodné polovice;Sum=100000000h>32 bitov;EAX=000000h, preneste adc EBX,mem32h; Preložte staršie polovice a preneste. EBX=90000001h; Množstvo: 9876543300000000h

ADD Sčítanie celého čísla

Tím pridať vykoná sčítanie prvého a druhého operandu. Pôvodná hodnota prvého operandu (cieľa) sa stratí a nahradí sa výsledkom sčítania. Druhý operand je nezmenený. Ako prvý operand príkazu pridať Môžete zadať register (okrem segmentového) alebo pamäťovú bunku, druhá môže byť register (okrem segmentovej), pamäťová bunka alebo okamžitá hodnota, ale nie je dovolené definovať oba operandy súčasne ako pamäť bunky.

Operandy môžu byť bajty alebo slová a predstavujú čísla so znamienkom alebo bez znamienka. Príkaz add možno použiť na sčítanie bežných celých aj binárnych desiatkových čísel (pomocou registra AX na uloženie výsledku). Ak sa za príkaz pridajú rozbalené binárne kódované desiatkové čísla (BCD). pridať mal by sa použiť príkaz aaa; ak sa pridajú zbalené čísla, potom príkaz áno. Príkaz ovplyvňuje príznaky OF, SF, ZF, AF, PF a CF.

Príklad 1:

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

Príklad 2:

Mov AX,25h pridať AX,12h; AX=0037h

Príklad 3:

; V dátových poliach: mem dw 128 ;V segmente programu: add mem,100; mem=228

ADC Integer sčítanie s prenosom

Príkaz adc pridá prvý a druhý operand, pričom k výsledku pridá hodnotu CF príznaku prenosu. Pôvodná hodnota prvého operandu (cieľa) sa stratí a nahradí sa výsledkom sčítania. Druhý operand je nezmenený. Prvý operand inštrukcie adc môže byť register (okrem segmentu) alebo pamäťová bunka, druhý operand môže byť register (okrem segmentu), pamäťová bunka alebo okamžitá hodnota, ale nie je dovolené špecifikovať oba operandy súčasne ako pamäťové bunky. Operandy môžu byť bajty alebo slová a predstavujú čísla so znamienkom alebo bez znamienka. Príkaz adc (spolu s príkazom add) sa bežne používa na sčítanie 32-bitových čísel. Príkaz ovplyvňuje príznaky OF, SF, ZF, AF, PF a CF.

Príklad 1

Mov AX,1125h adc AX,2C25h ;AX=3D4Bh, ak CF bolo = 1;AX=3D4Ah, ak CF bolo = 0
Príklad 2; V dátových poliach: numlow dw 0FFFFh ;Nízka časť 2. termínu numhigh dw 000Sh ;Vysoká časť 2. termínu;Číslo 0005FFFFh=393215 ;V segmente programu: mov AX,000Sh ;Nízke obdobie 0002h ;Najvyššia časť 1. termínu;Číslo 00020005h=131077 pridať AX,numlow;Pridanie spodných častí. AX=4, CF=1 adc BX, numhigh ;Pridanie vyšších častí s;prenos.BX:AX=0008:0004h. ;Číslo 00080004h=524292
Použitie 32-bitových operandov a dodatočných režimov adresovania 32-bitových procesorov je prijateľné. Inštrukciu adc s 32-bitovými operandami možno použiť na pridanie 64-bitových celých čísel. Príklad 3; V dátových poliach mem321 dd 0FFFFFFFFh ;Nízka časť 1. termínu mem32h dd 98765432h ;Vysoká časť 1. termínu; V programovom segmente mov EAX,1 ;Nízka časť 2. členu mov EBX,0 ;Vysoká časť 2. členu pridať EAX,mem321 ;Pridať nízke polovice;Súčet=100000000b>32 bitov;EAX=000000h, preniesť adc EBX,mem32h ;Pridajte staršie polovice; a preneste. EBX=90000001h ;Suma: 9876543300000000h
ADD Sčítanie celého čísla

Príkaz add pridá prvý a druhý operand. Pôvodná hodnota prvého operandu (cieľa) sa stratí a nahradí sa výsledkom sčítania. Druhý operand je nezmenený. Prvý operand príkazu add môže byť špecifikovaný ako register (okrem segmentového) alebo pamäťová bunka a druhý operand môže byť register (okrem segmentového), pamäťová bunka alebo okamžitá hodnota, ale je nie je dovolené definovať oba operandy súčasne ako pamäťové bunky. Operandy môžu byť bajty alebo slová a predstavujú čísla so znamienkom alebo bez znamienka. Príkaz add možno použiť na sčítanie bežných celých aj binárnych desiatkových čísel (pomocou registra AX na uloženie výsledku). Pri pridávaní rozbalených binárne kódovaných desiatkových čísel (BCD) použite po príkaze add príkaz aaa; ak sú pridané zbalené čísla, potom príkaz daa. Príkaz ovplyvňuje príznaky OF, SF, ZF, AF, PF a CF. Príklad 1

Mov BX,lFFEh mov CX,3 pridať BX,CX ;BX=2001h, CX=0003h
Príklad 2 mov AX,25h pridať AX,12h ;AX=0037h
Príklad 3; V dátových poliach: mem dw 128 ;V segmente programu: add mem,100 ;mem=228
Príklad 4 mov AX,0507h ;BCD rozbalene 57 pridat AL,05h ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
Príklad 5 mov AL,57h ;BCD zabalené 57 pridať AL,05h ;BCD 5, AL=5Ch daa ;AL=62h, BCD 62

Použitie 32-bitových operandov a dodatočných režimov adresovania 32-bitových procesorov je prijateľné. Príklad

Mov EAX,98765432h pridať EAX,11111111h ; EAX=A9876543h
AND Logické AND

Príkaz and vykoná logické (bitové) násobenie prvého operandu druhým. Pôvodná hodnota prvého operandu (cieľa) sa stratí a nahradí sa výsledkom násobenia. Prvým operandom príkazu and môže byť register (okrem segmentového) alebo pamäťová bunka, druhým operandom môže byť register (okrem segmentového), pamäťová bunka alebo okamžitá hodnota, ale nie je povolené. špecifikujte oba operandy súčasne ako pamäťové bunky. Operandy môžu byť bajty alebo slová. Príkaz ovplyvňuje príznaky SF, ZF a PF. Pravidlá pre bitové násobenie:

Bit prvého operandu 0101 Bit druhého operandu 0011 Bit výsledku 0001 Príklad 1 mov AX,0FFEh a AX,5555h ;AX=0554h Príklad 2; V dátových poliach: mem dw 0С003h ;V segmente programu: mov AX,700Eh a AX,mem ;AX=4002h

Použitie 32-bitových operandov a dodatočných režimov adresovania 32-bitových procesorov je prijateľné. Príklad

Mov EDX, 0FA8 8 0 0 4 lh a EDX,0FF00000Fh ; EDX = FA000001h
386P+ ARPL
Úprava požadovanej úrovne oprávnenia voliča

Príkaz aprl porovnáva selektor so vzorom obsahujúcim maximálnu povolenú úroveň oprávnení (zvyčajne selektor CS) a nastavuje hodnotu, ktorá sa má testovať, na nižšiu z dvoch úrovní oprávnení. Ak zmena hladiny nie je potrebná, príznak ZF sa vynuluje, v prípade potreby sa nastaví. Prvý operand inštrukcie aprl môže byť 16-bitový register alebo pamäťové slovo s kontrolovateľným selektorom; druhý operand je 16-bitový register s výberom vzoru. 386+ VIAZANÝ
Kontrola indexu poľa pre pole mimo hraníc

Príkaz bound skontroluje, či zadaný index, považovaný za číslo so znamienkom, leží v medziach špecifikovaných druhým operandom. Ak index prekročí hranice poľa pod alebo nad, vygeneruje sa prerušenie s vektorom 5. Prvý operand musí byť register obsahujúci kontrolovaný index, druhý - adresa pamäťového poľa s dvoma hranicami poľa. sa kontroluje. Príkaz bound povoľuje 16-bitové aj 32-bitové operandy (ale prvý aj druhý operand musia byť rovnakého typu).

Assembler- Montážny jazyk pre figuríny

Montážny jazyk pre figuríny.(#2) (C) Michail Spitsyn 1995 Vlajky Register "F" procesora sa nazýva príznak. Čo to je? Príznak je premenná, ktorá môže mať dva stavy: nastavený (rovnajúci sa jednej) a vymazaný (rovnajúci sa nule). Preto si register "F" možno predstaviť ako súbor ôsmich príznakových bitov. Môžeme použiť iba štyri z nich: príznak nula, príznak prenosu, príznak podpísania a príznak pretečenia parity.Aritmetické operácie. Aritmetika je veľmi, veľmi užitočná veda, neustále niečo počítame: sčítanie, odčítanie, delenie, násobenie. Teraz si povieme, ako to urobiť v assembleri. Začneme tou najjednoduchšou vecou, ​​keď k niečomu pridáme jednu, napríklad na registráciu „A“: ************************ *** ** LD A,NUBER INC A RET ******************************** Ako vidíte, je na to veľmi jednoduchý existuje príkaz "INC" - increment (zvýšenie o jednotku), za ktorým nasleduje operand, t.j. nejaký register alebo registračný pár: ************************************* INC A INC HL INC H INC DE INC E INC IY INC E INC (HL) INC (IX+N) INC (IY+N) *********************************** ** Ak potrebujete zväčšiť niektorú pamäťovú bunku o jednu, mali by ste urobiť toto: *************************************** ****** *** LD HL,ADDRES LD IX,ADDRES INC (HL) INC (IX+0) RET RET ********************* **************** ***** Prvá možnosť funguje rýchlejšie a je pohodlnejšia, ak pracujete s jednou pamäťovou bunkou, ale ak pracujete v tabuľke, potom nie je ekonomické a škaredé. Porovnanie: potrebujeme zväčšiť prvý, piaty a desiaty bajt v tabuľke o jeden: ************************************ * 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 ************************************* Všetko, čo bolo povedané vyššie o zvýšení o jednu, je pravda a za dekrement, t.j. znížiť o jednu: ********************************** 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) ********************* *********** Teraz predpokladajme, že potrebujeme zvýšiť register „A“ nie o jeden, ale povedzme o desať: **************** * *************** LD A,ČÍSLO PRIDAŤ A,10 RET ************************* * ****** Môžete pridať register "A" s číslom a ďalšími registrami a s pamäťovou bunkou adresovanou pármi registrov "HL", "IX" a "IY". Môžete tiež pridať páry registrov s "HL", "IX" a "IY". (PureBasic - súborový systém) ************************************* ADD A,N ADD A,(HL) ADD A ,A PRIDAŤ A,(IX+N) PRIDAŤ A,B PRIDAŤ A,(IY+N) PRIDAŤ A,C PRIDAŤ HL,HL PRIDAŤ A,D PRIDAŤ HL,BC PRIDAŤ A,E PRIDAŤ HL,DE PRIDAŤ A,H PRIDAŤ HL,SP PRIDAŤ IX,IX PRIDAŤ IX,BC PRIDAŤ IX,DE PRIDAŤ IX,SP *********************************** ** Ako vidíte, sada príkazov je pomerne veľká. Pri vykonávaní tohto príkazu sa môže vyskytnúť chyba: ************************************** LD A,45 LD B,230 ADD A ,B RET ************************************* Súčet "A" a "B" presiahol 255 a preto v "A" " nebude 275, ale 20 (register "A" nie je guma); Aby sme vedeli, že došlo k pretečeniu, procesor nastaví príznak prenosu na hodnotu jedna. Zostáva len skontrolovať. Rovnako ako "INC" má "DEC", "ADD" má tiež "pár", toto je "SUB" a má svoje vlastné charakteristiky. Príkaz "SUB" funguje len s registrom "A", takže pri písaní mnemotechnických pomôcok pre tento príkaz sa vynecháva "A": ********************* *********** SUB N SUB C SUB A SUB H SUB B SUB D SUB E SUB (HL) SUB (IX+N) SUB (IY+N) ******** * *********************** Príkaz ovplyvňuje príznak prenosu rovnakým spôsobom ako „PRIDAŤ“. Okrem dvojice príkazov „ADD“ a „SUB“ existuje ešte jedna dvojica. Príkazy „ADC“ a „SBC“ fungujú s prihliadnutím na príznak prenosu, t.j. Pri pridávaní alebo odčítaní sa k výsledku pripočíta (odčíta) hodnota prenášacieho príznaku. Na nastavenie príznaku prenášania existujú dva špeciálne príkazy – „SCF“ a „CCF“. "SCF" - nastavte príznak prenosu na jednu. "CCF" - nastavte príznak prenosu na nulu. ******************************** 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 **************************** **** A teraz príklady práce príkazov „ADC“ a „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 ******** ************************ Namiesto dvoch príkazov „CCF“ a „SBC A,B“ môžete jednoducho zadať „SUB B“, výsledok bude rovnaký. ********************************* 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 ****************************** **** Ako vidno z výsledkov, carry flag výrazne ovplyvňuje výsledok operácie. Pri odčítaní sa od výsledku odčíta a pri sčítaní sa k výsledku pripočíta. O operáciách sčítania a odčítania už bolo povedané takmer všetko, teraz budeme hovoriť o delení a násobení. Bohužiaľ SPECCY nemá príkazy na delenie a násobenie, ale tieto príkazy môžu byť zložené z niekoľkých ďalších. Napríklad potrebujeme vynásobiť obsah dvoch registrov – „A“ a „C“: ********************************** ********** *** LD A,10 LD C,5 LD B,A XOR A LOOP ADD A,C DJNZ LOOP RET *************** ********** ******** V príklade sú dva nové príkazy – „XOR A“ a „DJNZ LOOP“. "XOR A" vymaže register "A" a príkaz "DJNZ LOOP" zopakuje všetky príkazy, od príkazu označeného štítkom (napríklad "LOOP") až po príkaz "DJNZ" (nasledovaný rovnakým štítkom). ka, ako na začiatku cyklu); počet opakovaní je uvedený v registri „B“. S použitím skutočnosti, že vynásobením M číslom N pripočítate číslo M k sebe N-krát, môžete pochopiť príklad uvedený vyššie. Túto vlastnosť je možné využiť aj na rozdelenie. Skúste to sami. Nabudúce si povieme niečo o príkazoch na porovnávanie a prácu s bitmi.________________________________

Ďalšie články v čísle:





Hore