print "
";
ASM testul 018
1.
Macrodefinitia:
contor_sir MACRO sir,lgsir,char,contor
LABEL ciclu
MOV CX,lgsir
LEA SI,sir
ciclu:
LODSB
CMP Al,char
JNZ salt
INC contor
salt:
LOOP ciclu
ENDM
a) executa numararea aparitiilor caracterul date de variabila char
b) nu executa numararea aparitiilor unui caracter intr-un sir pentru ca registrul BX in care are loc numaratoarea
c)necesita initializarea variabilei contor cu zero la definire contor DW 0
d)executa numaratoarea aparitiilor unui caracter specificat intr-un sir numai daca se salveaza si se restaureaza registri
e) necesita inserarea instructiunii MOV contor,0 inainte de eticheta ciclu:
2.
Macrodefinitia:
contor_sir MACRO sir,lgsir,char,contor
LABEL ciclu,salt
MOV CX,lgsir
LEA SI,sir
XOR BX,BX
ciclu:
LODSB
CMP Al,char
JNZ salt
INC BX
salt:
LOOP ciclu
ENDM
a) executa numararea aparitiilor caracterul date de variabila char
b) nu executa numararea aparitiilor unui caracter intr-un sir pentru ca registrul BX in care are loc numaratoarea
c)necesita initializarea variabilei contor cu zero la definire contor DW 0
d)executa numaratoarea aparitiilor unui caracter specificat intr-un sir numai daca se salveaza si se restaureaza registri
e) necesita inserarea instructiunii MOV contor,BX dupa instructiunea LOOP
3.
Macrodefinitia:
contor_sir MACRO sir,lgsir,char,contor
LABEL ciclu,salt
MOV CX,lgsir
LEA SI,sir
XOR BX,BX
ciclu:
LODSB
CMP Al,char
JNZ salt
INC BX
salt:
DEC SI
LOOP ciclu
ENDM
a) executa numararea partiala aparitiilor caracterul date de variabila char dupa ce variabila contor a fost initializata cu zero prin instructiunea
MOV contor,0
b) nu executa numararea aparitiilor unui caracter intr-un sir pentru ca registrul BX in care are loc numaratoarea
c)necesita initializarea variabilei contor cu zero la definire contor DW 0
d)executa numaratoarea aparitiilor unui caracter specificat intr-un sir numai daca se salveaza si se restaureaza registri
e) necesita inserarea instructiunii MOV contor,BX dupa instructiunea LOOP
4.
Macrodefinitia:
contor_sir MACRO sir,lgsir,char,contor
LABEL ciclu,salt
MOV CX,lgsir
LEA SI,sir
XOR contor,contor
ciclu:
LODSB
CMP Al,char
JNZ salt
INC contor
salt:
DEC SI
LOOP ciclu
ENDM
a) executa numararea partiala aparitiilor caracterul date de variabila char dupa ce variabila contor a fost initializata cu zero prin instructiunea
MOV contor,0
b) nu executa numararea aparitiilor unui caracter pentru ca include un mod de adresare incorect pentru initializarea variabilei contor
c)necesita initializarea variabilei contor cu zero la definire contor DW 0
d)executa numaratoarea aparitiilor unui caracter specificat intr-un sir numai daca se salveaza si se restaureaza registri
e) necesita inserarea instructiunii MOV BX,contor dupa instructiunea LOOP
5.
Macrodefinitia:
contor_sir MACRO sir,lgsir,char,contor
LABEL ciclu,salt
PUSH AX
PUSH SI
PUSH BX
PUSH CX
MOV CX,lgsir
LEA SI,sir
XOR BX,BX
ciclu:
LODSB
CMP Al,char
JNZ salt
INC BX
salt:
DEC SI
LOOP ciclu
MOV caracter,BX
ENDM
a) executa numararea partiala aparitiilor caracterul date de variabila char dupa ce variabila contor a fost initializata cu zero prin instructiunea
MOV contor,0
b) nu executa numararea aparitiilor unui caracter intr-un sir pentru ca nu sunt restaurati registri
c)necesita initializarea variabilei contor cu zero la definire contor DW 0
d)executa numaratoarea aparitiilor unui caracter specificat intr-un sir numai daca se salveaza si se restaureaza registri
e) necesita inserarea instructiunii MOV BX,contor dupa instructiunea LOOP
6.
Macrodefinitia:
contor_sir MACRO sir,lgsir,char,contor
LABEL ciclu,salt
MOV CX,lgsir
LEA SI,sir
XOR BX,BX
ciclu:
LODSB
CMP Al,char
JNZ salt
INC BX
salt:
DEC SI
LOOP ciclu
MOV caracter,BX
POP AX
POP CX
POP SI
POP BX
ENDM
a) executa numararea partiala aparitiilor caracterul date de variabila char dupa ce variabila contor a fost initializata cu zero prin instructiunea
MOV contor,0
b) nu executa numararea aparitiilor unui caracter intr-un sir pentru ca nu sunt salvati registri
c)necesita initializarea variabilei contor cu zero la definire contor DW 0
d)executa numaratoarea aparitiilor unui caracter specificat intr-un sir si daca se salveaza si/sau se restaureaza registri
e) necesita inserarea instructiunii MOV BX,contor dupa instructiunea LOOP
7.
Macroinstructiunea pentru inlocuirea aparitiilor unui caracter specificat dintr-un sir cu un caracter dat:
a)are in lista de parametri 4 elemente
b) contine in lista de parametri: sirul, lungimea, caracterul care trebuie inlocuit, caracterul cu care se face inlocuirea si o variabila de stare
c) are il lista de parametri si o variabila de stare care are valoarea 0 daca s-a efectuat inlocuirea, 1 daca sirul este vid, 2 daca sirul este de lungime negativa, 3 daca sirul este infinit
d)are in lista de parametri 5 elemente
e)are in lista de parametri cel putin patru elemente
8.
Pentru macroinstructiunea pentru inlocuirea aparitiilor unui caracter specificat dintr-un sir cu un caracter dat:
a)se foloseste instructiunea
stosb
b)se foloseste instructiunea
lodsb
c)se folosesc instructiunile
stosb
si
lodsb
d)se folosesc instructiunile
stosb
si
lodsb
cu mari precautii
e)se folosesc instructiunile
stosb
si/sau
lodsb
numai daca programatorul gestioneaza registrul SI pe care ambele il modifica
b) contine in lista de parametri: sirul, lungimea, caracterul care trebuie inlocuit, caracterul cu care se face inlocuirea si o variabila de stare
c) are il lista de parametri si o variabila de stare care are valoarea 0 daca s-a efectuat inlocuirea, 1 daca sirul este vid, 2 daca sirul este de lungime negativa, 3 daca sirul este infinit
d)are in lista de parametri 5 elemente
e)are in lista de parametri cel putin patru elemente
9.
Pentru macroinstructiunea pentru inlocuirea aparitiilor unui caracter specificat dintr-un sir cu un caractere definit cu DW :
a)se foloseste instructiunea
stosw
b)se foloseste instructiunea
lodsw
c)se folosesc instructiunile
stosw
si
lodsw
d)se folosesc instructiunile
stosw
si
lodsw
cu mari precautii
e)se folosesc instructiunile
stosw
si/sau
lodsw
numai daca programatorul gestioneaza registrul SI pe care ambele il modifica
10.
Instructiuneile:
PUSH AX
PUSH BX
PUSH CX
- trebuie urmate undeva in program de o secventa de forma:
POP CX
POP BX
POP AX
- trebuie urmate undeva in program de secventa :
POP CX
POP BX
POP AX
- salveaza pe stiva registri AX, BX,CX; la fiecare salvare registrul SP este diminuat cu 2
- salveaza pe stiva registri AX, BX,CX; la fiecare salvare registrul SP este majorat cu 2
- trebuie sa fie urmate de instructiuni care restaureaza registri, in ordinea inversa in care s-a produs salvarea, fie in secventa de forma:
POP CX
POP BX
POP AX
fie aceste instructiuni sunt dispersate
11.
Instructiunea:
SHL AX,1
- inmulteste un numar
- deplaseaza registrul AX cu o pozitie spre stanga
- este anulata prin instructiunea SHR AX,1
- se executa in 2 cicluri masina intrucat efectueaza deplasarea spre stanga cu un bit a continutului registrului AX
- este instructiune cu modul de adresare imediat
12.
Instructiunea:
SHL operand1,operand2
- necesita lucru cu regiustrul CL cand numarul de pozitii cu care se face deplasarea spre stanga este mai mare ca 1
- efectueaqza deplasarea continutului operand1 spre stanga cu un numar de pozitii indicat de operand2
- pozitioneaza indicatorii de conditie CF OF PF SF ZF atunci cand face deplasarea continutului din operand1
- executa operatiile elementare:
(temp):=(CONTOR)
while((temp)!=0)
{
(CF):=valoarea celui mai semnificativ bit din operand1
operand1:=operand1 * 2
(temp):=(temp)-1;
if(COUNT==1){
if(cel mai semnificativ bit din operand1!-CF) OF:=1; else OF:=0; }
else OF := valoare nedefinita; }
unde CONTOR reprezinta numarul de repetari dat de operand2,iar temp este o variabila de lucru
- este utilizata pentru a inmulti variabilele cu 2 la o putere
13.
Instructiunea:
SHR operand1,operand2
- necesita lucru cu regiustrul CL cand numarul de pozitii cu care se face deplasarea spre stanga este mai mare ca 1
- efectueaqza deplasarea continutului operand1 spre dreapta cu un numar de pozitii indicat de operand2
- pozitioneaza indicatorii de conditie CF OF PF SF ZF atunci cand face deplasarea continutului din operand1
- executa operatiile elementare:
(temp):=(CONTOR)
while((temp)!=0)
{
(CF):=valoarea celui mai semnificativ bit din operand1
operand1:=operand1 / 2
(temp):=(temp)-1;
if(COUNT==1){
if(cel mai semnificativ bit din operand1!-CF) OF:=1; else OF:=0; }
else OF := valoare nedefinita; }
unde CONTOR reprezinta numarul de repetari dat de operand2,iar temp este o variabila de lucru
- este utilizata pentru a imparti variabilele cu 2 la o putere
14.
Instructiunile:
XOR SI,SI
XOR BX,BX
MOV CX,n
ciclu: MOV AX,x[SI]
CMP AX,BX
jg alfa
JL beta
MOV b[SI],0
JMP salt
alfa:
MOV b[si],1
JMP salt
beta:
MOV b[SI],-1
salt:
INC SI
INC SI
LOOP ciclu
- construieste un sir pornind de la elementele altui sir
- trebuie corectata folosind mult mai eficient registri, astfel:
XOR SI,SI
XOR BX,BX
MOV DI,1
MOV DX,-1
MOV CX,n
ciclu: MOV AX,x[SI]
CMP AX,BX
jg alfa
JL beta
MOV AX,BX
JMP salt
alfa:
MOV AX,DI
JMP salt
beta:
MOV AX,DX
salt:
MOV b[SI],AX
INC SI
INC SI
LOOP ciclu
- pentru a interpreta corect cele trei initializari trebuie facute separat ca in secventa:
XOR SI,SI
XOR BX,BX
MOV DI,1
MOV DX,-1
MOV CX,n
ciclu1: MOV b[SI],BX
INC SI
INC SI
LOOP ciclu1
MOV CX,n
ciclu2:
CMP b[SI],BX
jge alfa
MOV b[SI],DX
alfa:
INC SI
INC SI
LOOPciclu2
MOV CX,n
ciclu3: CMP b[SI],BX
jle beta
MOV b[SI],DI
beta:
INC SI
INC SI
LOOPciclu3
- construieste un vector b[i]:=1 daca x[i]>0, b[i]:=0 daca x[i]==0 si -1 in rest
- secventa se transforma in macrodefinitie adaugand instructiuni de salvare, de restaurare si instructiunile MACRO si ENDM definite adecvat
15.
Instructiunea:
SUB AX,AX
- scade continutul registrului sursa AX din registrul destinatie AX si rezultatul se memoreaza in registrul destinatie AX
- pozitioneaza indicatorii de conditie
- este o instructiune cu doi operanzi, de tip R-R
- este utilizata pentru initializarea cu zero a totalurilor
este utilizata frecvent pentru initializarea registrilor index DI si SI - are acelasi numar de cicluri masina ca XOR AX,AX si face acelasi lucru
16.
Instructiunea
XOR AX,AX
- aplica operatorul "sau exclusiv" la continutul registrului sursa AX si la registrul destinatie AX si rezultatul se memoreaza in registrul destinatie AX
- pozitioneaza indicatorii de conditie
- este o instructiune cu doi operanzi, de tip R-R
- este utilizata pentru initializarea cu zero a totalurilor
este utilizata frecvent pentru initializarea registrilor index DI si SI - are acelasi numar de cicluri masina ca SUB AX,AX si face acelasi lucru
17.
Instructiunea:
SUB AX,SI
- este foarte frecvent utilizata
- nu se utilizeaza asa ceva
- efectueaza (AX):=(AX)-(SI)
- pozitioneaza indicatorii de conditie dupa efectuarea scaderii din registrul BX a continutului registrului AX
- pozitioneaza indicatorii de conditie dupa efectuarea scaderii din registrul AX a continutului registrului BX
18.
Instructiunea
POP ALFA
- presupune ca ALFA sa fie un operand definit cu DW
- presupune definirile
ALFA DB ?
DB ?
- executa operatiile:
(ALFA):=((SP)+1:(SP))
(SP):=(SP)+2
- executa operatiile:
(ALFA):=((SP)+1:(SP))
(SP):=(SP)-2
- executa operatiile:
(SP):=(SP)+2
(ALFA):=((SP)+1:(SP))
19.
Instructiunea
POP ALFA[SI]
- presupune ca ALFA sa fie un operand definit cu DW si sa se initializeze cu 0 SI
- presupune definirile
ALFA DB ?
DB ?
si initializarea cu o valoare nenegativa a registrului SI - executa operatiile:
(ALFA):=((SP)+1:(SP))
(SP):=(SP)+2
iar in prealabil registrul SI este initializat astfel incat a dersa calculata sa fie un numar par
- executa operatiile:
(ALFA):=((SP)+1:(SP))
(SP):=(SP)-2
- executa operatiile:
(SP):=(SP)+2
(ALFA):=((SP)+1:(SP))
20.
Instructiunea
POP [ALFA]
- presupune ca ALFA sa fie un pointer definit cu DW si sa fie initializat cu adresa unei variabile
- presupune definirile
ALFA DB ?
DB ?
si initializarea prin MOV AX,offset variabila urmata de MOV ALFA,AX
- executa operatiile:
([ALFA]):=((SP)+1:(SP))
(SP):=(SP)+2
iar in prealabil registrul SI este initializat astfel incat a dersa calculata sa fie un numar par
- executa operatiile:
([ALFA]):=((SP)+1:(SP))
(SP):=(SP)-2
- executa operatiile:
(SP):=(SP)+2
([ALFA]):=((SP)+1:(SP))
21.
Instructiunea
JMP:
- nu se constituie insecvente consecutive spre o aceeasi eticheta
- nu se constituie in secvente consecutive cu etichete diferite
- nu urmeaza dupa o instructiune de salt conditionat
- se utilizeaza ori de cate ori este nevoie
- daca este salt intrasegment are curata de 7 cicluri masina, iar daca deplasarea este pe un bait dureaza un singur ciclu masina
22.
Instructiunile pentru interschimb de continut
- presupun zone de memorie de aceeasi lungime
- presupun un operand intermediar
- se realizeaza cu o instructiune specializata
- necesita o macrodefinitie daca operanzii sunt zone de memorie
- se foloseste un artificiu in utilizarea instructiunii XCHG
23.
Instructiunea
XCHG
- este utilizata pentru interschimb de continut
- sta la baza construirii unei macrodefinitii de interschimb de continut pentru doi operanzi stocati in memorie
- daca este cu operanzi de tip R-R are 3 cicluri masina - se executa in 3 timpi
- se utilizeaza pentru a reinitializa operanzi
24.
Instructiunea
XCHG:
- este utilizata pentru a construi macroodefinitia:
schimb MACRO a,b
MOV AX,a
XCHG AX,b
MOV a,AX
ENDM - este utilizata pentru a construi macroodefinitia:
schimb MACRO a,b
MOV AX,b
XCHG AX,b
MOV b,AX
ENDM - este utilizata pentru a construi macroodefinitia:
schimb MACRO a,b
MOV AX,a
XCHG AX,b
MOV b,AX
ENDM - este utilizata pentru a construi macroodefinitia:
schimb MACRO a,b
XCHG AX,b
MOV AX,a
MOV a,AX
ENDM - este utilizata pentru a construi macroodefinitia:
schimb MACRO a,b
MOV a,AX
MOV AX,a
XCHG AX,b
ENDM
25.
Instructiunea
LOOP
- implementeaza o structura repetitiva standard
- testeaza daca registrul CX este nenul
- decrementeaza registrul CX si-l testeaza
- este asemeni instructiunii for din C++
- este asemeni instructiunii do - while din C++
26.
Instructiunea
27.
Macroinstructiunea de adunare a patru numere cu obtinerea rezultatului in registrul AX:
- prin apelarea aduna4 0,0,0,0,AX devine echivalenta cu XOR AX,AX
- este folosita ori de cate ori trebuie adunate patru numere definite pe unul sau pe doi baiti
- se foloseste cand operanzii au lungimi diferite pentru ca se fac teste adecvate si conversii de la bait la cuvanr - pentru a fi utilizata trebuie mai intai construita
- macrodefinitiile trebuie sa aiba oiperanzi omogeni
28.
Macroinstructiunea de scadere a trei numere cu obtinerea rezultatului in registrul AX:
- prin apelarea aduna4 0,0,0,AX devine echivalenta cu XOR AX,AX
- este folosita ori de cate ori trebuie scazute trei numere definite pe unul sau pe doi baiti
- se foloseste cand operanzii au lungimi diferite pentru ca se fac teste adecvate si conversii de la bait la cuvanr - pentru a fi utilizata trebuie mai intai construita
- macrodefinitiile trebuie sa aiba oiperanzi omogeni
29.
Macroinstructiunea:
aduna4 MACRO a,b,c,b,suma
ADD AX,a
ADD AX,b
ADD AX,c
ADD AX,d
ENDM
- nu aduna patru numere
- impune ca inainte de macroapel sa fie initializat registrul AX
- aduna la continutul registrului AX patru numere
- este incorecta pentru ca nu initializeaza registrul AX
- necesita adaugarea sau inserarea instructiunilor de salvare si restaurare
30.
Instructiunea:
SAL operand1,operand2
- necesita lucru cu regiustrul CL cand numarul de pozitii cu care se face deplasarea spre stanga este mai mare ca 1
- efectueaqza deplasarea aritmetica a continutului operand1 spre stanga cu un numar de pozitii indicat de operand2
- pozitioneaza indicatorii de conditie CF OF PF SF ZF atunci cand face deplasarea continutului din operand1
- executa operatiile elementare:
(temp):=(CONTOR)
while((temp)!=0)
{
(CF):=valoarea celui mai semnificativ bit din operand1
operand1:=operand1 * 2
(temp):=(temp)-1;
if(COUNT==1){
if(cel mai semnificativ bit din operand1!-CF) OF:=1; else OF:=0; }
else OF := valoare nedefinita; }
unde CONTOR reprezinta numarul de repetari dat de operand2,iar temp este o variabila de lucru
- este utilizata pentru a inmulti cu semn variabilele cu 2 la o putere