Laborator 3 - Suport teoretic

Instrucțiuni aritmetice

ADC

Sintaxă:

adc <regd>,<regs>; <regd> ← <regd> + <regs> + CF
adc <reg>,<mem>; <reg> ← <reg> + <mem> + CF
adc <mem>,<reg>; <mem> ← <mem> + <reg> + CF
adc <reg>,<con>; <reg> ← <reg> + <con> + CF
adc <mem>,<con>; <mem> ← <mem> + <con> + CF

Semantică și restricții:

  • Cei doi operanzi ai adunării trebuie să aibă același tip (ambii octeți, ambii cuvinte, ambii dublucuvinte);
  • În timp ce ambii operanzi pot fi regiștri, cel mult un operand poate fi o locație de memorie;
  • La suma dintre cei doi operanzi se mai adună şi valoarea bitului de transport (Carry Flag).

Exemplu:

adc EDX,EBX; EDX ← EDX + EBX + CF
adc AX,[var]; AX ← AX + [var] + CF
adc [var],AX; [var] ← [var] + AX + CF
adc EAX,123456h; EAX ← EAX + 123456h + CF
adc BYTE [var],10; BYTE [var] ← BYTE [var] + 10 + CF

SBB

Sintaxă:

sbb <regd>,<regs>; <regd> ← <regd> - <regs> - CF
sbb <reg>,<mem>; <reg> ← <reg> - <mem> - CF
sbb <mem>,<reg>; <mem> ← <mem> - <reg> - CF
sbb <reg>,<con>; <reg> ← <reg> - <con> - CF
sbb <mem>,<con>; <mem> ← <mem> - <con> - CF

Semantică și restricții:

  • Cei doi operanzi ai scăderii trebuie să aibă același tip (ambii octeți, ambii cuvinte, ambii dublucuvinte);
  • În timp ce ambii operanzi pot fi regiștri, cel mult un operand poate fi o locație de memorie;
  • Din diferenţa dintre cei doi operanzi se mai scade şi valoarea bitului de transport (Carry Flag).

Exemplu:

sbb EDX,EBX; EDX ← EDX - EBX - CF
sbb AX,[var]; AX ← AX - [var] - CF
sbb [var],AX; [var] ← [var] - AX - CF
sbb EAX,123456h; EAX ← EAX - 123456h - CF
sbb byte [var],10; BYTE [var] ← BYTE [var] - 10 - CF

IMUL

Sintaxă:

imul <op8>; AX ← AL * <op8>
imul <op16>; DX:AX ← AX * <op16>
imul <op32>; EDX:EAX ← EAX * <op32>

Semantică și restricții:

  • Rezultatul operației de înmulțire se păstrează pe o lungime dublă față de lungimea operanzilor;
  • Instrucțiunea IMUL efectuează operația de înmulțire pentru întregi cu semn;
  • Se impune ca primul operand și rezultatul să se păstreze în regiștri;
  • Operandul explicit poate fi un registru sau o variabilă, dar nu poate fi o valoare imediată (constantă);

Exemplu:

imul DH; AX ← AL * DH
imul mem8; AX ← AL * mem8
imul DX; DX:AX ← AX * DX
imul EBX; EDX:EAX ← EAX * EBX

IDIV

Sintaxă:

idiv <reg8>; AL ← AX / <reg8>, AH ← AX % <reg8>
idiv <reg16>; AX ← DX:AX / <reg16>, DX ← DX:AX % <reg16>
idiv <reg32>; EAX ← EDX:EAX / <reg32>, EDX ← EDX:EAX % <reg32>
idiv <mem8>; AL ← EAX / <mem8>, AH ← AX % <mem8>
idiv <mem16>; AX ← DX:AX / <mem16>, DX ← DX:AX % <mem16>
idiv <mem32>; EAX ← EDX:EAX / <mem32>, EDX ← EDX:EAX % <mem32>

Semantică și restricții:

  • Instrucțiunea IDIV efectuează operația de împărțire pentru întregi cu semn;
  • Se impune ca primul operand și rezultatul să se păstreze în regiștri;
  • Primul operand nu se specifică și are o lungime dublă față de al doilea operand;
  • Operandul explicit poate fi un registru sau o variabilă, dar nu poate fi o valoare imediată (constantă);
  • Prin împărțirea unui număr mare la un număr mic, există posibilitatea ca rezultatul să depășească capacitatea de reprezentare. În acest caz, se va declanșa aceeași eroare ca și la împărțirea cu 0.

Exemplu:

idiv CL; AL ← AX / CL, AH ← AX % CL
idiv SI; AX ← DX:AX / SI, DX ← DX:AX % SI
idiv EBX; EAX ← EDX:EAX / EBX, EDX ← EDX:EAX % EBX
idiv DWORD [var]; EAX ← EDX:EAX / DWORD [var], EDX ← EDX:EAX % DWORD [var]

Instructiuni de conversie cu semn

