Suma, resta, multiplicacion y division en ensamblador

; suma, resta, multiplicacion y division sin tomar en cuenta el acarreo
; el 13,10 es un salto de linea

.model small
.stack 100
.data
msj1 db 'Numero 1: ','$'
msj2 db 13,10,'Numero 2: ','$'
msj3 db 13,10,'Suma: ','$'
msj4 db 13,10,'Resta: ','$'
msj5 db 13,10,'Multiplicacion: ','$'
msj6 db 13,10,'Division: ','$'
linea db 13,10,'$'
var1 db 0
var2 db 0
.code
.startup

call limpia
mov ah,09h
lea dx, msj1 ;desplegar numero 1:
int 21h

call leer ;lee primer numero
sub al,30h ;restar 30h para obtener el numero
mov var1,al ;lo guardo en var1
mov ah,09h
lea dx, msj2 ;desplegar numero 2:
int 21h

call leer ;lee segundo numero
sub al,30h ;restar 30h para obtener segundo valor
mov var2,al ;guardar en var2
mov bl,var2 ;mover a bl

;******************* SUMA
add bl,var1 ; realizo la suma de var2(bl) y var1 y el resultado queda en bl
mov ah,09h
lea dx,msj3 ;imprimir suma
int 21h
mov dl,bl ;pongo en dl el numero a imprimir var2(bl)
add dl,30h ; agrego 30h para obtener el caracter   
mov ah,02h ;imprime un caracter
int 21h

;******************RESTA
mov bl,var1
sub bl,var2
mov ah,09h
lea dx,msj4 ;desplegar resta:
int 21h
mov dl,bl ;mover resta a dl para imprimir
add dl,30h ;sumar 30 para obtener caracter
mov ah,02h ;imprimir un caracter
int 21h

;******************MULTIPLICACION
mov ah,09h
lea dx,msj5 ;desplegar mult
int 21h

mov al,var1
mov bl,var2
mul bl ;mult al=al*bl
mov dl,al ;mover al a dl para imprimir
add dl,30h ;sumar 30 para obtener caracter
mov ah,02h ;imprimir caracter
int 21h

;*****************DIVISION
mov ah,09h
lea dx,msj6 ;desplegar div
int 21h
xor ax,ax ;limpiamos el registro ax.
mov al,var2
mov bl,al
mov al,var1
div bl ; divide AX/BX el resultado lo almacena en AX, el residuo queda en DX
mov bl,al
mov dl,bl
add dl,30h
mov ah,02h
int 21h
.exit

; ****************PROCEDIMIENTOS
salto proc near
mov ah,09h
lea dx,linea
int 21h
mov dl,00h
ret
salto endp

leer proc near
mov ah,01h;leer caracter desde el teclado
int 21h;lee primer caracter
ret
leer endp

limpia proc near
mov ah,00h
mov al,03h
int 10h
ret
limpia endp
end

Comentarios

  1. O__O me puedes ayudar con la suma de dos numero que lo multiplique por 100 en lenguaje ensamblador u.u soy principiante en esto ): porfavor y casi no entiendo u.u... y es para una tarea de mañana ): porfavor ): ...

    ResponderBorrar
    Respuestas
    1. ¿Que pasó con tu triste historia? me dejaste picado

      Borrar
    2. Buenas alguien sabe que paso con la tarea de yerania?

      Borrar
    3. Ella murió en el intento de hacer su tarea...

      Borrar
    4. todos murieron esperado que contestara xd

      Borrar
    5. Me da nostalgia no saber que paso con Yerania, no importa que ya haya pasado 7 años

      Borrar
    6. 2013 - Ya es bastante tiempo, me da tristesa y un poco de gracias no haber respondido de hace tanto años. Aqui esta: add eax,ebx imult eax,100; or mult eax,100. Te voy a hacer una pregunta que no la puedo hacer en la linea principal: ¿Cual registro cambia la instruccion div/idiv?. Intento usarlo con registro de 32bits, pero la apricacion se detiene, aqui dejo mi codigo: div ebx PRINT_DEC 4,eax; Pienso que modifica el registro eax, pero siempre la apricacion se cierra.PRINT_DEC es una directiva definida por un encabesado "io.inc" , saca una salida por pantalla. Me ayudarias, por favor.

      Borrar
    7. Han pasado 9 años y sigo sin saber que le paso a la tarea de Yerania

      Borrar
  2. MUCHAS GRACIIAS!! MUII BUEN PROGRAMA :D :D (Y)

    ResponderBorrar
  3. y si es un numero de dos digitos?c omo le hago? help!

    ResponderBorrar
  4. muchas gracia sme ayido de mucho me podrias pasar tu face oalgo para estar en contacto

    ResponderBorrar
  5. de casualidada alguien sabe como hacer la suma de numeros de mas de dos cifras, para cantidades grandes como 2000 en adelante

    ResponderBorrar
  6. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  7. Y para operaciones de 2 numeros de 10 digitos y para la raiz cuadrada?

    ResponderBorrar
  8. hola disculpen soy principiante no se como puedo programar en el ensamblador 8086.............. m*m+sqrt(m)+m, donde "m" es un numero cualquier...alguien me puede ayudar un favor.

    ResponderBorrar
  9. Respuestas
    1. Por que el número que imprime está en hexadecimal, y los números en el código ascii empiezan desde el 0 que es el 048 en ascii hexadecimal hasta el 9 que es el 57 hexadecimal, por eso sumas 30h (la h es de hexadecimal). Si no le sumara esos 30 saldría otro símbolo.

      Borrar
  10. porque limpia ax? intente hacer división sin limpiar y efectivamnete no funciona, alguien sabe?

    ResponderBorrar
    Respuestas
    1. Tengo entendido que para algunas operaciones los registros ax y al deben estar vacíos (no recuerdo por que no puse atención XD) por eso es mejor que cuando los guardes los cambies de registro de ax -> dx

      Borrar

Publicar un comentario