A instrução IMUL (Integer Multiply) no 8086/8088 realiza multiplicação com sinal de operandos de 8 ou 16 bits. É distinta de MUL (multiplicação sem sinal). Aqui está a operação precisa:
| Forma | Sintaxe | Operação | Tamanho do Resultado | Flags Afetadas |
|---|---|---|---|---|
| 8 bits | IMUL r/m8 | AL × r/m8 | 16 bits em AX | CF, OF (set se AH com sinal estendido ≠ AL); SF, ZF, AF, PF indefinidas |
| 16 bits | IMUL r/m16 | AX × r/m16 | 32 bits em DX:AX | CF, OF (set se DX com sinal estendido ≠ AX); SF, ZF, AF, PF indefinidas |
r/m8 = registrador ou memória de 8 bits; r/m16 = registrador ou memória de 16 bits.
Para um resultado de 16 bits em AX ser "corretamente com sinal", os 16 bits superiores (DX) devem ser todos 0s (se positivo) ou todos 1s (se negativo) — ou seja, DX = AX replicado para 16 bits. Se não, ocorreu overflow.
; AX = 0x23AF (9.135), src = 0x4567 (17.767) ; Produto = 9.135 × 17.767 = 162.300.345 = 0x09B3 0x10B9 (32 bits) ; DX:AX = 0x09B3:0x10B9 ; Como DX (0x09B3) ≠ extensão de sinal de AX (0x10B9 → bit de sinal 0 → DX deveria ser 0x0000), ; CF=1, OF=1 (overflow: resultado > 32.767)
; AL = 0x7F (127), BL = 0x02 (2) ; IMUL BL ; AX = 0x00FA (254) → cabe em 8 bits com sinal? 254 > 127 → overflow. ; AH = 0x00, AL = 0xFA. AH (0x00) ≠ ext. de sinal de AL (0xFA → bit sinal 1 → AH deveria ser 0xFF). ; CF=1, OF=1.
IMUL r16, r/m16 → r16 = r16 × r/m16 (apenas 16 bits baixos, sem DX).IMUL r16, r/m16, imm16 → r16 = r/m16 × imm16.IMUL r16, imm8/imm16.CBW (AL→AX) / CWD (AX→DX:AX) antes de IMUL se estender tamanho do operando.IMUL é essencial para aritmética em inteiros com sinal (coordenadas, física, DSP, cripto) em código real-mode de 16 bits.
Tecnologia Eletrônica © [www.351231.com]