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
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
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]
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
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
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
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