Instructiuni logice de salt conditionat si neconditionat, de deplasare si rotatie.
Lucrarea de laborator a fost structurata in doua parti. In prima parte sunt prezentate etapele de scriere si de executie a unui program editat in asamblor iar in a doua parte sunt prezentate instructiunile logice, de salt conditionat si neconditionat, de deplasare si rotatie.
La sfarsitul acestei lucrari, studentii vor avea notiuni de realizare a unor bucle conditionate sau nu de bitii registrului de fanione (F) cat si de realizare a unor operatii logice si de deplasare. programare in asamblor.
Studentii trebuie sa cunoasca pentru efectuarea acestui laborator:
- modul de reprezentare a numerelor in memorie: intregi cu sau fara semn, ZCB impachetat, ASCII, cu virgula fixa (pentru reprezentarea numerelor fractionare);
- sa faca estimarea marimii rezultatelor si operatorilor, pentru a se putea alege lungimea locatiilor de memorie necesara pentru stocarea lor;
- sa se cunoasca foarte bine modul de afectare a fanioanelor in urma unei operatii, deoarece salturile conditionate se fac relativ la acestea si, in plus, fanioanele ne pot da indicatii asupra corectitudinii executiei.
Programele scrise in asamblor se compun din: mnemonici - instructiuni, directive care descriu datele si pentru controlul programului, functii DOS utilizate in intreruperi si macroinstructiuni.
Programele executabile .exe ajung in aceasta faza in urma compilarii unui program asamblor (in cazul acesta). Programul executabil este transformat in program binar pentru a putea fi implementat pe microprocesor.
Figura C4.1. Reprezentarea etapelor de transformare a unui fisier scris in asamblor in fisier binar
Asamblorul prelucreaza un fisier text sursa (Prog.asm), scris cu un editor de texte si genereaza un modul obiect (Prog.obj) care contine instructiuni si date ce sunt plasate de la adresa 000. Dupa etapa de asamblare se genereaza si un fisier lista care contine comentarii asupra programului. Utilizand directiva include se copiaza in programul curent si alte programe eventual librarii la care se face referire. Modulele obiect nu sunt executabile dar pot fi depuse in biblioteci (Bibl.lib).
Editorul de legaturi (LINK) transforma modulele obiect, obtinute prin compilare in biblioteci. Dupa acesta etepa se obtin programe de tip .exe. In aceasta etapa se face legatura antre adresele modulelor si adresele relative dintre instructiuni. Adresele din instructiuni se recalculeaza relativ la inceputul segmentului tinand cont de adresa modulului in segment. Un program poate contine mai multe segmente. Adresele simbolice definite in alt modul trebuie scrise ca EXTERN iar cele care sun referite din exterior declarate cu PUBLIC. Asamblorul va genera cate un tabel cu etichetele referite in exterior (EXTRN) si unul cu etichetele care pot fi referite din exterior (PUBLIC), in care se specifica adresa lor din modul. In fisierul Prog.map se gasesc noile adrese ale modulelor si ale etichetelor definite ca externe.
Programul executabil (Prog.exe) poate fi lansat ca o comanda DOS, care prelucreaza datele si se obtin rezultatele. Prin programul BIN se poate obtine o varianta a programului asamblor in Prog.com.
1.2.Directive de control program
Proceduri
O procedura este o secventa de instructiuni care executa un algoritm pe baza unei descrieri formale. Avantajul procedurilor este ca ele sunt reutilizabile. In limbaj de asamblare exista proceduri (nu exista functii), definite cu directiva PROC si terminate cu ENDP. Revenirea din procedura in programul chemator se face cu instructiunea RET.
Forma generala:
nume_proc PROC near sau far ; inceput de procedura
RET [n] ;iesre din procedura cu eliberare stiva
nume_proc ENDP ; sfarsit de procedura
END start ; directiva de sfarsit de asamblare care da adresa de lansare progra
Atentie END se pune dupa ultimul modul din program.
Declararea unei variabile ca externa
Forma generala:
PUBLIC var1,var2,.. ; declarare variabile ca definitii externe
EXTRN simbol1:type1, simbol2:type2,.. ; declarare referinte externe spre alte module
unde type este de tip octet, cuvant, cuvant dublu, specificand lungimea
Tipul permite asamblorului sa genereze instructiuni pe lungimi corecte. Mentionam ca in limbaj de asamblare nu exista tipuri intregi, reale, logice, caracter ca in alte limbaje.
near si far pentru etichete apelate prin Jump sau Call
Eticheta LABEL far sau near ; definire explicita etichete locale (near) sau externe (far), care se pot apela din exterior.
Etichetele locale - near se pot specifica urmate de doua puncte(:)
Definire segmente
Forma generala:
nume_seg SEGMENT [align],[combinare],['clasa']
nume_seg ENDS
align - page - segmentul incepe la multiplu de 256
- para - multiplu de 16 (paragraf)
- word - multiplu de 2
- byte - multiplu de 1
Combinarea cu alte segmente:
- none -implicit
- public
- common - segmente care se incarca in paralel in aceeasi zona de memorie
- memory -segmente tratate impreuna de editor si plasate la sfarsitul memoriei
- AT adresa - specifica adresa la care se incarca segmentul
- stack - segment definit ca stiva si tratat ca public ( bazat cu SS)
ASSUME CS:seg1,DS:seg2,ES:seg3,SS:seg4 precizeaza registrele segment utilizate la adresarea datelor din fiecare segment.
2. Operatii logice
Instructiunea NOT este o instructiune prin care se complementeaza bitii unui operand scris in binar.
Complementare |
OF DF IF TF SF ZF AF PF CF |
|
NOT d |
fata de 1 | |
a destinatiei |
Descrierea formala a semanticii, in general: (d) FFH - (d) ,
pentru operand pe 8 biti,
sau (d) FFFFH - (d) pentru operand pe 16 biti.
Exmple pentru instructiunea NOT
Operanzi |
Exemple |
Descrierea formala a semanticii |
R |
NOT AX |
(AX) FFFFH - (AX) |
mem |
NOT [0EEFFH] |
((DS)0H +EEFFH) FFH - - ((DS)0H+EEFFH) |
Instructiunea AND - realizeaza SI intre doi
operanzi scrisi in binar, memorati in registre sau memorie sau intre
o
OF DF IF TF SF ZF AF PF CF |
||
AND d,s |
SI logic |
x x ? x 0 |
Descrierea formala a semanticii, in general: (d) (d) & (s)
Operanzi |
Exemple |
Descrierea formala a semanticii |
AL|AX, data |
AND AX,0FFH |
(AX) (AX) & 0033H |
R, data |
AND CX,10H |
(CX) (CX) & 0010H |
mem, data |
AND [DI],0AAAAH |
((DS)0H +(DI) +1) ((DS)0H +(DI)) ((DS)0H +(DI) +1) ((DS)0H +(DI)) & & AAAAH |
R1, r2 |
AND CL,DL |
(CL) (CL) & (DL) |
R, mem |
AND DX,[BP] |
(DX) (DX) & ((SS)0H + (BP) + 1H) ((SS)0H + (BP)) |
mem, r |
AND [BX+DI],CL |
((DS)0H+(BX)+(DI)) ((DS)0H+(BX)+(DI)) & (CL) |
Exemplu:
AND | |||||||||
- D1 24 |
1 | ||||||||
Rez1 |
1 07 66 |
Rez>0 |
- F0 AA |
Rez<0 | |||||
Masca |
C=1 |
S=1 |
C=1 | ||||||
Rez # 0 |
nu depasire |
Depasire transfer spre S |
si nu depasire |
Instructiunea TEST - compara doi operanzi utilizand operatia logica SI.
Compararea |
OF DF IF TF SF ZF AF PF CF |
|
TEST s1, s2 |
prin SI logic |
x x ? x 0 |
nedistructiv |
Descrierea formala a semanticii, in general: (s1) & (s2) .
Operanzi |
Exemple |
Descrierea formala a semanticii |
AL|AX, data |
TEST AL,55H |
( |
r, data |
TEST DI,1234H |
(DI) & 1234H |
mem, data |
TEST [SI],00101100B |
((DS)0H + (SI)) & 00101100B |
r1, r2 |
TEST DI,BX |
(DI) & (BX) |
r, mem |
TEST CL,[SI] |
(CL) & ((DS)0H + (SI)) |
Instructiunea OR (SAU) - realizeaza operatia logica SAU intre doi operanzi
OF DF IF TF SF ZF AF PF CF |
||
OR d,s |
SAU logic |
x x ? x 0 |
|
Descrierea formala a semanticii, in general: (d) (d) (s)
Exemplu:
Operanzi |
Exemple |
Descrierea formala a semanticii |
AL|AX, data |
OR AL,22H |
( |
r, data |
OR DX,1FFFH |
(DX) (DX) 1FFFH |
mem, data |
OR [BP+SI],1 |
((SS)0H +(BP) + (SI)) ((SS)0H +(BP) + (SI)) 01H |
r1, r2 |
OR CL,BL |
(CL) (CL) (BL) |
r, mem |
OR BX,[SI] |
(BX) (BX) ((DS)0H + (SI) + 1H) ((DS)0H + (SI)) |
mem, r |
OR [BP+DI],CX |
((SS)0H +(BP) +(DI) +1) ((SS)0H +(BP) +(DI)) ((SS)0H +(BP) +(DI) +1) ((SS)0H +(BP) +(DI)) (CX) |
Instructiunea XOR (SAU EXCLUSIV) - realizeaza operatia logica XOR intre doi operanzi.
OF DF IF TF SF ZF AF PF CF |
||
XOR d,s |
SAU exclusiv |
x x ? x 0 |
Descrierea formala a semanticii, in general: (d) (d) (s)
Operanzi |
Exemple |
Descrierea formala a semanticii |
AL|AX, data |
XOR AX,333H |
(AX) (AX) 0333H |
r, data |
XOR BP,245H |
(BP) (BP) 0245H |
mem, data |
XOR [DI],7788H |
((DS) 0H +(DI) +1H) ((DS) 0H +(DI)) ((DS) 0H +(DI) +1H) ((DS) 0H +(DI)) 7788H |
r1, r2 |
XOR DX,SI |
(DX) (DX) (SI) |
r, mem |
XOR CX,[BX+SI] |
(CX) (CX) ((DS)0H +(BX) +(SI) +1H) ((DS)0H +(BX) +(SI)) |
mem, r |
XOR [DI+0AAH],BL |
((DS)0H +(DI) +AAH) ((DS)0H +(DI) +AAH) (BL) |
3. Deplasari si rotatii
Instructiuni de deplasare spre dreapta (SAL, SHL) aritmetice sau logice. Numarul de biti cu care se realizeaza deplasarea este scis in nrce.
Deplasare stanga |
OF DF IF TF SF ZF AF PF CF |
|
SAL | SHL |
logica sau |
x x x ? x x |
s,nrcel |
aritmetica |
Descrierea formala a semanticii:
Operanzi |
Exemple |
r, 1 |
SHL BX,1 |
r, CL |
SAL DX,CL |
mem, 1 |
SHL [BX+SI],1 |
mem, CL |
SHL [DI+10H],CL |
while nrcel 0 do
(CF) (s)msb
(s) (s) * 2
(s)lsb 0
nrcel nrcel - 1
if nrcel = 1 then
if (s)msb (CF) then
(OF) 1
else (OF) 0
else (OF) nedeterminat .
Instructiunea SHR de deplasare spre stanga logica sau aritmetica cu un numar de biti indicat de nrcel.
Deplasare dreapta |
OF DF IF TF SF ZF AF PF CF |
|
SHR s, nrcel |
logica |
x x x ? x x |
Descrierea formala a semanticii:
Operanzi |
Exemple |
r, 1 |
SHR DL,1 |
r, CL |
SHR BX,CL |
mem, 1 |
SHR [DI],1 |
mem, CL |
SHR [BP+SI+4H],CL |
while nrcel 0 do
(s)msb 0
(s) (s) div 2
(CF) (s)lsb
nrcel nrcel - 1
if nrcel = 1 then
if (s)msb (s)msb-1 then
(OF) 1
else (OF) 0
else (OF) nedeterminat .
Deplasare dreapta |
OF DF IF TF SF ZF AF PF CF |
|
SAR s, nrcel |
aritmetica |
x x x ? x x |
Descrierea formala a semanticii este
Operanzi |
Exemple |
r, 1 |
SAR BH,1 |
r, CL |
SAR AX,CL |
mem, 1 |
SAR [BX],1 |
mem, CL |
SAR [BP+SI],CL |
similara cu cea a instructiunii
precedente (singura deosebire fiind ca msb trebuie sa fie pastrat, iar OF este resetat daca nrcel 1).
Instructiunea ROL de rotire a unui operand spre stanga. Numarul de rotatii este indicat in nrcel.
OF DF IF TF SF ZF AF PF CF |
|||
ROL s, nrcel |
Rotatie stanga |
x x |
|
Descrierea formala a semanticii:
Operanzi |
Exemple |
r, 1 |
ROL SI,1 |
r, CL |
ROL DX,CL |
mem, 1 |
ROL [BX+DI],1 |
mem, CL |
ROL [BP+100H],CL |
while nrcel 0 do
(s) (s) * 2
(CF) (s)msb
(s)lsb (s)msb
nrcel nrcel - 1
if nrcel = 1 then
if (s)msb (CF) then
(OF) 1
else (OF) 0
else (OF) nedeterminat .
Instructiunea ROR de rotire a unui operand spre dreapta. Numarul de rotatii este indicat in nrcel.
OF DF IF TF SF ZF AF PF CF |
||
ROR s, nrcel |
Rotatie dreapta |
x x |
Descrierea formala a semanticii:
Operanzi |
Exemple |
r, 1 |
ROR AX,1 |
r, CL |
ROR DX,CL |
mem, 1 |
ROR [BP],1 |
mem, CL |
ROR [1000H],CL |
while nrcel 0 do
(s) (s) div 2
(s)msb (s)lsb
(CF) (s)lsb
nrcel nrcel - 1
if nrcel = 1 then
if (s)msb (s)msb-1 then
(OF) 1
else (OF) 0
else (OF) nedeterminat .
Instructiunea RCL de rotatie stanga cu transport. Numarul de rotatii este indicat in nrcel.
Rotatie stanga |
OF DF IF TF SF ZF AF PF CF |
|
RCL s, nrcel |
cu transport |
x x |
Descrierea formala a semanticii este
asemanatoare cu rotatia stanga simpla.
Operanzi |
Exemple |
r, 1 |
RCL CX,1 |
r, CL |
RCL AL,CL |
mem, 1 |
RCL [SI],1 |
mem, CL |
RCL [BX+DI],CL |
Instructiunea RCL de rotatie dreapta cu transport. Numarul de rotatii este indicat in nrcel.
Rotatie dreapta |
OF DF IF TF SF ZF AF PF CF |
|
RCR s,nrcel |
cu transport |
x x |
Descrierea formala a semanticii este
asemanatoare cu a celorlalte rotatii.
Operanzi |
Exemple |
r, 1 |
RCR AX,1 |
r, CL |
RCR BX,CL |
mem, 1 |
RCR [BP+DI],1 |
mem, CL |
RCR [BX],CL |
4. Salturi propriu-zise neconditionate
Instructiunea JMP - este o instructiune de salt neconditionat, saltul consta in memorarea adresei de destinatie a saltului in reg. IP (Instruction Pointer).
Salt propriu-zis, |
OF DF IF TF SF ZF AF PF CF |
|
JMP adr |
neconditionat | |
Descrierea formala a semanticii, in functie de modul de adresare folosit:
a) Salt cu adresare absoluta (directa) intersegment:
JMP adr32 ; (CS) adr32h
(IP) adr32l
Sau, punand in evidenta faptul ca adresa completa face parte din formatul instructiunii:
(CS) ((CS)0H+(IP)+4) ((CS)0H+(IP)+3)
(IP) ((CS)0H+(IP)+2) ((CS)0H+(IP)+1)
Far Jmp - salt in afara segmentului curent si trebuie modificat IP si reg. CS. Deplasamentul este reprezentat pe 4 octeti.
b) Salt cu adresare relativa:
JMP disp8|disp16 ; (IP) (IP) + disp8|disp16
Deplasamentul face parte din formatul instructiunii curente.
Short Jmp - salt scurt cu +127 pana la -127 fata de IP (instructiunea curenta). Deplasament este reprezentata pe 1 octet.
c) Salt cu adresare in registru sau indirecta in memorie, intrasegment:
JMP r16 | mem16 ; (IP) (r16) | (mem16)
Near Jmp - salt in segmentul curent cu -32K pana la +32K fata de IP. Deplasament este reprezentat pe 2 octeti.
d) Salt cu adresare indirecta in memorie, intersegment:
JMP mem32 ; (CS) (mem32)h
(IP) (mem32)l
Saltul de tip far (indepartat) se face intre segmente si se modifica atat IP cat si registrul de segment CS in care se salveaza adresa segmentului care contine eticheta destinatie.
Operanzi |
Exemple |
Descrierea formala a semanticii |
adr32 |
JMP ET-IN-ALT-SEG |
(CS) ((CS) 0H+(IP)+4) ((CS) 0H+(IP)+3) (IP) ((CS) 0H+(IP)+2) ((CS) 0H+(IP)+1) |
disp16 |
JMP ET-IN-SEG |
(IP) (IP) + + ((CS)0H+(IP)+2) ((CS)0H+(IP)+1) |
disp8 |
JMP FOARTE-APROAPE |
(IP) (IP) + ((CS)0H+(IP)+1) |
r16 |
JMP BX |
(IP) (BX) |
mem* |
JMP [BX] |
(IP) ((DS) 0H+(BX)+1) ((DS) 0H+(BX)) |
mem** |
JMP [DI] |
(CS) ((DS) 0H+(DI)+3) ((DS) 0H+(DI)+2) (IP) ((DS)0H+(DI)+1) ((DS)0H+(DI)) |
* salt cu adresare indirecta definit cu directiva de asamblare ca salt intra-segment;
** salt cu adresare indirecta definit cu directiva de asamblare ca salt inter-segment.
2.5. Salturi conditionate
Instructiunile de salt sunt de tip SHORT (+127 la -127) sau NEAR (pentru procesoarele pe 32 de biti). In acest caz etichetele pot referi adrese in segmentul curent. Ele nu pot referi etichete din alt segment.
Forma generala a instructiunii este:
Jcond eticheta
Daca conditia este indeplinita atunci se incarca in registrul IP valoarea adresei unde se va realiza saltul.
Instructiunile aritmetice si logice pozitioneaza indicatorii de conditie functie de valoarea rezultatului. In instructiunile de salt conditionat pot testa indicatorii de fanioane, ca deexemplu:
Rez < 0 S=1
Rez >0 S=0 si Z=0
Rez=0 Z=1
Transport C=1
Paritate para P=1 - numarul bitilor de 1 este par
Depasire O=1
Salt propriu-zis, |
OF DF IF TF SF ZF AF PF CF |
|
Jxx disp8 |
neconditionat | |
Descrierea formala a semanticii:
if conditie then
(IP) (IP) + disp8 , sau, detaliat:
(IP) (IP) + ((CS)0H+(IP)+1)
Adunarea se face prin extensie cu semn la un numar de16 biti.
Mnemonica |
Cond. testata |
Interpretare |
JA | JNBE |
(CF)sau(ZF)=0 |
Salt daca 'peste' | daca 'nu sub sau egal' |
JAE|JNB|JNC |
(CF)=0 |
Salt daca 'peste sau egal'|daca 'nu sub'|daca 'nu exista transport' |
JB|JNAE|JC |
(CF)=1 |
Salt daca 'sub" | daca 'nu peste sau egal" | daca "exista transport' |
JBE | JNA |
(CF)sau(ZF)=1 |
Salt daca 'sub sau egal'| daca 'nu peste' |
JE | JZ |
(ZF)=1 |
Salt daca 'egal' | daca ' zero' |
JG | JNLE |
((SF)A(OF))sau(ZF)=0 |
Salt daca 'mai mare'| daca 'nu mai mic sau egal' |
JGE | JNL |
(SF)A(OF)=0 |
Salt daca 'mai mare sau egal '| daca 'nu mai mic' |
JL | JNGE |
(SF)A(OF)=1 |
Salt daca 'mai mic' | daca 'nu mai mare sau egal' |
JLE | JNG |
((SF)A(OF))sau(ZF)=1 |
Salt daca 'mai mic sau egal '| daca 'nu mai mare ' |
JNE | JNZ |
(ZF)=0 |
Salt daca 'ne-egal' | daca 'non-zero' |
JNO |
(OF)=0 |
Salt daca 'nu exista depasire' |
JNP | JPO |
(PF)=0 |
Salt daca ' non- paritate'| daca 'impar' |
JNS |
(SF)=0 |
Salt daca 'non-semn' | daca 'pozitiv' |
JO |
(OF)=1 |
Salt daca 'exista depasire' |
JP | JPE |
(PF)=1 |
Salt daca 'exista paritate'| daca 'par' |
JS |
(SF)=1 |
Salt daca 'exist semn' |
NOTA: - conditiile care se traduc cu 'mai mare' sau 'mai mic' se refera la operatii asupra unor numere cu semn;
- exprimarile 'sub' sau 'peste' se aplica operatiilor asupra unor numere fara semn.
5. Modul de lucru recomandat
Programele prezentate in acest laborator, vor fi copiate in simulatorul Emu8086 si executate pas cu pas, urmarindu-se modificarile realizate in memorie si registre dupa executia fiecarei instructiuni. La instructiunile de salt se va urmari continutul registrului IP respectiv al registrulului CS, determinand tipul de salt.
Programul 1
Utilizarea instructiunilor logice si de salt conditionat.
Daca programul contine numai cate un segment de fiecare tip se poate simplifica scrirea specificand unde incepe segmentulde code .CODEde date DATA si stiva .STACK. Rezervarea spatiului pentru stiva se face pe lungimea data si automat se incarca reg.SS.
Modulul de date se numeste implicit @DATA referit pentru incarcare registru segment DS. Daca se scriu programe complexe cu multe segmente de diferite tipuri trebuie sa se utilizeze segmentarea explicita prin definire segmente cu nume cu directiva SEGMENT.
; .model small ; model pe cu segmente de 64Ko
.stack 256 ; rezervare 256 octeti pentru stiva
; Segmentul de date
.data
A dw 2345h,0EADEh,0EFEEh
NA db 3 dup(0) ; nr biti elemente tab A
N equ 3 ; numar elemente tablou A
; Segmentul de code al programului
; -------- ----- ------ ----
.code
st1: mov ax,@data ; initializare registrul segment de date DS
mov ds,ax ;
mov si,0 ; index in tabloul A
mov di,0 ; index in tabloul NA
mov dh,N ; nr. elemente tablou
; Ciclu pentru numarare biti element A(I)
c1: mov ax,A[si] ; incarcare element A(I)
mov bx,A[SI]; incarcare element A[I] in reg BX
and bh,bl
or bh,bl
xor bh,bh
rol bh,3
mov cx,16 ; numar ranguri binare
c2: shl ax,1 ; deplasare stinga cu un rang
jnc c3 ; bitul este zero
inc NA[di] ; bitul este 1
c3: loop c2 ; urmatorul rang
add si,2 ; adresa urmatorului element din A(I)
inc di
dec dh ; verificare sfirsit tablou X
mov ax,A[si] ; incarcare element A(I)
jnz c1
int 3 ; terminare program
end st1 ; adresa lansare program
Utilizarea salturilor interegment si intrasegment sunt exemplificate in programul urmator
Program 2
Fie un numar zecimal ASCII introdus de la tastatura. Sa se realizeze conversia binara pe doi octeti.
.model small
.stack 100
.data
z1 db 10,0,10 dup (30h),10,13,'$' ; nr zecimal
zece dw 10
n db 0 ; numar cifre zecimale
dw 17394 ; pentru verificare rezultat
bin dw 0 ; numar binar rezultat
m1 db 13,10,'Introduceti un numar de 5 cifre:',13,10,'$'
.code
st1: mov ax,@data
mov ds,ax
mov dx,offset m1 ; afisare mesaj dialog
mov ah,9
int 21h
mov dx,offset z1 ; adresa numar zecimal
mov ah,10 ; asteptare numar
int 21h
mov bx,offset z1+2 ; adresa prima cifra
mov cx,0
mov cl,z1+1 ; numar de cifre numar zecimal
call czb ; procedura conversie zec-bin
mov bin,ax ; memorare numar binar
int 3
; Procedura conversie zecimal ASCII -binar 2 octeti
; - intrare BX = adresa numar zecimal, CX = numar cifre zecimale
; - iesire AX = numar binar
; -------- ----- ------ --------
czb proc
xor ax,ax ; AX = 0
mov si,ax ; index prima cifra
mov n,cl ; numar cifre zecimale
c3: mov cl,[bx+si] ; incarcare cifra ASCII
and cl,0fh ; anulare primii 4 biti
mul zece ; N = N*10
add ax,cx ; N = N*10 + cifra
inc si ; urmatoarea cifra
dec n
jnz c3
ret
czb endp
end st1
Programul 3
Programul simuleaza o inmultire pe 16 biti din inmultiri pe 8 biti. Rezultatul, care poate avea maximum 32 de biti, se memoreaza in cuvintele de memorie 'hrez' si 'lrez'.
Algoritmul de calcul este urmatorul:
Un numar de 16 biti se poate reprezenta astfel:
XYZTh = XY256 + ZT
(XY este continutul octetului 'high' iar ZT este continutul octetului 'low').
Atunci:
ABCDhXYZTh=ABXY256256 + (ABZT+XYCD)256 + CDZT.
Operatiile de inmultire cu puteri ale lui doi se fac prin deplasari. La sfarsitul programului se face direct inmultirea pe 16 biti a celor doi operanzi, pentru a putea verifica corectitudinea algoritmului.
org 100h
start: mov al,byte ptr op1+1
mul byte ptr [op2+1]
mov hrez,ax
mov al,byte ptr op1+1
mul byte ptr op2
mov dx,ax
mov cl,8
sal ax,cl
mov cl,8
shr dx,cl
add lrez,ax
adc hrez,0
add hrez,dx
mov al,byte ptr op2+1
mul byte ptr op1
mov dx,ax
mov cl,8
shl ax,cl
mov cl,8
shr dx,cl
add lrez,ax
adc hrez,0
add hrez,dx
mov al,byte ptr op1
mul byte ptr op2
add lrez,ax
adc hrez,0
mov ax,lrez
mov dx,hrez
mov ax,op1
mul op2
int 20h
op1: dw 300
op2: dw 200
lrez: dw ?
hrez: dw ?s
end
Realizati organigrama dupa care a fost construit programul.
Program 4
In programul urmator, pentru a usura rularea pas cu pas, dupa fiecare salt conditionat se revine la instructiunea imediat urmatoare, cu ajutorul unui salt neconditionat indirect prin BX. De aceea, se poate observa in program ca, inainte de salturile conditionate, se pregateste registrul BX.
org 100h
jmp start
start: mov ax,cs
mov ds,ax
; SALTURI CONDITIONATE
mov al,op1
lea bx,adr1
cmp al,op2 ;in functie de starea fanioanelor
;dupa CMP se estimeaza, mai intii,
ja fin ;efectul celor doua instructiuni
;JA si JG, iar apoi se verifica
adr1: jg fin
mov al,op2 ;in functie de starea fanioanelor
lea bx,adr2 ;dupa CMP se estimeaza, mai intii,
cmp al,op1 ;efectul celor doua instructiuni
jb fin ; JB si JL, iar apoi se verifica
adr2: jl fin
lea bx,adr3
cmp al,op2
jz fin
adr3: lea bx,adr4
and al,0feh
jnp fin
adr4: jp fin
jmp ies ; SALT NECONDITIONAT
fin: jmp bx ; SALT INDIRECT
ies: int 20h
op1 db 0feh ; valoare fara semn 253 valoare cu semn -2
op2 db 3
end
Observatii:
In programele scrise in limbaj de asamblare, datele se declara in general la sfarsit. Daca se fac declaratiile la inceput, procesorul va interpreta aceste date ca pe niste instructiuni. Efectul acestora este greu de prevazut. Pentru a evita acest lucru este necesar ca programul sa inceapa cu un salt neconditionat la prima instructiune.
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |