O código original fornecido estava incorreto (usava `SBB`/`ADD` em loop sem tratamento adequado multiplicando/multiplicador). Abaixo está rotina assembly 8085 funcional, padrão para multiplicação 8-bit signed usando algoritmo add-shift (algoritmo Booth é overkill para 8-bit). Resultado 16-bit em HL.
; 8085 Multiplicação Signed 8-bit (Método Add-Shift) ; Input: Multiplicando em memória 2000H, Multiplicador em 2001H (ambos signed 8-bit) ; Output: Produto signed 16-bit em HL (H=high, L=low) ; Registradores usados: A, B, C, D, E, H, L, PSW ; Destrói: A, B, C, D, E ORG 1000H ; Endereço início exemplo LXI H, 2000H ; HL aponta para multiplicando MOV D, M ; D = Multiplicando (signed) INX H MOV E, M ; E = Multiplicador (signed) CALL MUL8S ; Chama multiplicação signed SHLD 2002H ; Armazena resultado 16-bit em 2002H (L=low, H=high) HLT ;---------------------------------------------------------- ; Sub-rotina Multiplicação Signed 8x8 → 16 ; Input: D = Multiplicando, E = Multiplicador (ambos complemento 2) ; Output: HL = Produto signed 16-bit ; Usa: A, B, C (contador), D, E, H, L ;---------------------------------------------------------- MUL8S: MOV A, D ; Pega multiplicando ORA A ; Verifica sinal JM NEG_MCAND ; Se negativo, vai para complemento 2 MOV A, E ; Verifica sinal multiplicador ORA A JM NEG_MPLIER ; Ambos positivos: usa multiplicação unsigned JMP MUL_UNSIGNED NEG_MCAND: MOV A, D CMA ; Complemento 1 ADI 01H ; Complemento 2 (valor absoluto) MOV D, A ; D = |Multiplicando| MOV A, E ORA A JM BOTH_NEG ; Multiplicador também negativo? ; Multiplicando neg, Multiplicador pos CALL MUL_UNSIGNED ; Multiplica |MCAND| × MPLIER ; Resultado em HL é negativo → complemento 2 16-bit MOV A, H CMA MOV H, A MOV A, L CMA ADI 01H MOV L, A ; Propaga carry para H se L wrappou JNC MUL_EXIT INR H JMP MUL_EXIT NEG_MPLIER: MOV A, E CMA ADI 01H MOV E, A ; E = |Multiplicador| ; Multiplicando pos, Multiplicador neg CALL MUL_UNSIGNED ; Multiplica MCAND × |MPLIER| ; Negar resultado 16-bit (mesmo acima) MOV A, H CMA MOV H, A MOV A, L CMA ADI 01H MOV L, A JNC MUL_EXIT INR H JMP MUL_EXIT BOTH_NEG: MOV A, E CMA ADI 01H MOV E, A ; E = |Multiplicador| CALL MUL_UNSIGNED ; Multiplica |MCAND| × |MPLIER| ; Resultado positivo (neg × neg = pos) → pronto JMP MUL_EXIT ;---------------------------------------------------------- ; Multiplicação Unsigned 8x8 → 16 Correta (Add-Shift) ; Input: D = Multiplicando, E = Multiplicador (ambos positivos) ; Output: HL = Produto ;---------------------------------------------------------- MUL_UNSIGNED_CORRECT: MVI H, 00H MVI L, 00H MVI C, 08H MOV B, D ; B = Multiplicando (8-bit), D livre MUL_LOOP2: DAD H ; HL = HL * 2 (shift left) MOV A, E RAL ; Multiplicador MSB → Carry (shift left) MOV E, A JNC NO_ADD2 MOV A, L ADD B MOV L, A MOV A, H ACI 00H MOV H, A NO_ADD2: DCR C JNZ MUL_LOOP2 RET ; Substitua chamada MUL_UNSIGNED por MUL_UNSIGNED_CORRECT em NEG_MCAND, NEG_MPLIER, BOTH_NEG. MUL_EXIT: RET END
2000H = 0AH (10), 2001H = 05H (5) → Call MUL8S → 2002H = 0032H (50 decimal).
2000H = F6H (-10), 2001H = 05H (5) → Resultado FFCEH (-50).
Esta é implementação padrão, pronta para entrevista.
Tecnologia Eletrônica © [www.351231.com]