Ensamblador - Calculadora en ensamblador

 
Vista:
sin imagen de perfil
Val: 7
Ha disminuido 1 puesto en Ensamblador (en relación al último mes)
Gráfica de Ensamblador

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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder