Tutorial ilustrat despre Assembler. Instrucțiuni aritmetice de asamblare

Echipă ADC(Adăugați cu Carry) aparține grupului comenzi întregi(sau binar)aritmetic (Instrucțiuni aritmetice binare) și efectuează adăugarea întregului a doi operanzi semnați sau nesemnați ( DESTȘi SRC) Și poartă steagul EFLAGS.CF . Primul operand ( operand de destinație, DEST) poate fi o variabilă într-un registru sau în memorie ( , r16, r32 , r/m8, r/m16, r/m32). Al doilea operand ( operand sursă, SRC) - sens imediat ( imm8, imm16, imm32), o variabilă într-un registru sau în memorie. În acest caz, ambii operanzi nu pot fi simultan variabile în memorie.

Rezultatul adăugării prin comandă ADC este plasat în locul primului operand ( DEST). Steagurile din registrul EFLAGS sunt setate în funcție de rezultat.

La adăugarea unei valori directe imm8 sau imm16 cu un operand de doi sau patru octeți, valoarea imediată este mai întâi extinsă în semn la dimensiunea primului operand și abia apoi se realizează adăugarea.

Echipă ADC folosit de obicei în multibyte sau multiword ( cu mai multe cuvinte) operaţii de adunare. În acest caz, urmează instrucțiunea ADD, care returnează suma biților de ordin inferior ai operanzilor multiocteți (cu mai multe cuvinte), permițând luarea în considerare a transportului la adăugarea biților de ordin înalt. De exemplu:

mov edx, 0; EDX = 0
mov eax, 0FFFFFFFFh ; Primul addend pe 32 de biți este plasat în EAX
adăugați eax, 0FFFFFFFFh ; al doilea supliment pe 32 de biți - 0x FFFFFFFFh, adăugăm doi operanzi pe 32 de biți
adc edx, 0; EDX = EDX + CF, luați în considerare reportul
; EDX:EAX = 0000000lh:FFFFFFFEh - rezultatul rezultat pe 64 de biți

Echipă ADC permite manipularea operanzilor întregi ca în format nesemnat, si in format semnat. Când adăugați date cu un semn semn steagul EFLAGS.SF va reflecta semnul rezultatului obtinut. Steagul de preaplin EFLAGS.OF va fi setat la 1 dacă, la adăugarea valorilor întregi cu semn reprezentate în complementul a doi sau în complementul a doi, are loc o depășire (care de la bitul cel mai semnificativ căruia îi corespunde bitul care precede bitul semn), adică rezultatul rezultat depășește dimensiunea disponibilă a operandului - numiri ( DEST). În esență, acest lucru este similar cu modul în care steagul EFLAGS.CF reflectă depășirea (transportarea) atunci când se adaugă operanzi nesemnați. De exemplu, atunci când adăugați două valori de 32 de biți reprezentate în cod invers, ar putea arăta astfel:

mov eax, operand1; EAX = operand1, primul addend pe 32 de biți este plasat în EAX
adăugați eax, operand2; adăugăm doi operanzi pe 32 de biți în cod invers
în ; săriți la manipulatorul de întrerupere în caz de depășire

adc eax, 0; EAX = EAX + CF, luați în considerare transportul (necesar pentru adăugarea în cod invers)
; EAX = operand1 + operand2 - rezultatul adunării în cod invers
jns m1; tranziție dacă rezultatul este pozitiv
xor eax, 7FFFFFFFh ; conversia valorii negative din EAX în cod direct
m1: ; EAX - rezultatul adăugării în cod direct

Steagul auxiliar(sau adiţional)transfer EFLAGS.AF ajută la manipularea datelor în format BCD ( format BCD ambalat). Este setat dacă, în timpul adăugării, are loc o transportare de la tetrada joasă la tetrada înaltă a octetului scăzut al rezultatului. Folosind comanda DAA imediat după comandă ADC, este posibil să se producă așa-numitul corectare zecimală rezultatul adunării și obțineți suma în același format BCD ambalat, precum și termenii originali.

Echipă ADC cu operand destinație ( DEST), care este o variabilă de memorie, poate fi folosită împreună cu prefixul de blocare LOCK, care va asigura execuția atomică a comenzii.

