Suma de dos números introducidos como binarios.

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