martes, 2 de abril de 2019

Programa multiplicacion mejorado con emu8086.inc



include 'emu8086.inc'
.model small ;Modelo de memoria m?s utilizado
.stack

.data        ;definición de datos(variables), donde se almacenara información
.code
   chr1  db ? ;primer digito
   chr2  db ? ;segundo digito
   chr3  db ? ;multiplo
   chr4  db ?
   r1    db ? ;resultado 1
   r2    db ? ;resultado 2
   r3    db ?
   r4    db ?
   ac    db 0 ;acarreo
   ac1   db 0
.startup
   ;cls
   mov ah,00h     ;Function(Set video mode)
   mov al,03      ;Mode 80x25 8x8 16
   int 10h        ;Interruption Video
   
   gotoxy 0,8
   printn 'La multiplicacion es:'
   gotoxy 0,0
   printn 'Ingrese un numero de 2 digitos'   
inicio:
   mov ah,00h
   call scan_num
   mov ax,cx
   cmp ax,99
   jg  mayor1
   gotoxy 0,10 
   call print_num
   mov al,cl
   aam
   mov chr1,ah    ;[chr1].chr2 * chr3 = ac.r1.r2
   mov chr2,al    ;chr1.[chr2] * chr3 = ac.r1.r2
   
   gotoxy 2,10
   putc '*'
   gotoxy 0,2

   printn 'Ingrese otro numero de 2 digitos'