Comenzi de adăugare - ADD, ADC

Instrucțiunile ADD (adăugare) și ADC (adăugare cu transport) pot adăuga operanzi de 8 și 16 biți.

Instrucțiunea ADD adaugă conținutul operandului sursă și al operandului destinație și plasează rezultatul în operandul destinație.

Format de comandă: ADD receptor, sursă

În notație simbolică, acțiunile sale pot fi descrise astfel: chiuvetă:= chiuvetă + sursă (suma conținutului chiuvetei și sursei este scrisă în chiuvetă).

Comanda ADC face la fel ca comanda ADD, dar adaugă nu doi, ci trei termeni: destinația, sursa și indicatorul de transport.

Format de comandă: Receptor ADC, sursă + CF

În notație simbolică, acțiunile sale pot fi descrise astfel:

chiuvetă:= chiuvetă + sursă + conținutul steagului de transport.

Purtarea atunci când adăugați numere binare este similară cu purtarea atunci când adăugați numere zecimale într-o coloană. Când computerul adaugă numere binare și suma nu se încadrează în operandul de destinație, se generează un transfer. După cum știți, un registru de 8 biți poate conține valori fără semn în intervalul de la 0 la 255. Dacă, de exemplu, efectuăm adunarea binară a numerelor 250 și 10, vom obține următorul rezultat:

1111 1010; reprezentarea binară a numărului 250.

0000 1010 ; reprezentarea binară a numărului 10.

1 0000 0100; reprezentare binară a sumei egale cu 260.

Rezultatul este corect, dar ocupă 9 biți binari. Dacă s-au folosit registre de 8 biți, cei 8 biți inferiori vor fi introduși în registrul de destinație, iar al nouălea bit în flag-ul de transport CF.

Acum înțelegem de ce microprocesorul 8086 are două instrucțiuni de adăugare diferite. Unul dintre ele (ADD) poate adăuga valori reprezentate prin octeți sau cuvinte, precum și părțile inferioare ale valorilor de înaltă precizie. O altă instrucțiune (ADC) este utilizată pentru a adăuga valori de mare precizie.

Operanzii de adăugat pot fi în memorie, într-un registru sau au o valoare imediată. De exemplu:

ADD AX,MEM_WORD; adăugați conținutul unei celule de memorie la un registru,

ADAUGĂ MEM_WORD,AX; sau invers, adăugați conținutul registrului în celula de memorie.

ADD AL, 10; adăugați o constantă la conținutul registrului.

ADD MEM_BYTE,8H; adăugați constanta și conținutul celulei de memorie.

Cele mai multe combinații posibile sunt permise, dar este interzis adăugați conținutul a două celule de memorie sau utilizați o valoare directă (număr) ca receptor.

Comenzile ADD și ADC pot afecta următoarele șase indicatoare:

poartă steagul CF este 1 dacă rezultatul adunării nu se încadrează în operandul destinație, în caz contrar este 0;

steag de paritate PF este 1 dacă rezultatul are un număr par de biți cu valoarea 1, în caz contrar este 0;

AF este egal cu 1 dacă rezultatul adunării numerelor zecimale necesită o corecție;

steag zero ZF este 1 dacă rezultatul este 0;

semn steagul SF este 1 dacă rezultatul este negativ (cel mai semnificativ bit este 1), altfel este 0;

steag de revărsare OF este egal cu 1 dacă suma a două numere de același semn depășește intervalul de valori acceptabile ale receptorului în codul invers, iar receptorul însuși își schimbă semnul. În caz contrar, indicatorul OF este 0.

Comanda pentru a crește valoarea receptorului cu unu - INC

Echipă INC(increment) adaugă 1 la conținutul unui registru sau al unei celule de memorie, dar spre deosebire de instrucțiunea ADD, nu afectează indicatorul de transport CF. Format de comandă: receptor INC.

Instrucțiunea INC este utilă pentru incrementarea contoarelor în buclele de instrucțiuni. De asemenea, poate fi folosit pentru a crește valoarea registrului index la accesarea celulelor de memorie secvențială. Operandul este interpretat ca un număr fără semn.

