Laborator 2 - Suport teoretic

Instrucțiuni aritmetice

ADD

Sintaxă:

add <regd>,<regs>; <regd> ← <regd> + <regs>
add <reg>,<mem>; <reg> ← <reg> + <mem>
add <mem>,<reg>; <mem> ← <mem> + <reg>
add <reg>,<con>; <reg> ← <reg> + <con>
add <mem>,<con>; <mem> ← <mem> + <con>

Semantică:

  • 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.

Exemplu:

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

SUB

Sintaxă:

sub <regd>,<regs>; <regd> ← <regd> - <regs>
sub <reg>,<mem>; <reg> ← <reg> - <mem>
sub <mem>,<reg>; <mem> ← <mem> - <reg>
sub <reg>,<con>; <reg> ← <reg> - <con>
sub <mem>,<con>; <mem> ← <mem> - <con>

Semantică:

  • 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.

Exemplu:

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

MUL

Sintaxă:

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

Semantică:

  • Rezultatul operației de înmulțire se păstrează pe o lungime dublă față de lungimea operanzilor;
  • Instrucțiunea MUL efectuează operația de înmulțire pentru întregi fără semn;
  • Se impune ca primul operand și rezultatul să se păstreze în regiștri;
  • Deşi operaţia este binară, se specifică un singur operand deoarece celălalt este întotdeauna fixat, la fel ca şi locaţia rezultatului.
  • Operandul explicit poate fi un registru sau o variabilă, dar nu poate fi o valoare imediată (constantă).

Exemplu:

mul DH; AX ← AL * DH
mul DX; DX:AX ← AX * DX
mul EBX; EDX:EAX ← EAX * EBX
mul BYTE [mem8]; AX ← AL * BYTE [mem8]
mul WORD [mem16]; DX:AX ← AX * WORD [mem8]

DIV

Sintaxă:

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

Semantică:

  • Instrucțiunea DIV efectuează operația de împărțire pentru întregi fără 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:

div CL; AL ← AX / CL, AH ← AX % CL
div SI; AX ← DX:AX / SI, DX ← DX:AX % SI
div EBX; EAX ← EDX:EAX / EBX, EDX ← EDX:EAX % EBX

INC

Sintaxă:

inc <reg>; <reg> ← <reg> + 1
inc <mem>; <mem> ← <reg> + 1

Semantică:

  • Incrementează conținutul operandului cu 1.

Exemplu:

inc DWORD [var]; DWORD [var] ← DWORD [var] + 1
inc EBX; EBX ← EBX + 1
inc DL; DL ← DL + 1

DEC

Sintaxă:

dec <reg>; <reg> ← <reg> - 1
dec <mem>; <mem> ← <reg> - 1

Semantică:

  • Decrementează conținutul operandului cu 1.

Exemplu:

dec EAX; EAX ← EAX - 1
dec BYTE [mem]; [value] ← [value] - 1

NEG

Sintaxă:

neg <reg>; <reg> ← 0 - <reg>
neg <mem>; <mem> ← 0 - <mem>

Semantică:

  • Are loc negarea aritmetică a operandului.

Exemplu:

neg EAX; EAX ← 0 - EAX

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ă)