; 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