De exemplu:

INC CX; crește valoarea de 16 biți

INC AL; sau registru de 8 biți pe unitate.

INC MEM_BYTE; crește valoarea octetului

INC MEM_WORD; sau cuvinte de memorie pe unitate.

Nu este permisă utilizarea unei valori imediate ca operand.

Comenzi de scădere - SUB și scădere cu împrumut SBB

Echipe SUB(scăderea - scăderea) și SBB(scădere cu împrumut) sunt similare cu comenzile de adunare ADD și respectiv ADC, doar la scădere, flagul de transport CF acționează ca semn al unui împrumut. Format de comandă: receptor SUB, sursă;

Comanda SUB scade operandul sursă din operandul destinație și plasează rezultatul în destinație, în notație simbolică:

chiuveta:= chiuveta – sursa.

Echipă SBB face același lucru, dar în plus scade valoarea semnalului de transport CF de la receptor:

receptor SUB, sursa – CF;

Destinație:= chiuvetă - sursă - conținutul steagului de transport.

Ca și în plus, instrucțiunile SUB și SBB îndeplinesc două funcții separate. Prima comandă scade numerele de dimensiunea unui octet sau a unui cuvânt, precum și biții de ordin inferior ai numerelor de înaltă precizie (partea de ordin inferioară a numărului este situată în registrul AX, iar partea de ordin superior este în registru DX). A doua comandă scade cei mai semnificativi biți de numere de înaltă precizie. De exemplu, comanda SUB AX,CX; Scăde conținutul registrului CX din conținutul registrului AX și returnează rezultatul în registrul AX.

Dacă dimensiunile operanzilor depășesc 16 biți, atunci trebuie utilizată următoarea secvență de comenzi:

SUB AX,CX; Scădeți 16 biți;

SBB BX,DX; și apoi cei mai semnificativi 16 biți.

Aici scadem din numarul de 32 de biti plasat in registrele AX si BX numarul de 32 de biti situat in registrele CX si DX. La scăderea conținutului registrului DX din conținutul registrului BX, instrucțiunea SBB ține cont de posibilitatea de împrumut la efectuarea primei scăderi.

SUB AX, MEM; Scădeți conținutul unei celule de memorie dintr-un registru.

SUB MEM ,AX; Scădeți un registru dintr-o celulă de memorie.

SUB AL,1O; Scădeți o constantă dintr-un registru.

SUB MEM_BYTE,OFh; Scădeți o constantă dintr-o celulă de memorie.

Nu se poate scădea direct conținutul unei celule de memorie dintr-o altă celulă sau utilizați valoarea imediată ca destinație.

Comenzile SUB și SBB pot afecta șase steaguri, după cum urmează:

· instalare poartă steagul CF este 1 dacă este necesar un împrumut, în caz contrar este 0;

· instalare steag de paritate PF este 1 dacă rezultatul scăderii are un număr par de biți cu valoarea 1, în caz contrar este 0;

· instalare steag de transport auxiliar AF este 1 dacă rezultatul scăderii zecimale necesită corecție, în caz contrar este 0;

· instalare steag zero ZF la 1 dacă rezultatul este 0, în caz contrar este 0;

· instalare semn steagul SF este 1 dacă rezultatul este negativ (cel mai semnificativ bit este 1), în caz contrar indicatorul este 0;

· instalare steag de revărsare OF este 1 dacă rezultatul scăderii depășește intervalul valorilor receptorului în codul invers, iar receptorul însuși își schimbă semnul.

Indicatoarele SF și OF au sens numai atunci când se scad numerele cu semn, iar steagurile AF au sens doar când se scad numere zecimale.

Comanda Reducere conținut destinație - DEC

Echipă receptor DEC(decrementează) scade 1 din conținutul unui registru sau al unei locații de memorie, dar (spre deosebire de instrucțiunea SUB) nu afectează indicatorul de transport CF.

Instrucțiunea DEC este adesea folosită în bucle pentru a reduce valoarea unui contor până când aceasta devine zero sau negativă. De asemenea, poate fi folosit pentru a reduce valoarea unui registru index sau a unui pointer atunci când accesați locații de memorie secvențială. De exemplu:

