martes, 6 de diciembre de 2016

Programa 26 Suma de dos números ASCII (mediante suma Hexadecimal).

; DECLARACION DE CONSTANTES
 ;Guillermo Arturo Mireles Garc?a

 CR EQU 13 ; Constante CR (Retorno de carro)
 LF EQU 10 ; Constante LF (Salto de l?nea)
 IMPRIMIR EQU 9
 FIN EQU 4C00H
 DOS EQU 21H
 TAB EQU 09H
 BELL EQU 07H

 ; DECLARACION DEL SEGMENTO DE DATOS

   DATOS SEGMENT
        ENCABEZADO DB        13,10,13,10,TAB,"====================================================="
        DB 13,10,TAB," PROGRAMA QUE SUMA DOS NUMEROS ASCII"
        DB 13,10,TAB,"=====================================================",13,10,13,10,"$"
        ASCII_1 DB '023',"$" ; Como esta diseñado para 3 digitos, hay que rellnar con 0's cuando
        ASCII_2 DB '056',"$" ; usamos menos, de lo contrario da mal el resultado.
        SUMA_ASCII DB '0000',13,10,13,10,"$"
     DATOS ENDS

; DECLARACION DEL SEGMENTO DE PILA
 
    PILA SEGMENT STACK
        DB 64 DUP('0')
    PILA ENDS

; DECLARACION DEL SEGMENTO DE CODIGO
 
CODIGO SEGMENT
     
      pe26_sm1 PROC NEAR ; Inicio procedimiento
            ASSUME CS:CODIGO,DS:DATOS,SS:PILA
            MOV AX,DATOS ; AX=Direcci?n del segmento de datos
            MOV DS,AX ; DS=AX. Indicar el segmento de datos
            CLC ; Limpia bandera de acarreo
            LEA SI,ASCII_1 + 4 ; Inicializaci?n de n?meros ASCII
            LEA DI,ASCII_2 + 4
            LEA BX,SUMA_ASCII + 5
            MOV CX,03 ; Inicializaci?n de tres ciclos
     
       CICLO_1:
            MOV AH,00 ; Limpia el AH
            MOV AL,[SI] ; Carga un byte ASCII
            ADC AL,[DI] ; Suma con acarreo
            AAA ; Ajusta para ASCII
            MOV [BX],AL ; Almacena la suma
            DEC SI
            DEC DI
            DEC BX
            LOOP CICLO_1 ; Realiza el ciclo tres veces
            MOV [BX],AH ; Al final almacena el acarreo
            LEA BX,SUMA_ASCII + 5 ; Convierte la SUMA_ASCII a ASCII
            MOV CX,04
     
      CICLO_2:
            OR BYTE PTR[BX],30H
            DEC BX
            LOOP CICLO_2 ; Realiza el ciclo cuatro veces
            LEA DX, ENCABEZADO
            CALL ESCRIBE
            LEA DX, SUMA_ASCII
            CALL ESCRIBE
            CALL SALIR
   
     pe26_sm1 ENDP ; Fin del procedimiento
     
     ESCRIBE PROC ; Inicio procedimiento ESCRIBE
            MOV AH,9 ; Funci?n DOS para escribir texto en pantalla
            INT 21H ; Llamar a la interrupci?n del DOS
            RET ; Volver o retornar
       ESCRIBE ENDP ; Fin del procedimiento ESCRIBE
     
     SALIR PROC NEAR
         
           MOV AX, FIN ;Mueve la instruccion para terminar el programa.
            INT DOS ;Ejecuta la interrupci?n.
            RET
     
      SALIR ENDP
 
   CODIGO ENDS
 
END pe26_sm1




















No hay comentarios:

Publicar un comentario