Como hago esta operacion a*b-c/d+e emu8086


09 de Diciembre del 2019

hola ocmo estan tengo que realizar esto en clase pero no logrado la logica de

acerlo se lo mas basico, espero me puedan apoyar.

1.    Elabore un programa en ensamblador de esta máquina para resolver A = A * B – C / D + E. Cargue los valores de las variables según la tabla que se muestra y calcule el resultado. Anótelo.

a  b   c    d   e

9  8  18   6   5


Ivan
12 de Agosto del 2026

Hola,

La lógica que te falta es la de siempre en cualquier lenguaje: respetar la precedencia de operadores. En A = A*B - C/D + E, primero se resuelven la multiplicación y la división (A*B y C/D por separado), y solo después se hace la resta y la suma entre esos resultados. En ensamblador no hay ningún operador que respete eso automáticamente, tienes que calcular cada parte por separado y combinarlas tú mismo, en el orden correcto.

Con tus valores (A=9, B=8, C=18, D=6, E=5):

.model small
.stack
.data
a db 9
b db 8
c db 18
d db 6
e db 5
resultado db 0

.code
mov ax, @data
mov ds, ax

; Paso 1: A * B
mov al, a
mov bl, b
mul bl         ; AX = AL * BL (9*8 = 72)
mov cl, al         ; guardamos A*B en cl

; Paso 2: C / D
mov al, c
mov ah, 0         ; limpiamos ah antes de dividir (division de 16 bits)
mov bl, d
div bl         ; al = cociente de AX/BL (18/6 = 3), ah = resto
mov dl, al         ; guardamos C/D en dl

; Paso 3: (A*B) - (C/D) + E
mov al, cl         ; recuperamos A*B
sub al, dl         ; restamos C/D  (72 - 3 = 69)
add al, e          ; sumamos E  (69 + 5 = 74)

mov resultado, al

.exit
end

Con tus datos, el resultado debería ser 74 (9×8=72, menos 18÷6=3, más 5 → 72-3+5=74). Dos detalles técnicos importantes de por qué el código está escrito así:

MUL con un operando de 8 bits multiplica AL por ese operando y deja el resultado en AX (16 bits), porque el resultado de multiplicar dos números de 8 bits puede necesitar hasta 16 bits para representarse sin desbordar.

DIV con un operando de 8 bits divide AX (no solo AL) entre ese operando, dejando el cociente en AL y el resto en AH, por eso hace falta poner AH a 0 antes de dividir, si no, arrastrarías basura de un cálculo anterior en la parte alta de AX.

Con esos valores concretos todo cabe en un solo byte sin desbordar, pero si en otro ejercicio los números son más grandes, tendrías que usar word en vez de db y ajustar los registros a 16 bits (AX/BX en vez de AL/BL).

Ivan