DEC CX; Reduceți valoarea de 16 biți,

DEC AL; sau registru de 8 biți.

DEC MEM_BYTE; Reduceți valoarea octetului,

DEC MEM_WORD; sau celula de memorie de cuvinte.

Comenzi de diviziune - DIV, IDIV

Echipă DIV(împărțire - împărțire) efectuează împărțirea numerelor fără semn și comanda IDIV(diviziunea întregului - împărțirea numerelor întregi) efectuează împărțirea numerelor cu semne. Aceste comenzi au formatul:

sursa DIV; Unde sursă- divizor al mărimii octetului sau cuvântului,

Sursa IDIV;situat într-un registru de uz general sau într-o locație de memorie.

Vă rugăm să rețineți următoarele:

1. Dividendele trebuie să aibă mărime dublă în raport cu divizorul.

2. Dividendele trebuie să fie întotdeauna în registrul AX (la împărțirea la un număr de 8 biți) sau în registrele DX și AX (la împărțirea la un număr de 16 biți).

3. Rezultatele comenzii sunt returnate după cum urmează:

· dacă operandul sursă este un octet, atunci câtul este returnat în registrul AL, iar restul în registrul AN;

· Dacă operandul sursă este un cuvânt, atunci câtul este returnat în registrul AX, iar restul în registrul DX.

Ambele instrucțiuni lasă starea steagurilor nedefinită, dar dacă câtul nu se încadrează în registrul de destinație (AL sau AX), atunci microprocesorul generează o întrerupere de tip 0 (diviziunea cu 0).

4. Depășirea rezultatului diviziunii are loc în următoarele condiții:

· divizorul este 0;

· la împărțirea octeților fără semn, dividendul este de cel puțin 256 de ori divizorul;

· la împărțirea cuvintelor fără semn, dividendul este de cel puțin 65.536 de ori împărțitorul;

· la împărțirea octeților cu un semn, câtul se află în afara intervalului de la -128 la +127;

· la împărțirea cuvintelor cu un semn, câtul se află în afara intervalului de la

32768 până la 32767.

Iată câteva exemple tipice de operațiuni de diviziune:

DIV BX; Împărțiți DX:AX la BX, nesemnat.

DIV MEM_BYTE; Împărțiți AX într-un octet de memorie, nesemnat.

IDIV DL; Împărțiți AX la DL cu un semn.

IDIV MEM WORD; Împărțiți DX:AX într-un cuvânt de memorie semnat.

Instrucțiunile DIV și IDIV nu se împart direct la valoarea imediată deoarece procesorul nu poate determina tipul de date al divizorului.

Instrucțiuni de multiplicare - MUL, IMUL

Echipă MUL(înmulțirea) înmulțește numerele fără semn, a IMUL(înmulțirea întregului) înmulțește numerele întregi cu semn. Multiplicatorul și multiplicatorul ambelor instrucțiuni trebuie să fie de același tip de date, adică octeți, cuvinte, cuvinte duble etc.

Aceste comenzi au următorul format:

Sursa MUL; Unde sursă- registru de uz general,

Sursa IMUL; sau o celulă de memorie de dimensiunea unui octet sau a unui cuvânt.

Ca prim operand (multiplicabil), instrucțiunile MUL și IMUL folosesc conținutul registrului AL (pentru operații pe octeți) sau registrul AX (pentru operații pe cuvinte). Produsul are dimensiune dubla si se returneaza astfel:

· înmulțire octeți-returnează produsul pe 16 biți în registrele AN (octet mare) și AL (octet scăzut);

· înmulțire cuvinte-returnează produsul pe 32 de biți în registrele DX (cuvânt înalt) și AX (cuvânt scăzut). Astfel, dimensiunea produsului n- factorii de biți sunt egali 2n.

ADC Adăugare întreg cu transport

Echipă adc efectuează adăugarea primului și celui de-al doilea operand, adăugând la rezultat valoarea indicatorului de transport CF. Se pierde valoarea inițială a primului operand (destinație), înlocuită cu rezultatul adunării. Al doilea operand este neschimbat. Ca prim operand al comenzii adc

