Press

Header Ads

Ensamblador 8086, Suma de números de dos dígitos

Cómo sumar números de dos dígitos

Me hice el tiempo para hacer un código en ensamblador 8086, un código que pueda sumar números de dos dígitos, para ello tuve que identificar los escenarios, los cuales son los siguientes.

Escenarios:

  1. Acarreo en Decena y Unidad.
  2. Acarreo solo en la Unidad.
  3. Sin acarreo en Decena y Unidad
  4. Acarreo solo en Decena.
Se tiene que identificar los escenarios para poder hacer la validación o el filtro y así saber, a qué etiqueta dirigirlo, porque cada escenario tiene su lógica propia, su conjunto de comandos personalizados, a continuación les dejo dicho programa. Me costó bastante tiempo hacer el código, así que, si no lo entienden de una, no se hagan problema,  revisenlo por partes, escenario por escenario.

.model small
.stack
cursor macro f,c,texto ;macro de mover el texto
mov ah,02h ;poninedo 02h en ah podemos habilitar para mover el texto
mov dh,f ;valor de fila
mov dl,c ;valor de columna
int 10h ;ejecutando la interrupcion int 10h, el cursor se ubica en el punto(x,y) se?alado
mov dx,offset texto ;imprime texto
mov ah,09h
int 21h
endm
.data
msj1 db "SUMA DE DOS DIGITOS","$"
msj2 db "DIGITAR NUMERO:","$"
msj3 db "DIGITAR NUMERO2:","$"
msj4 db "SALIR si/no:","$"
msj5 db "RESULTADO:","$"
msj6 db "Autor:Joselito Calpe","$"
num1 dw ?
num2 dw ?
.code
inicio:
mov ax,@data
mov ds,ax
call borrar ;limpio pantalla
cursor 5,5,msj1 ;presentacion
cursor 6,5,msj6
cursor 7,5,msj4 ;salir
call salir
call borrar ;limpio pantalla
cursor 6,5,msj2 ;peticion de entrada por teclado num1
call numero1
call borrar ;limpio pantalla
cursor 6,5,msj3 ;peticion de entrada por teclado num2
call numero2
call borrar ;limpio pantalla
cursor 6,5,msj5
;se tiene que igualar porque no es lo mismo ingresar
;numeros por teclado que moverlo a un registro en
;el mismo codigo.
mov cx,num1 ;ch=Decena, cl=Unidad(9 9)
sub ch,30h ;ascii de 9 es 39h
sub cl,30h ;39h - 30h = 9h
mov dx,num2 ;dh=Decena, dl=Unidad(9 9)
sub dh,30h ;ascii de 9 es 39h
sub dl,30h ;39h - 30h = 9h
;ahora los valores ingresados estan en hexad y no en code ascii
;ahora debemos identificar, a que escenario pertence los numeros ingresados
;1.acarreo en decena y unidad
;2.acarreo solo en unidad
;3.sin acarreo
;4.acarreo solo descena
add ch,dh ;Decenas en ch
add cl,dl ;Unidades en cl
;-----validacion de escenarios----
cmp ch,09h ;acarreo en descena
jg escenario4 ;salta si es mayor que 9h
salto:
cmp ch,09h ;no acarreo descena
jle escenario3 ;salta si menor o igual
salto1:
cmp ch,09h ;no acarreo descena
jle escenario2 ;si es menor o igual que 09h
salto2:
cmp ch,09h ;acarreo en descena
jg escenario1 ;si es mayor que 09h
escenario4:
cmp cl,00h ;unidad es cero
jle esc4 ; si es menor o igual a cero
jmp salto
escenario3:
cmp cl,09h ;no acarreo en unidad
jle esc3 ;salta es menor o igual que 9h
jmp salto1
escenario2:
cmp cl,09h ;acarreo en unidad
jg esc2 ;si es mayor que 09h
jmp salto2
escenario1:
cmp cl,09h ;acarreo en unidad
jg esc1 ;si es mayor que 09h
;------------ fin de validacion ---------
esc4:;50+50, 60+60, 70+70
;descena con acarreo
mov dl,31h ;imprime 31h=1,xq siempre empieza con 1
mov ah,02h
int 21h
sub ch,0ah ;10-10=0h
add ch,30h ;0+30=30 ascii del 0
mov dl,ch
mov ah,02h
int 21h
;unidad cero
add cl,30h ;0+30=30h ascci del 0
mov dl,cl
mov ah,02h
int 21h
mov ah,07h ;esperar entrada de teclado
int 21h
jmp inicio
esc3: ;44+44
;descena
add ch,30h ;8+30= 38 ascii de 8
mov dl,ch
mov ah,02h
int 21h
;unidad
add cl,30h ;8+30= 38 ascii de 8
mov dl,cl
mov ah,02h
int 21h
mov ah,07h ;esperar entrada de teclado
int 21h
jmp inicio
esc2: ;49+49 / 45+57*
;decena 49+49
   cmp ch,09h
   je esc2_1
           
   add ch,31h  ;8=ascii 38 mas el acarreo 1=39
   mov dl,ch   ;39 ascci del 9
   mov ah,02h
   int 21h
