Aplicaţii
1. Se cere rularea pas cu pas a următorului program:
.model small
.stack 100
.data
tabc db '0123456789ABCDEF'
.code
start: mov ax,@data
mov ds,ax
mov al,0 ;iniţializează AL
repet: mov bx,offset tabc ;pune în BX adresa efectivă tabc
push ax ;salvează AL în stivă
xlat ;pune în AL octetul de la adresa efectivă [BX+AL]
call afisare ;apelul procedurii afisare
pop ax
inc al
cmp al,10H ;se verifică dacă s-au afişat toate caracterele
jz sfarsit
jmp repet
afisare proc
mov dl,al ;pune în DL codul caracterului care trebuie afişat
mov ah,2h ;funcţia DOS pentru afişarea caracterului din DL
int 21h
mov dl,' '
mov ah,2h
int 21h
11
ret
afisare endp
sfarsit: mov ax,4c00h ;funcţia DOS de ieşire în sistemul de operare
int 21h
end start
2. De ce este necesară salvarea în stivă a registrului AX, iar apoi restaurarea ei?
3. Modificaţi programul de mai sus pentru determinarea pătratului unui număr din intervalul
0-15.
4. Se cere rularea pas cu pas a următorului program:
.model small
.stack 100
.data
adr1 dw 1234h
adr2 dw 5678h
adr3 dw 9012h
adr4 dw 3456h
tabela dd adr1, adr2, adr3, adr4
.code
start: mov ax, @data
mov ds, ax
mov cx, 1
mov bx, cx
add bx, bx
add bx, bx
les di, tabela[bx]
mov ax, es:[di]
mov ah, 4ch
int 21h
end start
5. Modificaţi programul de mai sus astfel încât să fie pusă în AX valoarea care se află la
adr4.
6. Care din instrucţiunile următoare sunt corecte?
mov al, si
mov ds, es
mov ax, ip
mov bl, al
mov cs, 23H
7. Care este efectul următoarei secvenţe de instrucţiuni?
.data
alfa db 14H
tabel db 0A1H, 10, 0AFH, 23Q, 1111B, 0011B
.code
…………………
lea bx, tabel
mov si, 3
mov al, [bx][si]
8. Care este conţinutul locaţiei alfa după executarea urmoarei secvenţe de instrucţiuni?
.data
alfa db 23h
beta db 43h
.code
…………………
mov al, alfa
xchg al, beta
mov alfa, al
Programare în limbaj de asamblare
Lucrarea nr. 3.
Instrucţiuni aritmetice şi logice
• instrucţiuni specifice adunării: ADD, ADC, INC, DAA, AAA
• instrucţiuni specifice scăderii: SUB, SBB, DEC, NEG, CMP, DAS, AAS
• instrucţiuni specifice înmulţirii: CBW, CWD, MUL, IMUL, AAM
• instrucţiuni specifice împărţirii: DIV, IDIV, AAD
• instrucţiuni logice: NOT, AND, TEST, OR, XOR
• instrucţiuni de deplasare: SHL, SAL, SHR, SAR
• instrucţiuni de rotaţie: ROL, RCL, ROR, RCR
8.1 Instrucţiuni specifice adunării
Instrucţiunea ADD (Add - Adună)
ADD dest, sursa
dest ← dest + sursa
Instrucţiunea ADC (Add with Carry - Adună cu transport)
ADC dest, sursa
dest ← dest + sursa + CF
Instrucţiunea INC (Increment - Incrementează)
INC dest
dest ← dest + 1
Instrucţiunea DAA (Decimal Adjust for Addition - Corecţie zecimală după adunare)
Instrucţiunea nu are operanzi şi efectuează corecţia zecimală a acumulatorului AL, după o adunare cu
operanzi în format BCD împachetat. Să considerăm, de exemplu, adunarea valorilor BCD 65 şi 17. Aceste
valori se reprezintă prin octeţii 65H şi 17H. În urma adunării, se obţine rezultatul 7CH, care este incorect ca
rezultat BCD. Operaţia de corecţie conduce la rezultatul 82H, ceea ce reprezintă suma BCD a celor două
valori.
Instrucţiunea AAA (ASCII Adjust for Addition - Corecţie ASCII după adunare)
Instrucţiunea nu are operanzi şi efectuează corecţia acumulatorului AX, după operaţii de adunare cu
operanzi BCD despachetaţi (o cifră BCD pe un octet). Să considerăm, de exemplu, adunarea valorilor
0309H şi 0104H, care ar corespunde valorilor BCD despachetate 39 şi 14. În urma adunării, se obţine
rezultatul 040DH. Instrucţiunea AAA corectează acest rezultat la 0503H care este suma BCD a celor două
valori.
8.2 Instrucţiuni specifice scăderii
Instrucţiunea SUB (Substract - Scade)
SUB dest, sursa
dest ← dest - sursa
Instrucţiunea SBB (Substract with Borrow - Scade cu împrumut)
SBB dest, sursa
dest ← dest - sursa - CF
Instrucţiunea DEC (Decrement - Decrementează)
DEC dest
dest ← dest - 1
Instrucţiunea NEG (Negate - Schimbă semnul)
NEG dest
dest ← 0 - dest
Instrucţiunea CMP (Compare - Compară)
CMP dest, sursa
Execută scăderea temporară dest - sursa fără a modifica vreun operand, dar cu poziţionarea bistabililor de
condiţie (FLAGS)
Instrucţiunea DAS (Decimal Adjust for Substraction - Corecţie zecimală după scădere)
Instrucţiunea nu are operanzi şi efectuează corecţia zecimală a acumulatorului AL, după o scădere cu
operanzi în format BCD împachetat. Să considerăm, de exemplu, scăderea valorilor BCD 52 şi 24. Operaţia
de corecţie conduce la rezultatul 28H (52-24=28).
Instrucţiunea AAS (ASCII Adjust for Substraction - Corecţie ASCII după scădere)
Instrucţiunea nu are operanzi şi efectuează corecţia acumulatorului AX, după operaţii de scădere cu
operanzi BCD despachetaţi (o cifră BCD pe un octet). Să considerăm, de exemplu, scăderea valorilor
0502H şi 0204H. Instrucţiunea AAS corectează rezultatul la 0208H.
8.3 Instrucţiuni specifice înmulţirii
Instrucţiunea CBW (Convert Byte to Word - Converteşte octet la cuvânt)
Extinde bitul de semn din AL la întreg registrul AH, obţinându-se astfel o reprezentare a lui AL pe 2 octeţi.
Instrucţiunea CWD (Convert Word to DoubleWord - Converteşte cuvânt la dublu-cuvânt)
Extinde bitul de semn din AX la întreg registrul DX, obţinându-se astfel o reprezentare a lui AX pe 4 octeţi.
Instrucţiunea MUL (Multiply - Înmulţeşte fără semn)
MUL sursa
AH:AL ← AL * sursa (dacă sursa este pe octet)
DX:AX ← AX * sursa (dacă sursa este pe 2 octeţi)
Instrucţiunea IMUL (Integer Multiply - Înmulţeşte cu semn)
IMUL sursa
Este similară cu instrucţiunea MUL. Deosebirea este că operaţia de înmulţire se face considerând operanzii
numere cu semn.
Instrucţiunea AAM (ASCII Adjust for Multiply - Corecţie ASCII după înmulţire)
Instrucţiunea nu are operanzi şi efectuează corecţia acumulatorului AX, după o înmulţire pe 8 biţi cu
operanzi BCD despachetaţi (o cifră BCD pe un octet). Să considerăm, de exemplu, înmulţirea valorilor 5 şi
Instrucţiunea AAM corectează rezultatul 2DH la 0405H.
1. Se cere rularea pas cu pas a următorului program:
.model small
.stack 100
.data
tabc db '0123456789ABCDEF'
.code
start: mov ax,@data
mov ds,ax
mov al,0 ;iniţializează AL
repet: mov bx,offset tabc ;pune în BX adresa efectivă tabc
push ax ;salvează AL în stivă
xlat ;pune în AL octetul de la adresa efectivă [BX+AL]
call afisare ;apelul procedurii afisare
pop ax
inc al
cmp al,10H ;se verifică dacă s-au afişat toate caracterele
jz sfarsit
jmp repet
afisare proc
mov dl,al ;pune în DL codul caracterului care trebuie afişat
mov ah,2h ;funcţia DOS pentru afişarea caracterului din DL
int 21h
mov dl,' '
mov ah,2h
int 21h
11
ret
afisare endp
sfarsit: mov ax,4c00h ;funcţia DOS de ieşire în sistemul de operare
int 21h
end start
2. De ce este necesară salvarea în stivă a registrului AX, iar apoi restaurarea ei?
3. Modificaţi programul de mai sus pentru determinarea pătratului unui număr din intervalul
0-15.
4. Se cere rularea pas cu pas a următorului program:
.model small
.stack 100
.data
adr1 dw 1234h
adr2 dw 5678h
adr3 dw 9012h
adr4 dw 3456h
tabela dd adr1, adr2, adr3, adr4
.code
start: mov ax, @data
mov ds, ax
mov cx, 1
mov bx, cx
add bx, bx
add bx, bx
les di, tabela[bx]
mov ax, es:[di]
mov ah, 4ch
int 21h
end start
5. Modificaţi programul de mai sus astfel încât să fie pusă în AX valoarea care se află la
adr4.
6. Care din instrucţiunile următoare sunt corecte?
mov al, si
mov ds, es
mov ax, ip
mov bl, al
mov cs, 23H
7. Care este efectul următoarei secvenţe de instrucţiuni?
.data
alfa db 14H
tabel db 0A1H, 10, 0AFH, 23Q, 1111B, 0011B
.code
…………………
lea bx, tabel
mov si, 3
mov al, [bx][si]
8. Care este conţinutul locaţiei alfa după executarea urmoarei secvenţe de instrucţiuni?
.data
alfa db 23h
beta db 43h
.code
…………………
mov al, alfa
xchg al, beta
mov alfa, al
Programare în limbaj de asamblare
Lucrarea nr. 3.
Instrucţiuni aritmetice şi logice
• instrucţiuni specifice adunării: ADD, ADC, INC, DAA, AAA
• instrucţiuni specifice scăderii: SUB, SBB, DEC, NEG, CMP, DAS, AAS
• instrucţiuni specifice înmulţirii: CBW, CWD, MUL, IMUL, AAM
• instrucţiuni specifice împărţirii: DIV, IDIV, AAD
• instrucţiuni logice: NOT, AND, TEST, OR, XOR
• instrucţiuni de deplasare: SHL, SAL, SHR, SAR
• instrucţiuni de rotaţie: ROL, RCL, ROR, RCR
8.1 Instrucţiuni specifice adunării
Instrucţiunea ADD (Add - Adună)
ADD dest, sursa
dest ← dest + sursa
Instrucţiunea ADC (Add with Carry - Adună cu transport)
ADC dest, sursa
dest ← dest + sursa + CF
Instrucţiunea INC (Increment - Incrementează)
INC dest
dest ← dest + 1
Instrucţiunea DAA (Decimal Adjust for Addition - Corecţie zecimală după adunare)
Instrucţiunea nu are operanzi şi efectuează corecţia zecimală a acumulatorului AL, după o adunare cu
operanzi în format BCD împachetat. Să considerăm, de exemplu, adunarea valorilor BCD 65 şi 17. Aceste
valori se reprezintă prin octeţii 65H şi 17H. În urma adunării, se obţine rezultatul 7CH, care este incorect ca
rezultat BCD. Operaţia de corecţie conduce la rezultatul 82H, ceea ce reprezintă suma BCD a celor două
valori.
Instrucţiunea AAA (ASCII Adjust for Addition - Corecţie ASCII după adunare)
Instrucţiunea nu are operanzi şi efectuează corecţia acumulatorului AX, după operaţii de adunare cu
operanzi BCD despachetaţi (o cifră BCD pe un octet). Să considerăm, de exemplu, adunarea valorilor
0309H şi 0104H, care ar corespunde valorilor BCD despachetate 39 şi 14. În urma adunării, se obţine
rezultatul 040DH. Instrucţiunea AAA corectează acest rezultat la 0503H care este suma BCD a celor două
valori.
8.2 Instrucţiuni specifice scăderii
Instrucţiunea SUB (Substract - Scade)
SUB dest, sursa
dest ← dest - sursa
Instrucţiunea SBB (Substract with Borrow - Scade cu împrumut)
SBB dest, sursa
dest ← dest - sursa - CF
Instrucţiunea DEC (Decrement - Decrementează)
DEC dest
dest ← dest - 1
Instrucţiunea NEG (Negate - Schimbă semnul)
NEG dest
dest ← 0 - dest
Instrucţiunea CMP (Compare - Compară)
CMP dest, sursa
Execută scăderea temporară dest - sursa fără a modifica vreun operand, dar cu poziţionarea bistabililor de
condiţie (FLAGS)
Instrucţiunea DAS (Decimal Adjust for Substraction - Corecţie zecimală după scădere)
Instrucţiunea nu are operanzi şi efectuează corecţia zecimală a acumulatorului AL, după o scădere cu
operanzi în format BCD împachetat. Să considerăm, de exemplu, scăderea valorilor BCD 52 şi 24. Operaţia
de corecţie conduce la rezultatul 28H (52-24=28).
Instrucţiunea AAS (ASCII Adjust for Substraction - Corecţie ASCII după scădere)
Instrucţiunea nu are operanzi şi efectuează corecţia acumulatorului AX, după operaţii de scădere cu
operanzi BCD despachetaţi (o cifră BCD pe un octet). Să considerăm, de exemplu, scăderea valorilor
0502H şi 0204H. Instrucţiunea AAS corectează rezultatul la 0208H.
8.3 Instrucţiuni specifice înmulţirii
Instrucţiunea CBW (Convert Byte to Word - Converteşte octet la cuvânt)
Extinde bitul de semn din AL la întreg registrul AH, obţinându-se astfel o reprezentare a lui AL pe 2 octeţi.
Instrucţiunea CWD (Convert Word to DoubleWord - Converteşte cuvânt la dublu-cuvânt)
Extinde bitul de semn din AX la întreg registrul DX, obţinându-se astfel o reprezentare a lui AX pe 4 octeţi.
Instrucţiunea MUL (Multiply - Înmulţeşte fără semn)
MUL sursa
AH:AL ← AL * sursa (dacă sursa este pe octet)
DX:AX ← AX * sursa (dacă sursa este pe 2 octeţi)
Instrucţiunea IMUL (Integer Multiply - Înmulţeşte cu semn)
IMUL sursa
Este similară cu instrucţiunea MUL. Deosebirea este că operaţia de înmulţire se face considerând operanzii
numere cu semn.
Instrucţiunea AAM (ASCII Adjust for Multiply - Corecţie ASCII după înmulţire)
Instrucţiunea nu are operanzi şi efectuează corecţia acumulatorului AX, după o înmulţire pe 8 biţi cu
operanzi BCD despachetaţi (o cifră BCD pe un octet). Să considerăm, de exemplu, înmulţirea valorilor 5 şi
Instrucţiunea AAM corectează rezultatul 2DH la 0405H.
8.4 Instrucţiuni specifice împărţirii
Instrucţiunea DIV (Divide - Împarte fără semn)
DIV sursa
Dacă sursa este pe octet:
AL ← AX / sursa
AH ← AX mod sursa
Dacă sursa este pe 2 octeţi:
AX ← DX:AX / sursa
DX ← DX:AX mod sursa
Instrucţiunea IDIV (Integer Divide - Împarte cu semn)
IDIV sursa
Este similară cu instrucţiunea DIV. Deosebirea este că operaţia de împărţire se face considerând operanzii
numere cu semn.
Instrucţiunea AAD (ASCII Adjust for Division - Corecţie ASCII înainte de împărţire))
Instrucţiunea nu are operanzi şi efectuează corecţia acumulatorului AX. Operaţia de corecţie trebuie făcută
înainte de împărţirea unui număr BCD pe 2 octeţi la un număr BCD pe un octet.
8.5 Instrucţiuni logice
Instrucţiunea NOT (Not - Negare logică bit cu bit)
NOT dest
Instrucţiunea AND (And - Şi logic bit cu bit)
AND dest, sursa
Instrucţiunea TEST (Test - Testează)
TEST dest, sursa
Efectul este execuţia unei operaţii AND între cei doi operanzi, fără a se modifica destinaţia, dar cu
poziţionarea flagurilor la fel ca la instrucţiunea AND.
Instrucţiunea OR (Or - Sau logic bit cu bit)
OR dest, sursa
Instrucţiunea XOR (Exclusive Or - Sau-exclusiv bit cu bit)
XOR dest, sursa
8.6 Instrucţiuni de deplasare
Instrucţiunea SHL/SAL (Shift Logic/Arithmetic Left - Deplasează logic/aritmetic la stânga)
SHL operand, contor
SAL operand, contor
Bitul cel mai semnificativ trece în CF, după care toţi biţii se deplasează la stânga cu o poziţie. Bitul cel mai
puţin semnificativ devine 0. Numărul operaţiilor este dat de contor.
Instrucţiunea SHR (Shift Logic Right - Deplasează logic la dreapta)
SHR operand, contor
Bitul cel mai puţin semnificativ trece în CF, după care toţi biţii se deplasează la dreapta cu o poziţie. Bitul
cel mai semnificativ devine 0. Numărul operaţiilor este dat de contor.
Instrucţiunea SAR (Shift Arithmetic Right - Deplasează aritmetic la dreapta)
SAR operand, contor
Singura diferenţă faţă de instrucţiunea SHR, este că se conservă bitul de semn, mai precis, completarea
dinspre stânga se face cu bitul de semn.
8.7. Instrucţiuni de rotire
Instrucţiunea ROL (Rotate Left - Roteşte la stânga)
ROL operand, contor
Bitul cel mai semnificativ trece atât în CF, cât şi în bitul cel mai puţin semnificativ, după ce toţi biţii s-au
deplasat la stânga cu o poziţie. Numărul operaţiilor este dat de contor.
Instrucţiunea RCL (Rotate Left through Carry- Roteşte la stânga prin carry)
RCL operand, contor
Bitul cel mai semnificativ trece în CF, toţi biţii se deplasează la stânga cu o poziţie, iar CF original trece în
bitul cel mai puţin semnificativ. Numărul operaţiilor este dat de contor.
Instrucţiunea ROR (Rotate Right - Roteşte la dreapta)
ROR operand, contor
Bitul cel mai puţin semnificativ trece atât în CF, cât şi în bitul cel mai semnificativ, după ce toţi biţii s-au
deplasat la dreapta cu o poziţie. Numărul operaţiilor este dat de contor.
Instrucţiunea RCR (Rotate Right through Carry- Roteşte la dreapta prin carry)
RCR operand, contor
Bitul cel mai puţin semnificativ trece în CF, toţi biţii se deplasează la dreapta cu o poziţie, iar CF original
trece în bitul cel mai semnificativ. Numărul operaţiilor este dat de contor.
Instrucţiunea DIV (Divide - Împarte fără semn)
DIV sursa
Dacă sursa este pe octet:
AL ← AX / sursa
AH ← AX mod sursa
Dacă sursa este pe 2 octeţi:
AX ← DX:AX / sursa
DX ← DX:AX mod sursa
Instrucţiunea IDIV (Integer Divide - Împarte cu semn)
IDIV sursa
Este similară cu instrucţiunea DIV. Deosebirea este că operaţia de împărţire se face considerând operanzii
numere cu semn.
Instrucţiunea AAD (ASCII Adjust for Division - Corecţie ASCII înainte de împărţire))
Instrucţiunea nu are operanzi şi efectuează corecţia acumulatorului AX. Operaţia de corecţie trebuie făcută
înainte de împărţirea unui număr BCD pe 2 octeţi la un număr BCD pe un octet.
8.5 Instrucţiuni logice
Instrucţiunea NOT (Not - Negare logică bit cu bit)
NOT dest
Instrucţiunea AND (And - Şi logic bit cu bit)
AND dest, sursa
Instrucţiunea TEST (Test - Testează)
TEST dest, sursa
Efectul este execuţia unei operaţii AND între cei doi operanzi, fără a se modifica destinaţia, dar cu
poziţionarea flagurilor la fel ca la instrucţiunea AND.
Instrucţiunea OR (Or - Sau logic bit cu bit)
OR dest, sursa
Instrucţiunea XOR (Exclusive Or - Sau-exclusiv bit cu bit)
XOR dest, sursa
8.6 Instrucţiuni de deplasare
Instrucţiunea SHL/SAL (Shift Logic/Arithmetic Left - Deplasează logic/aritmetic la stânga)
SHL operand, contor
SAL operand, contor
Bitul cel mai semnificativ trece în CF, după care toţi biţii se deplasează la stânga cu o poziţie. Bitul cel mai
puţin semnificativ devine 0. Numărul operaţiilor este dat de contor.
Instrucţiunea SHR (Shift Logic Right - Deplasează logic la dreapta)
SHR operand, contor
Bitul cel mai puţin semnificativ trece în CF, după care toţi biţii se deplasează la dreapta cu o poziţie. Bitul
cel mai semnificativ devine 0. Numărul operaţiilor este dat de contor.
Instrucţiunea SAR (Shift Arithmetic Right - Deplasează aritmetic la dreapta)
SAR operand, contor
Singura diferenţă faţă de instrucţiunea SHR, este că se conservă bitul de semn, mai precis, completarea
dinspre stânga se face cu bitul de semn.
8.7. Instrucţiuni de rotire
Instrucţiunea ROL (Rotate Left - Roteşte la stânga)
ROL operand, contor
Bitul cel mai semnificativ trece atât în CF, cât şi în bitul cel mai puţin semnificativ, după ce toţi biţii s-au
deplasat la stânga cu o poziţie. Numărul operaţiilor este dat de contor.
Instrucţiunea RCL (Rotate Left through Carry- Roteşte la stânga prin carry)
RCL operand, contor
Bitul cel mai semnificativ trece în CF, toţi biţii se deplasează la stânga cu o poziţie, iar CF original trece în
bitul cel mai puţin semnificativ. Numărul operaţiilor este dat de contor.
Instrucţiunea ROR (Rotate Right - Roteşte la dreapta)
ROR operand, contor
Bitul cel mai puţin semnificativ trece atât în CF, cât şi în bitul cel mai semnificativ, după ce toţi biţii s-au
deplasat la dreapta cu o poziţie. Numărul operaţiilor este dat de contor.
Instrucţiunea RCR (Rotate Right through Carry- Roteşte la dreapta prin carry)
RCR operand, contor
Bitul cel mai puţin semnificativ trece în CF, toţi biţii se deplasează la dreapta cu o poziţie, iar CF original
trece în bitul cel mai semnificativ. Numărul operaţiilor este dat de contor.
Niciun comentariu:
Trimiteți un comentariu