Operanzii pot fi octeți sau cuvinte și reprezintă numere semnate sau fără semn. Echipă adc(împreună cu echipa adăuga) este de obicei folosit pentru a adăuga numere pe 32 de biți. Comanda afectează steagurile OF, SF, ZF, AF, PF și CF.

Exemplul 1:

Mov AX,1125h adc AX,2C25h; AX=3D4Bh, dacă CF a fost = 1;AX=3D4Ah, dacă CF a fost = 0

Exemplul 2:

; În câmpurile de date: numlow dw 0FFFFh; Partea inferioară a termenului 2 numhigh dw 000Sh; Cea mai mare parte a celui de-al 2-lea termen;Numărul 0005FFFFh=393215;În segmentul de program: mov AX,000Sh; Partea de ordin scăzut a primului termen mov BX,0002h; Cea mai înaltă parte a primului termen; Numărul 00020005h=131077 adăugați AX,numlow; Adăugarea de piese junior. AX=4, CF=1 adc BX, numhigh; Adăugarea de părți superioare cu transport. BX:AX=0008:0004h. ;Număr 00080004h=524292

Este acceptabilă utilizarea operanzilor pe 32 de biți și a modurilor de adresare suplimentare ale procesoarelor pe 32 de biți. Echipă adc cu operanzi pe 32 de biți, poate fi folosit pentru a adăuga numere întregi pe 64 de biți.

Exemplu:

; În câmpurile de date mem321 dd 0FFFFFFFFh; Partea de ordin inferioară a primului termen mem32h dd 98765432h; Cea mai înaltă parte a primului termen; În segmentul de program mov EAX,1; Partea de ordin inferioară a mov al 2-lea termen EBX,0; Cea mai înaltă parte a celui de-al doilea termen adaugă EAX,mem321; Adăugați jumătățile inferioare;Sum=100000000h>32 biți;EAX=000000h, carry adc EBX,mem32h; Îndoiți jumătățile mai vechi și transferați. EBX=90000001h; Suma: 9876543300000000h

ADD Adăugarea întregului

Echipă adăuga efectuează adăugarea primului și celui de-al doilea operand. Se pierde valoarea inițială a primului operand (destinație), înlocuită cu rezultatul adunării. Al doilea operand este neschimbat. Ca prim operand al comenzii adăuga Puteți specifica un registru (cu excepția unui segment) sau o celulă de memorie, a doua poate fi un registru (cu excepția unui segment), o celulă de memorie sau o valoare imediată, dar nu este permisă definirea simultană a ambilor operanzi ca memorie. celule.

Operanzii pot fi octeți sau cuvinte și reprezintă numere semnate sau fără semn. Comanda add poate fi folosită pentru a adăuga atât numere întregi obișnuite, cât și numere zecimale binare (folosind registrul AX pentru a stoca rezultatul). Dacă sunt adăugate numere zecimale codificate binar (BCD) despachetate, după comandă adăuga ar trebui folosită comanda aaa; dacă sunt adăugate numere împachetate, atunci comanda da. Comanda afectează steagurile OF, SF, ZF, AF, PF și CF.

Exemplul 1:

Mov BX,lFFEh mov CX,3 adăugați BX,CX; BX=2001h, CX=0003h

Exemplul 2:

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

Exemplul 3:

; În câmpurile de date: mem dw 128 ;În segmentul de program: adăugați mem,100; mem=228

ADC Adăugare întreg cu transport

Comanda adc adaugă primul și al doilea operanzi, adăugând valoarea indicatorului de transport CF la rezultat. Se pierde valoarea inițială a primului operand (destinație), înlocuită cu rezultatul adunării. Al doilea operand este neschimbat. Primul operand al instrucțiunii adc poate fi un registru (cu excepția unui segment) sau o celulă de memorie, al doilea operand poate fi un registru (cu excepția unui segment), o celulă de memorie sau o valoare imediată, dar nu este permisă specificarea ambii operanzi simultan ca celule de memorie. Operanzii pot fi octeți sau cuvinte și reprezintă numere semnate sau fără semn. Comanda adc (împreună cu comanda add) este folosită în mod obișnuit pentru a adăuga numere pe 32 de biți. Comanda afectează steagurile OF, SF, ZF, AF, PF și CF.