;unidad con acarreo
   sub cl,0ah  ;9+9=18 le resto 18-10=8
   add cl,30h  ;8+30=38 codigo ascii del 8    
   mov dl,cl 
   mov ah,02h  ;imprime numero
   int 21h
   jmp fin  
   
esc2_1:
;decena 45+57   
   mov dl,31h  ;imprime 31h=1,xq siempre empieza con 1
   mov ah,02h
   int 21h 
   
   sub ch,09h ;la suma da 9 + 1 de acarreo seria 10
   add ch,30h ;ahora es 0 y el sumo 30 que su ascii de cero
   mov dl,ch
   mov ah,02h 
   int 21h
;unidad con acarreo   
   sub cl,0ah  ;9+9=18 le resto 18-10=8
   add cl,30h  ;8+30=38 codigo ascii del 8    
   mov dl,cl 
   mov ah,02h  ;imprime numero
   int 21h 
   
   mov ah,07h ;esperar entrada de teclado
   int 21h
   jmp inicio 
esc1: ;99+99
;decena con acarreo
mov dl,31h ;imprime 31h=1,xq siempre empieza con 1
mov ah,02h
int 21h
sub ch,0ah ; 10-10=0
add ch,31h ; 0=31 y 9=39
mov dl,ch
mov ah,02h
int 21h
;unidad con acarreo
sub cl,0ah ;le resto la descena, 18-10=8
add cl,30h ;8=38h, es su codigo ascii
mov dl,cl
mov ah,02h
int 21h
mov ah,07h ;esperar entrada de teclado
int 21h
jmp inicio
fin:
mov ax,4c00h
int 21h
.exit
;-------------------
salir proc near
mov ah,01h ;para salir ingresar por teclado s minuscula
int 21h
cmp al,73h
je fin
ret
salir endp
numero1 proc near
mov ah,01h ; primer numero de dos digitos
int 21h
mov bh,al
mov ah,01h
int 21h
mov bl,al
mov num1,bx ; primer numero 99 en bx
mov bx,0
mov ah,07h ;esperar entrada de teclado
int 21h
ret
numero1 endp
numero2 proc near
mov ah,01h ;segundo numero de dos digitos
int 21h
mov bh,al
mov ah,01h
int 21h
mov bl,al
mov num2,bx ; segundo numero 99 en bx
mov bx,0
mov ah,07h ;esperar entrada de teclado
int 21h
ret
numero2 endp
borrar proc near
;0600h empuja texto para arriba, 0700h empuja para abajo
mov ax,0600h ;Limpiar pantalla... AL = 00H limpia todos los renglones
mov bh,07h ;color de fondo yletra
mov cx,0000h ;esquina sup.izquierda de la pantalla(0,0)
mov dx,184fh ;esquina inf. derecha de la pantalla(24,79)
int 10h
mov ah,02h
mov dx,00h ;posiscion del cursor(0,0) despues de limpiar pantalla
mov bh,00h ;Pagina 0
int 10h
ret
borrar endp
;-------------------
end
Les puede interesar Codigos ascii ensamblador8086

Les dejo tambien algunos pantallazos del código, corriendo en Dosbox, si tienes windows 8 o 10, les sugiero que lo descarguen, este programa es una máquina virtual que te permite enlazar los códigos en ensamblador 8086 y crear tu archivo objeto, tu archivo ejecutable.

Cabe mencionar que en los sistemas operativos antiguos (de Windows) se podía descargar un programa TASM, y se podía crear el archivo ejecutable desde la CMD de tu computadora. A continuación les dejo un video que me sirvió para instalar este programa Dosbox, y tambien, un video de ejecución de códigos en ensamblador 8086 desde la CMD.



ensamblador 8086 en programa dosbox
Iniciando en Dosbox

menu de suma de dos digitos dosbox
Menú del programa

resulado de suma de dos digitos dosbox
Escenario 1

Puse un ejemplo de escenario, donde los dos números sumados, tienen acarreo (99 + 99), pueden seguir comprobando los escenarios, corranlo en el programa dosbox, emu8086, GUI turbo assembler. Comprueben el escenario 4, donde se tiene que sumar  numeros con acarreo solo en la descena, por poner ejemplo podría ser 60 más 70. 


Me despido y deben saber que me costó mucho trabajo realizar este código, los que han programado en este código, saben que quita mucho tiempo hacer esta simple operación, me di el tiempo para apoyarlos, dar mi granito de arena, sin mas que decir, me despido, espero que les sirva.



Publicar un comentario

0 Comentarios