CBW

Sintaxă:

cbw

Semantică și restricții:

  • converteşte cu semn BYTE-ul din AL la WORD-ul AX;
  • conversia se referă la extinderea reprezentării de pe 8 biţi pe 16 biţi, prin completarea cu bitul de semn în faţa octetului iniţial;
  • instrucţiunea nu are operanzi specificaţi explicit deoarece este întotdeauna vorba despre conversia AL → AX.

Exemplu:

cbw ; dacă AL=01110111b atunci AX ← 00000000 01110111b
    ; dacă AL=11110111b atunci AX ← 11111111 11110111b

CWD

Sintaxă:

cwd

Semantică și restricții:

  • converteşte cu semn WORD-ul din AX la DWORD-ul DX:AX;
  • conversia se referă la extinderea reprezentării de pe 16 biţi pe 32 biţi, prin completarea cu bitul de semn în faţa cuvântului iniţial;
  • instrucţiunea nu are operanzi specificaţi explicit deoarece este întotdeauna vorba despre conversia AX → DX:AX.

Exemplu:

cwd ; dacă AX=00110011 11001100b atunci DX:AX ← 00000000 00000000 00110011 11001100b
    ; dacă AX=10110011 11001100b atunci DX:AX ← 11111111 11111111 10110011 11001100b

CWDE

Sintaxă:

cwde

Semantică și restricții:

  • converteşte cu semn WORD-ul din AX la DWORD-ul EAX;
  • conversia se referă la extinderea reprezentării de pe 16 biţi pe 32 biţi, prin completarea cu bitul de semn în faţa cuvântului iniţial;
  • instrucţiunea nu are operanzi specificaţi explicit deoarece este întotdeauna vorba despre conversia AX → EAX.

Exemplu:

cwde ; dacă AX=00110011 11001100b atunci EAX ← 00000000 00000000 00110011 11001100b
     ; dacă AX=10110011 11001100b atunci EAX ← 11111111 11111111 10110011 11001100b

CDQ

Sintaxă:

cdq

Semantică și restricții:

  • converteşte cu semn DWORD-ul din EAX la QWORD-ul EDX:EAX;
  • conversia se referă la extinderea reprezentării de pe 32 biţi pe 64 biţi, prin completarea cu bitul de semn în faţa dublucuvântului iniţial;
  • instrucţiunea nu are operanzi specificaţi explicit deoarece este întotdeauna vorba despre conversia EAX → EDX:EAX.

Exemplu:

cdq ; dacă EAX=00110011 11001100 00110011 11001100b atunci EDX:EAX ← 00000000 00000000 00000000 00000000 00110011 11001100 00110011 11001100b
     ; dacă EAX=10110011 11001100 10110011 11001100b atunci EDX:EAX ← 11111111 11111111 11111111 11111111 10110011 11001100 10110011 11001100b

Conversie fără semn

Conversie fără semn

  • Nu există instrucţiuni de conversie fără semn;
  • Conversiile fără semn se realizează în limbajul de asamblare prin „zerorizarea” octetului, cuvântului sau dublucuvântului superior.

Exemple

mov AH,0 ; pentru conversia AL → AX
mov DX,0 ; pentru conversia AX → DX:AX
mov EDX,0 ; pentru conversia EAX → EDX:EAX

Declararea variabilelor / constantelor

Declararea variabilelor cu valoare initiala

a DB 0A2h ;se declara variabila a de tip BYTE si se initializeaza cu valoarea 0A2h
b DW 'ab' ;se declara variabila a de tip WORD si se initializeaza cu valoarea 'ab'
c DD 12345678h ;se declara variabila a de tip DOUBLE WORD si se initializeaza cu valoarea 12345678h
d DQ 1122334455667788h ;se declara variabila a de tip QUAD WORD si se initializeaza cu valoarea 1122334455667788h

Declararea variabilelor fara valoare initiala

a RESB 1 ;se rezerva 1 octet
b RESB 64 ;se rezerva 64 octeti
c RESW 1 ;se rezerva 1 word

Definirea constantelor

zece EQU 10 ;se defineste constanta zece care are valoarea 10

Legendă

<op8>    - operand pe 8 biți
<op16>   - operand pe 16 biți
<op32>   - operand pe 32 biți

<reg8>   - registru pe 8 biți
<reg16>  - registru pe 16 biți
<reg32>  - registru pe 32 biți
<reg>    - registru
<regd>   - registru destinație
<regs>   - registru sursă

<mem8>   - variabilă de memorie pe 8 biți
<mem16>  - variabilă de memorie pe 16 biți
<mem32>  - variabilă de memorie pe 32 biți
<mem>    - variabilă de memorie

<con8>   - constantă (valoare imediată) pe 8 biți
<con16>  - constantă (valoare imediată) pe 16 biți
<con32>  - constantă (valoare imediată) pe 32 biți
<con>    - constantă (valoare imediată)