Exemplul 1

Mov AX,1125h adc AX,2C25h ;AX=3D4Bh, dacă CF a fost = 1 ;AX=3D4Ah, dacă CF a fost = 0
Exemplul 2; În câmpurile de date: numlow dw 0FFFFh ;Partea inferioară a termenului 2 numhigh dw 000Sh ;Partea superioară a termenului 2;Numărul 0005FFFFh=393215 ;În segmentul de program: mov AX,000Sh ;Partea inferioară a primului termen BX, mov 0002h ; Cea mai înaltă parte a primului termen;Numărul 00020005h=131077 adăugați AX,numlow;Adăugarea părților inferioare. AX=4, CF=1 adc BX, numhigh ;Adăugarea pieselor superioare cu;transfer.BX:AX=0008:0004h. ;Număr 00080004h=524292
Este acceptabilă utilizarea operanzilor pe 32 de biți și a modurilor de adresare suplimentare ale procesoarelor pe 32 de biți. Instrucțiunea adc cu operanzi pe 32 de biți poate fi folosită pentru a adăuga numere întregi pe 64 de biți. Exemplul 3; În câmpurile de date mem321 dd 0FFFFFFFFh ;partea inferioară a primului termen mem32h dd 98765432h ;partea superioară a primului termen; În segmentul de program mov EAX,1 ;Partea inferioară a termenului 2 mov EBX,0 ;Partea superioară a termenului 2 adăugați EAX,mem321 ;Adăugați jumătățile inferioare;Suma=100000000b>32 biți;EAX=000000h, transport adc EBX,mem32h ;Adăugați jumătățile mai vechi și transferați. EBX=90000001h ;Suma: 9876543300000000h
ADD Adăugarea întregului

Comanda add adaugă primul și al doilea operand. Se pierde valoarea inițială a primului operand (destinație), înlocuită cu rezultatul adunării. Al doilea operand este neschimbat. Primul operand al comenzii add poate fi specificat ca un registru (cu excepția unui segment) sau o celulă de memorie, iar al doilea operand poate fi un registru (cu excepția unui segment), o celulă de memorie sau o valoare imediată, dar este nu este permis să se definească ambii operanzi simultan ca celule de memorie. Operanzii pot fi octeți sau cuvinte și reprezintă numere semnate sau fără semn. Comanda add poate fi folosită pentru a adăuga atât numere întregi obișnuite, cât și numere zecimale binare (folosind registrul AX pentru a stoca rezultatul). Când adăugați numere zecimale codificate binar (BCD) despachetate, utilizați comanda aaa după comanda adăugare; dacă sunt adăugate numere împachetate, atunci comanda daa. Comanda afectează steagurile OF, SF, ZF, AF, PF și CF. Exemplul 1

Mov BX,lFFEh mov CX,3 adăugați BX,CX ;BX=2001h, CX=0003h
Exemplul 2 mov AX,25h adauga AX,12h ;AX=0037h
Exemplul 3; În câmpurile de date: mem dw 128 ;În segmentul de program: adăugați mem,100 ;mem=228
Exemplul 4 mov AX,0507h ;BCD despachetat 57 adăugați AL,05h ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
Exemplul 5 mov AL,57h ;BCD impachetat 57 adauga AL,05h ;BCD 5, AL=5Ch daa ;AL=62h, BCD 62

Este acceptabilă utilizarea operanzilor pe 32 de biți și a modurilor de adresare suplimentare ale procesoarelor pe 32 de biți. Exemplu

Mov EAX,98765432h adauga EAX,11111111h ; EAX=A9876543h
ȘI ȘI logic

Comanda și efectuează o multiplicare logică (pe bit) a primului operand cu al doilea. Se pierde valoarea inițială a primului operand (destinație), înlocuită cu rezultatul înmulțirii. Primul operand al comenzii and poate fi un registru (cu excepția unui segment) sau o celulă de memorie, al doilea operand poate fi un registru (cu excepția unui segment), o celulă de memorie sau o valoare imediată, dar nu este permis să specificați ambii operanzi simultan ca celule de memorie. Operanzii pot fi octeți sau cuvinte. Comanda afectează steagurile SF, ZF și PF. Reguli pentru înmulțirea pe biți:

