pe26_sm1.asm 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 1 / 3 ;=========================================================================== ;=========================================================================== ; PROGRAMA : pe26_sml.asm ; FUNCION : Suma de dos numeros ASCII (mediante suma Hexadecimal) ; REALIZADO POR : Prof. Juan Juárez Fuentes (Basado en Peter Abel) ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 2009112316522020121213182628 ;=========================================================================== ;=========================================================================== ; TEORÍA DE APOYO PARA EL PROBLEMA ;=========================================================================== ; Ya que los datos que se ingresan desde un teclado están en formato ASCII, ; la representación en memoria de un número decimal ingresado tal como 1234 ; es 31323334H. Es necesario hacer un ajuste con el comando "AAA" porque un ; número ASCII representa un número de base 10 desempaquetado, mientras el ; procesador realiza aritmética en base dos. ; suma ASCII: 38H ; +34H ; --; 6CH La suma 6CH no es correcta ni en ASCII ni en binario. ; Si ignoramos el 6 de la extrema izquierda, y sumamos 6 a C (porque es la ; diferencia entre decimal y hexadecimal) llegamos al resultado de 12H que ; es la respuesta correcta en decimal. ; Esta es la forma en que AAA realiza el ajuste. ;=========================================================================== ;=========================================================================== ; DECLARACION DE CONSTANTES ;=========================================================================== 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,"$" December 13, 2012 Crimson Editor pe26_sm1.asm 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 2 / 3 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 + 2 ; Inicialización de números ASCII LEA DI,ASCII_2 + 2 LEA BX,SUMA_ASCII + 3 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 + 3 ; Convierte la SUMA_ASCII a ASCII MOV CX,04 December 13, 2012 Crimson Editor pe26_sm1.asm 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 3 / 3 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 ;=========================================================================== ;=========================================================================== ;=========================================================================== December 13, 2012 Crimson Editor