cont:
   mov ah,00h
   mov cl,00h                                                               
   call scan_num
   mov ax,cx
   cmp ax,99
   jg mayor2
   gotoxy 3,10 
   call print_num
   mov al,cl
   aam
   mov chr3,ah    ;chr1.chr2 * [chr3].chr4 = ac.r1.r2
   mov chr4,al    ;chr1.chr2 * chr3.[chr4] = ac.r1.r2
   
   putc '='
   
   ;Realizamos operaci?n   
  
   mov al,chr4  ;unidad del segundo numero
   mov bl,chr2  ;unidad del primer numero
   mul bl       ;multiplicar
   mov ah,0     ;limpiamos ah0
   aam          ;separamos de hex a dec
   mov ac1,ah   ;decenas del primera multiplicacion
   mov r4,al    ;unidades del primera multiplicacion
            
   mov al,chr4  ;unidades del segundo numero
   mov bl,chr1  ;decentas del primer numero
   mul bl       ;multiplicar
   mov r3,al    ;movemos el resultado de la operacion a r3
   mov bl,ac1   ;movemos el acarreo a bl
   add r3,bl    ;sumamos resultado mas acarreo
   mov ah,00h   ;limpiamos ah por residuos
   mov al,r3    ;movemos el resultado de la suma a al
   aam          ;separamos  de hex a dec
   mov r3,al    ;guardamos unidades en r3
   mov ac1,ah   ;guardamos decenas en ac1   

   mov al,chr3    ;al = chr3
   mov bl,chr2    ;bl = chr2
   mul bl         ;AL = chr3*chr2 (BL*AL)
   mov Ah,0h      ;
   AAM            ;ASCII Adjusment
   mov ac,AH      ;ac = AH (Acarreo)
   mov r2,AL      ;r2 = AL       (Unidad del resultado)

   mov al,chr3    ;AL = chr3
   mov bl,chr1    ;BL = chr1
   mul bl         ;AL = chr1*chr3 (BL*AL)
   mov r1,al      ;r1 = AL       (Decena del resultado)
   mov bl,ac      ;BL = Acarreo anterior
   add r1,bl      ;r1 = r1+ac (r1 + Acarreo)
   mov ah,00h     ;
   mov al,r1      ;AL = r1 (Asignaci?n para el ajust)
   AAM            ;ASCII Adjustment
   mov r1,al      ;r1 = AL
   mov ac,ah      ;ac = AH (Acarreo para la Centena del resultado)
  
  
   ;suma final
   ;R4 resulta ser las unidades de mul y no se toma en cuenta ya que se pasa entero
  
  
   mov ax,0000h   ;limpiamos ax
  
   mov al,r3      ;movemos el segundo resultado de la primera mult a al
   mov bl,r2      ;movemos primer resultado de la segunda mult a bl
   add al,bl      ;sumamos
   mov ah,00h     ;limpiamos ah
   aam            ;separamos hex a dec
   mov r3,al      ;r3 guarda las decenas del resultado final
   mov r2,ah      ;r2 se utiliza como nuevo acarreo
  
   mov ax,0000h   ;''''
  
   mov al,ac1     ;movemos el acarreo de la primera mult a al
   mov bl,r1      ;movemos segundo resultado de la segunda mult a bl
   add al,r2      ;sumamos el nuevo  acarreo de la suma anterior  a al
   add al,bl      ;sumamos al a bl
   mov ah,00h     ;limpiamos el registro ah
   aam            ;separamos de hex a dec
   mov r1,al      ;r1 guarda las centenas
   mov r2,ah      ;ah se sigue utilizando como acarreo
  
   mov al,r2      ;movemos el acarreo a al
   mov bl,ac      ;movemos ac a bl
   add al,bl      ;sumamos al a bl
   ;aam            ;separamos hex a dec
   mov ac,al      ;mov al a ac como nuestro acarreo final
  
 
  
   ;Mostramos resultado
   
   mov ax,0000h
   
   ;Mostramos ac (millar)
   mov ah,02h 
   mov dl,ac
   add dl,30h
   int 21h
   ;mov bl,ac
   ;add bl,30h
   ;lea ax,bl
   ;call print_num
           
   
   ;Mostramos r1 (centena)
   mov ah,02H
   mov dl,r1
   add dl,30h
   int 21h
   ;mov bl,r1
   ;add bl,30h
   ;lea ax,bl
   ;call print_num        

   ;Mostramos r3 (decena)
   mov ah,02H
   mov dl,r3
   add dl,30h
   int 21h        
   ;mov bl,r3
   ;add bl,30h
   ;lea ax,bl
   ;call print_num
   
   ;unidad
   mov ah,02H
   mov dl,r4
   add dl,30h
   int 21h
   ;mov bl,r4
   ;add bl,30h
   ;call print_num        
 
.exit

mayor1:
  gotoxy 7,1
  mov dh,8
  BackSpace:
   cmp dh,0            
   jz borrado
   
   mov ah, 02h         ; DOS Display character call
   mov dl, 08h         ; Another backspace character to move cursor back again
   int 21h             ; Display it 
   mov dl, 20h         ; A space to clear old character 
   int 21h             ; Display it  
   mov dl, 08h         ; Another backspace character to move cursor back again
   int 21h             ; Display it
   dec dh
   loop Backspace
  borrado: 
   printn 'Ingrese correctamente'
  gotoxy 21,1
  mov dh,22
  BackSpace1:
   cmp dh,0            
   jz borrado1
   
   mov ah, 02h         
   mov dl, 08h         
   int 21h             
   mov dl, 20h        
   int 21h             
   mov dl, 08h         
   int 21h             
   dec dh
   loop Backspace1
  borrado1:         
   jmp inicio
   
mayor2:
  gotoxy 7,3
  mov dh,8
  BackSpace2:
   cmp dh,0            
   jz borrado2
   
   mov ah, 02h         ; DOS Display character call
   mov dl, 08h         ; Another backspace character to move cursor back again
   int 21h             ; Display it 
   mov dl, 20h         ; A space to clear old character 
   int 21h             ; Display it  
   mov dl, 08h         ; Another backspace character to move cursor back again
   int 21h             ; Display it
   dec dh
   loop Backspace2
  borrado2: 
   printn 'Ingrese correctamente'        
  gotoxy 21,3
  mov dh,22
  BackSpace3:
   cmp dh,0            
   jz borrado3
   
   mov ah, 02h         ; DOS Display character call
   mov dl, 08h         ; Another backspace character to move cursor back again
   int 21h             ; Display it 
   mov dl, 20h         ; A space to clear old character 
   int 21h             ; Display it  
   mov dl, 08h         ; Another backspace character to move cursor back again
   int 21h             ; Display it
   dec dh
   loop Backspace3
  borrado3:
   jmp cont
   
define_scan_num
define_print_num
define_print_num_uns
end


No hay comentarios.:

Publicar un comentario

Programa que pone 3 colores y 3 letras

include 'emu8086.inc' CUADRO MACRO XI,YI,XF,YF,COLOR MOV AX, 0600H ; MOV BH, COLOR ; COLOR DE FONDO Y LETRA MOV BL, 00H MOV CH...