Primul operand bit 0101 Al doilea operand bit 0011 Rezultat bit 0001 Exemplul 1 mov AX,0FFEh și AX,5555h ;AX=0554h Exemplul 2; În câmpurile de date: mem dw 0С003h ;În segmentul de program: mov AX,700Eh și AX,mem ;AX=4002h

Este acceptabilă utilizarea operanzilor pe 32 de biți și a modurilor de adresare suplimentare ale procesoarelor pe 32 de biți. Exemplu

Mov EDX, 0FA8 8 0 0 4 lh și EDX,0FF00000Fh ; EDX = FA000001h
386P+ ARPL
Ajustarea nivelului de privilegii solicitat al selectorului

Comanda aprl compară selectorul cu un model care conține nivelul maxim de privilegii permis (de obicei selectorul CS) și setează valoarea de testat la cel mai mic dintre cele două niveluri de privilegii. Dacă schimbarea nivelului nu este necesară, indicatorul ZF este resetat; dacă este necesar, este setat. Primul operand al instrucțiunii aprl poate fi un registru de 16 biți sau un cuvânt de memorie cu un selector verificabil; al doilea operand este un registru de 16 biți cu un selector de model. 386+ LEGAT
Verificarea unui index de matrice pentru o matrice în afara limitelor

Comanda bound verifică dacă indexul specificat, tratat ca un număr cu semn, se află în limitele specificate de al doilea operand. Dacă indexul depășește limitele tabloului de dedesubt sau de deasupra, se generează o întrerupere cu vectorul 5. Primul operand trebuie să fie un registru care să conțină indexul care se verifică, al doilea - adresa unui câmp de memorie cu două limite ale tabloului. fiind verificat. Comanda legată permite operanzi atât pe 16 biți, cât și pe 32 de biți (dar atât primul cât și al doilea operanzi trebuie să fie de același tip).

Asamblator- Limbaj de asamblare pentru manechine

