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ă ș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.

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ă ș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.

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ă și restricții:

  • 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ă și restricții:

  • 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ă și restricții:

  • 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ă și restricții:

  • 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ă și restricții:

  • Are loc negarea aritmetică a operandului.

Exemplu:

neg EAX; EAX ← 0 - 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ă)