pe27_sm2.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 / 4 ;=========================================================================== ;=========================================================================== ; PROGRAMA : pe27_sm2.asm ex p17_sum2.asm ; FUNCION : Suma de dos numeros introducidos como binarios. ; REALIZADO POR : Prof. Juan Juárez Fuentes ; COMPILADOR EN EL QUE SE EJECUTO: TASM 5.0 ; FECHA : 20121214185317 ;=========================================================================== ;=========================================================================== ; 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 ;----------------------------------------------------------------------M_ENCABEZADO DB 13,10,13,10,TAB,TAB,"=====================================================" DB 13,10,13,10,TAB,TAB,"PROGRAMA QUE SUMA DOS NUMEROS (dados como constantes)" DB 13,10,13,10,TAB,TAB,"=====================================================",13,10,"$" M_ESPACIO DB 13,10,13,10,13,10,13,10,13,10,13,10,"$" M_RESULTADO DB 13,10,13,10,13,10,TAB,TAB,TAB,BELL,"El resultado es: ","$" NUMERO_1 DW 00010000B ; Variable que guarda la cantidad uno convertida a binario NUMERO_2 DW 00010000B ; Variable que guarda la cantidad dos convertida a binario. RESULTADO DB 11 DUP (?),"$" ;----------------------------------------------------------------------DATOS ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE PILA ;=========================================================================== PILA SEGMENT STACK ;----------------------------------------------------------------------DB 64 DUP('PILA') ;----------------------------------------------------------------------PILA ENDS ;=========================================================================== ; DECLARACION DEL SEGMENTO DE CODIGO December 17, 2012 Crimson Editor pe27_sm2.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 / 4 ;=========================================================================== CODIGO SEGMENT ;------------------------------------------------------------------ASSUME CS:CODIGO,DS:DATOS,SS:PILA ;------------------------------------------------------------------EMPIEZA: ; Etiqueta de comienzo de programa ;------------------------------------------------------------MOV AX, DATOS ; Inicializa DS con la direccion de @Data MOV DS, AX MOV DX, Offset M_ENCABEZADO ; Despliega el mensaje de bienvenida CALL IMPRIME MOV SI, OFFSET RESULTADO ; Inicializa la variable RESULTADO, SI TIENE LA PRIMERA DIRECCION DE 11 VARIABLES ADD SI, 11 ; SI SE DEZPLAZA 11 POSIIONES PAR AUBICARSE EN LA ULTIMA DIRECCION DE LA VARIABLE MOV AL, "$" ; SE PONE UN FIN DE CADENA EN LA PARTE BAJA DEL REGISTRO A. MOV [SI], AL ; EN LA DIRECCION DONDE APUNTA (SI), QUE ES LA ULTIMA DE LA VARIABLE SE PONE EL ; FIN DE CADENA ;------------------------------------------------------------CALL SUMA ; Suma las dos cantidades ;------------------------------------------------------------; TERMINA EL PROGRAMA ;------------------------------------------------------------MOV AX, FIN ; Termina el progrma sin error INT DOS ; 21H ;=========================================================================== ; RUTINAS DE SOPORTE ;=========================================================================== ;------------------------------------------------------------; Rutina: Suma ; Proposito: Suma dos numeros enteros sin signo ; Parametros: En el registro Ax el primer numero y en BX el segundo ; Regresa: El resultado en el registro par DX:AX, que es desplegado en la pantalla. ;------------------------------------------------------------SUMA PROC NEAR XOR DX, DX ; Dx = 0 Por si acaso existe acarreo. MOV AX, NUMERO_1 ; SE CARGA EL PRIMER NUMERO (Primera cantidad) MOV BX, NUMERO_2 ; SE CARGA EL SEGUNDO NUMERO (Segunda cantidad) ADD AX, BX ; SE SUMAN LAS DOS CANTIDADES JNC CONVERTIR_SUMA ; ¿Hubo acarreo? NO? ENTONCES BRINCA ADC DX, 0 ; Si CONVERTIR_SUMA: ; CONTINUA CALL ConvASCII ; LLAMA AL PROCEDIMIENTO QUE: Convierte resultado en ASCII MOV DX, OFFSET M_RESULTADO ; Despliega cadena del resultado CALL IMPRIME December 17, 2012 Crimson Editor pe27_sm2.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: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 3 / 4 MOV DX, OFFSET RESULTADO ; Despliega el resultado CALL IMPRIME MOV DX, OFFSET M_ESPACIO ; Despliega espacios despues del reusltado CALL IMPRIME RET SUMA ENDP ;------------------------------------------------------------; Rutina: Imprime ; Proposito: Despliega una cadena ; Parametros: El registro DX contiene el desplazamiento de la cadena ; Regresa: Nada ;------------------------------------------------------------IMPRIME PROC NEAR MOV AH, IMPRIMIR ; Prepara para desplegar la cadena a traves de la INT 21h INT DOS RET IMPRIME ENDP ;------------------------------------------------------------;------------------------------------------------------------; Rutina: ConvASCII ; Proposito: Convertir un valor binario en ASCII ; Parametros: El registro par DX:AX ; Regresa: Nada, pero almacena el resultado en el buffer RESULTADO ;------------------------------------------------------------ConvASCII PROC Near ;------------------------------------------------------------; Lo primero que se hace es inicializar la variable que contendra al resultado de la conversion ;------------------------------------------------------------PUSH DX PUSH AX ; Guarda el resultado MOV SI, OFFSET RESULTADO ;Inicializa la variable RESULTADO llenandolacon CEROS. MOV CX, 10 MOV Al, "0" CICLO_CEROS: MOV [SI], AL INC SI LOOP CICLO_CEROS POP AX POP DX MOV BX, AX ; Palabra baja de la cantidad MOV AX, DX ; Palabra alta de la cantidad MOV SI, OFFSET RESULTADO ; Cadena donde se guardara el resultado ADD SI, 11 December 17, 2012 Crimson Editor pe27_sm2.asm 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 4 / 4 MOV CX, 10 ; Divisor = 10 OBTENDIGITO: Dec SI XOR DX, DX ; Borra DX, contendra el residuo DIV CX ; Divide la palabra alta (AX) MOV DI, AX ; Guarda cociente (AX) MOV AX, BX ; AX = palabra baja (BX) DIV CX ; DX tenia un residuo de la division anterior MOV BX, AX ; Gurada el cociente MOV AX, DI ; Regresa la palabra alta ADD Dl, 30h ; Convierte residuo en ASCII MOV [SI], Dl ; Lo almacena OR AX, AX ; ¿ Palabra alta es 0 ? Jnz OBTENDIGITO ; No, sigue PROCesando OR BX, BX ; ¿ Palabra baja es 0 ? JNZ OBTENDIGITO ; No, sigue procesando RET ConvASCII ENDP ;------------------------------------------------------------------CODIGO ENDS ;=========================================================================== END EMPIEZA ;=========================================================================== ;=========================================================================== ;=========================================================================== December 17, 2012 Crimson Editor