Limbajul de asamblare pentru manechine.(#2) (C) Mihail Spitsyn 1995 Steaguri Registrul „F” al procesorului se numește flag. Ce este? Un flag este o variabilă care poate avea două stări: set (egal cu unu) și șters (egal cu zero). Prin urmare, registrul „F” poate fi gândit ca un set de opt biți flag. Putem folosi doar patru dintre ele: steagul zero, steagul de transport, steagul semnului și steagul paritate-depășire.Operatii aritmetice. Aritmetica este o știință foarte, foarte utilă; în mod constant numărăm ceva: adunăm, scădem, împărțim, înmulțim. Vom vorbi acum despre cum să facem acest lucru în assembler. Vom începe cu cel mai simplu lucru, adăugând unul la ceva, de exemplu, pentru a înregistra „A”: **************************** *** ** LD A,NUBER INC A RET ******************************** După cum puteți vedea, este foarte simplu pentru aceasta există o comandă „INC” - increment (creștere cu unu), urmată de un operand, i.e. unele se înregistrează sau se înregistrează pereche: ******************************** INC A INC HL INC H INC DE INC E INC IY INC E INC (HL) INC (IX+N) INC (IY+N) ****************************** ** Dacă trebuie să măriți orice celulă de memorie cu una, atunci ar trebui să faceți acest lucru: ********************************* ****** *** LD HL,ADRES LD IX,ADRES INC (HL) INC (IX+0) RET RET ********************* **************** ***** Prima opțiune funcționează mai rapid și este mai convenabilă dacă lucrați cu o singură celulă de memorie, dar dacă lucrați într-un tabel, atunci nu este economic si urat. Comparați: trebuie să creștem primul, al cincilea și al zecelea octet din tabel cu unul: ******************************** * 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 ******************************** Tot ce s-a spus mai sus despre o creștere cu unu este adevărat și pentru scădere, adică a reduce cu unu: ******************************** 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) ********************* ********** Acum să presupunem că trebuie să creștem registrul „A” nu cu unul, ci, să zicem, cu zece: **************** * *************** LD A,NUMĂR ADĂUGAȚI A,10 RET ************************ * ****** Puteți adăuga registrul „A” cu un număr și alte registre și cu o celulă de memorie adresată prin perechile de registre „HL”, „IX” și „IY”. De asemenea, puteți adăuga perechi de registre cu „HL”, „IX” și „IY”. (PureBasic - sistem de fișiere) ******************************** ADAUGĂ A, N ADAUGĂ A, (HL) ADAUGĂ A ,A ADAUGĂ A,(IX+N) ADAUGĂ A,B ADAUGĂ A,(IY+N) ADAUGĂ A,C ADAUGĂ HL,HL ADAUGĂ A,D ADAUGĂ HL,BC ADAUGĂ A,E ADAUGĂ HL,DE ADAUGĂ A,H ADD HL,SP ADD IX,IX ADD IX,BC ADD IX,DE ADD IX,SP ******************************** ** După cum puteți vedea, setul de comenzi este destul de mare. La executarea acestei comenzi, poate apărea o eroare: ******************************** LD A,45 LD B,230 ADD A ,B RET ******************************** Suma „A” și „B” a depășit 255 și prin urmare, în „A” „ se va dovedi a nu fi 275, ci 20 (registrul „A” nu este cauciuc); Pentru a ne anunța că a avut loc o depășire, procesorul setează indicatorul de transport la unul. Rămâne doar să o verifici. Așa cum „INC” are „DEC”, „ADD” are și un „cuplu”, acesta este „SUB” și are propriile sale caracteristici. Comanda „SUB” funcționează numai cu registrul „A”, așa că atunci când scrieți mnemonicii pentru această comandă, „A” este omis: ********************* *********** SUB N SUB C SUB A SUB H SUB B SUB D SUB E SUB (HL) SUB (IX+N) SUB (IY+N) ******** * ********************** Comanda afectează indicatorul de transport în același mod ca „ADD”. Pe lângă perechea de comenzi „ADD” și „SUB”, există o altă pereche. Comenzile „ADC” și „SBC” funcționează ținând cont de indicatorul de transport, i.e. La adăugarea sau scăderea, valoarea indicatorului de transport este adăugată (scăderea) la rezultat. Există două comenzi speciale pentru a seta flag-ul de transport - „SCF” și „CCF”. „SCF” - setați indicatorul de transport la unul. „CCF” - setați indicatorul de transport la zero. ******************************** 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 **************************** **** Și acum exemple de lucru ale comenzilor „ADC” și „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 ******** ************************ În loc de cele două comenzi „CCF” și „SBC A,B” pot pune pur și simplu „SUB B”, rezultatul va fi același. ******************************** 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 **************************** **** După cum se poate vedea din rezultate, indicatorul de transport afectează semnificativ rezultatul operației. La scadere, se scade din rezultat, iar la adunare, se adauga la rezultat. S-a tratat aproape totul despre operațiile de adunare și scădere; acum vom vorbi despre împărțire și înmulțire. Din păcate, SPECCY nu are comenzi de împărțire și înmulțire, dar aceste comenzi pot fi compuse din alte câteva. De exemplu, trebuie să înmulțim conținutul a două registre - „A” și „C”: ***************************** ********** *** LD A,10 LD C,5 LD B,A XOR A LOOP ADD A,C DJNZ LOOP RET *************** ********** ****** În exemplu, există două comenzi noi - „XOR A” și „DJNZ LOOP”. „XOR A” șterge registrul „A”, iar comanda „DJNZ LOOP” repetă toate comenzile, de la comanda marcată cu o etichetă (de exemplu, „LOOP”) până la comanda „DJNZ” (urmată de aceeași etichetă). ka, ca la începutul ciclului); numărul de repetări este specificat în registrul „B”. Folosind faptul că înmulțirea M cu N înseamnă adăugarea numărului M la sine de N ori, puteți înțelege exemplul dat mai sus. Această proprietate poate fi folosită și pentru împărțire. Incearca-l tu insuti. Data viitoare vom vorbi despre comenzile pentru compararea și lucrul cu biți.________________________________

Alte articole din ediție:





Top