Calculadora en ensamblador
Publicado por Daniel (3 intervenciones) el 15/03/2021 17:23:29
buen día a todos, tengo el siguiente código de una calculadora que reconoce un primer digito, operador (suma,resta,etc) y el segundo digito para efectuar dicha operación, el problema es que no encuentro la manera de pasar de decimal a hexadecimal y que el valor máximo sea hasta F en hexadecimal para continuar con la numeración, algún consejo?????
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
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
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
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
.model small
.stack 64
.data
;declarando variables globales
numero1 db 0
numero11 db 0
numero2 db 0
numero22 db 0
operador db 0
suma db 0
resta db 0
multiplicacion db 0
division db 0
;mensajes para obtener numeros
msjn1 db 10,13, "Ingrese el primer numero= ",'$'
msjn2 db 10,13, "Ingrese el segundo numero= ",'$'
;mensaje para mostrar los resultados
msjn3 db 10,13, "Ingrese el operando seleccione el numero (1.+ 2.- 3.* 4./ ): ",'$';
msjnS db 10,13, "La suma es= ",'$'
msjnR db 10,13, "La resta= ",'$'
msjnM db 10,13, "La Multiplicacion es= ",'$'
msjnD db 10,13, "La division es = ",'$'
.code
begin proc far
;direccionamiento del procedimiento
mov ax, @data
mov ds,ax
;solicitar del teclado numero 1
mov ah, 09
lea dx, msjn1;muestra el msjn1
int 21h
mov ah, 01;obtine el numero1
int 21h
;compara si el numero1<9 o numero1<15
cmp al,40h ;numero1 < 40h
jc menor ;salta a menor
cmp al,47h ;numero1 <47h
jc menor2 ;salta a menor2
;resta 30h o 37h correspondiente al caracter ingresado
menor:
sub al, 30h; numero1-30h (para convertir a ascii)
mov numero1,al;guarda en numero1
jmp OP;salta a OP
menor2:
sub al, 37h; numero2-37h (para convertir a ascii)
mov numero1,al;guarda en numero1
jmp OP ;salta a OP
OP:
;solicita el caracter de la operacion a usar
mov ah,09
lea dx, msjn3 ; mensaje de perdir operador
int 21h
mov ah,01
int 21h ;obtine el operador
sub al,30h ;resta 30h al operador
mov operador,al;guarda el numero en variable
jmp OPnumero2;salta OPnumero2
OPnumero2:
;solicitar del teclado numero 2
mov ah, 09
lea dx, msjn2 ;mensaje para obtener numero 2
int 21h
mov ah, 01
int 21h;se obtiene el numero 2
;compara si el numero2<9 o numero2<15
cmp al,40h
jc menor3
cmp al,47h
jc menor4
;resta 30h o 37h correspondiente al caracter ingresado
menor3:
sub al, 30h
mov numero2,al
jmp Operacion
menor4:
sub al, 37h
mov numero2,al
jmp Operacion
;Se elije la operacion segun ingresada
Operacion:
cmp operador,1
jz Sumar ; si operador == 1 entonces salta a Sumar
cmp operador,2
jz Restar
cmp operador,3
jz Multiplicar
cmp operador,4
jz Dividir
Sumar:
;se suma numero1+numero2=suma
mov al,numero1
add al,numero2
mov suma,al
;muestra mensaje de resultado de suma=
mov ah,09
lea dx,msjnS
int 21h
;se mueve la variable suma al registro bajo de datos
mov dl,suma
;se comparan el registo dl para poder mostrar el resultado
cmp dl,10
jz hex;dl==10 entonces salta a hex
cmp dl,10
jc de;dl<10 entonces salta a de
cmp dl,10
jnz hex;dl>10 entonces salta hex
de:
add dl,30h;suma dl+30h(ascii)
mov ah,02
int 21h;muestra el resultado
.exit ;finaliza el proceso
hex:
add dl,37h ;suma dl+37h(ascii)
mov ah,02
int 21h ;muestra el resultado
.exit ;finaliza el proceso
Restar:
;se resta numero1-numero2=resta
mov al,numero1
sub al,numero2
mov resta,al
;muestra mensaje de resultado de resta=
mov ah,09
lea dx,msjnR
int 21h
;se mueve la variable resta al registro dl
mov dl,resta
;se comparan el registo dl para poder mostrar el resultado
cmp dl,10
jz hex2
cmp dl,10
jc de2
cmp dl,10
jnz hex2
de2:
add dl,30h
mov ah,02
int 21h
.exit
hex2:
add dl,37h
mov ah,02
int 21h
.exit
Multiplicar:
;se multiplica numero1*numero2=multiplicacion
mov al,numero1
mul numero2
mov multiplicacion,al
;muestra mensaje de resultado
mov ah,09
lea dx,msjnM
int 21h
;se mueve la variable resta al registro dl
mov dl,multiplicacion
;se comparan el registo dl para poder mostrar el resultado
cmp dl,10
jz hex3
cmp dl,10
jc de3
cmp dl,10
jnz hex3
de3:
add dl,30h
mov ah,02
int 21h
.exit
hex3:
add dl,37h
mov ah,02
int 21h
.exit
Dividir:
;se multiplica numero1/numero2=division
mov bl,numero2
mov al,numero1
div bl
mov division,bl
mov ah,09
;muestra mensaje de resultado
lea dx,msjnD
int 21h
;se mueve la variable resta al registro dl
mov dl,division
;se comparan el registo dl para poder mostrar el resultado
cmp dl,10
jz hex4
cmp dl,10
jc de4
cmp dl,10
jnz hex4
de4:
add dl,30h
mov ah,02
int 21h
.exit
hex4:
add dl,37h
mov ah,02
int 21h
.exit
begin endp
end
Valora esta pregunta
0