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

Anuncio
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
Descargar