Форум программистов, компьютерный форум, киберфорум
Наши страницы
HYDRA8
Войти
Регистрация
Восстановить пароль
Оценить эту запись

калькулятор

Запись от HYDRA8 размещена 04.02.2018 в 20:31
Метки math, tasm

Я ещё с прошлого года
гадала как сделать простой калькулятор на ассемблере.
На самом деле с вычислением чисел проблем не было но
проблема заключалась в том , как перевести десятичное число
в ASCII - формат .
Способ который мне перевее пришёл в голову ,это
1.делить на десять число которое нужно перевести
2.прибавлять к остатку от деления префикс для ASCII цифры (30h)
3. когда целая часть делёжа будет = 0 , заканчивать выводить число.

Но от чего-то этот способ не работал .

Я оставила это на потом .
Но потом я случайно нашла один мануал , где были
некоторые задачи чтобы решить . Одна из них заключалась в том , чтобы перевести цифры ,набранные на клавиатуре ,
в целое десятичное число. У меня получилось написать программу которая сравнивала переведенное число с 200 . Если число было двести ,
то просто выход , а если нет , то сообщение что "число не равно 200 !".
Тогда я подумала , раз у меня уже получается переводить набор символов в целое число, то и получится сделать наоборот .

Применяю тот же метод что и раньше , только использую другие команды , и сначала сохраняю полученные цифры в массиве и только
потом уже массив выводится на экран .
Вот не совсем идеальный , но работающий калькулятор :



Assembler
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
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
.model small
 
 
 
code segment
 
assume ds:code,cs:code    
   org 100h
start:
;сообщение чтобы набрать первое число
mov ah,09h
lea dx ,msg1
int 21h
;получить трехзначное число
xor bx,bx
mov ah,3fh
mov cx,3
lea dx,array1
int 21h
 
mov ah,02h
mov dl,10
int 21h
;второе сообщение - через одну линию
mov si,offset array1+2  ;загрузить в si  адрес строки цифр
 
to_int1:
cmp byte ptr[si],30h  ;если символ в si  меньше "0"  , то пропустить его
jb ignore1
 
xor byte ptr[si],30h  ;убрать префикс ASCII  от каждой цифры
 
mov al,byte ptr[si]
mov ah,potency
xchg  times_counter,ah
ploop1:  ;сначала   счетчик раз умножения на 10 = potency
cmp  times_counter,0
je add_ya1
mov ah,10  ;умножать цифру в al на десять пока счетчик не будет меньше чем 0
mul ah
mov [si],al
dec  times_counter  ;но потом он уменьшается , пока не будет равен нулю
jmp ploop1
 
add_ya1:
mov al,[si]
add number1,al ; потом собирать число 
inc potency
ignore1:
dec si  
 
loop to_int1
 
;сообщение чтобы набрать второе число
mov ah,09h
lea dx,msg2
int 21h
 
 
mov ah,3fh
mov cx,3
lea dx,array2
int 21h
 
mov si,offset array2+2
mov potency,0
to_int2:
cmp byte ptr[si],30h
jb ignore2
 
xor byte ptr[si],30h
 
mov al,byte ptr[si]
mov ah,potency
xchg  times_counter,ah
ploop2:
cmp  times_counter,0
je add_ya2
mov ah,10
mul ah
mov [si],al
dec  times_counter
jmp ploop2
 
add_ya2:
mov al,[si]
add number2 ,al
inc potency
ignore2:
dec si
 
loop to_int2
 
 
 
 
;new line   ;новая линия
mov ah,02h
mov dl,10
int 21h
 
 
 
 
 
mov cx,09
lines:
mov ah,02h
mov dl,'-'         ;за этой полосой будут вычисления
int 21h
 
 
loop lines
;new line
mov ah,02h
mov dl,10
int 21h
 
 
 
suma:
 
mov al,number1       ;сначала сума
add al,number2         
 
mov result,al
 
 
 
to_char:
mov di,offset result_char+2        ;здесь будет переведённое число
 
 
 
mov al,       ;сначала всё как целое 
mov integer_part,al   
mov cl,3     ;три знака в числе
xor ch,ch      
mov dl,10  ;десятичная система счисления
to_array:
 
 
 
xor ah,ah
mov al,integer_part    ;делить  на 10
 
div dl
mov [di],ah   ;остаток деления = 1 цифра , и он кладётся в текущую яйчейку  di
mov integer_part,al    ;  целая часть переделиваетсяч снова 
cmp integer_part,10  ; но если  больше 9
jnb next
mov [di-1],al  ; если же нет ,  то быстро сохраняется в следующей яйчейке  (в обратном порядке)
jmp show  ; и выход из цикла
next:
dec di  ;с права на лево
         
loop to_array
 
 
show:
lea si,result_char    
 
mov cx,3
to_ascii:
 
add byte ptr[si],30h  ;к каждой цифре из полученной строки прибавляется 30h  ,   префикс цифры в ASCII
inc si
loop to_ascii
mov ah,09      ;потом просто вывести  название  операции и строку с результатом  ,  так же и с вычитанием , умножением и 
    ;делением
lea dx,summa
int 21h
mov ah,09
lea dx,data
int 21h
mov result_char[0],0
mov result_char[1],0
mov result_char[2],0
subtra:
mov al,number1       ; единственнное что меняется , это   операции с чилами
sub al,number2 
 
mov resposta,al
 
 
to_char2:
mov di,offset data+2
 
 
 
mov al,result
mov integer_part,al
mov cl,3
xor ch,ch
mov dl,10
to_array2:
 
 
 
xor ah,ah
mov al,integer_part
 
div dl
mov [di],ah
mov integer_part,al
cmp integer_part,10
jnb next2
mov [di-1],al
jmp show2
next2:
dec di
dec cl
loop to_array2
 
 
show2:
lea si,result_char
 
mov cx,3
to_ascii2:
 
add byte ptr[si],30h
inc si
loop to_ascii2
 
 
 
 
mov ah,09
lea dx,resta
int 21h
mov ah,09
lea dx,result_char
int 21h
mov result_char[0],0
mov result_char[1],0
mov result_char[2],0
 
mov al,number1
mov ah,number2 
mul ah
mov result,al
 
 
 
to_char3:
mov di,offset result_char+2
 
 
 
mov al,result
mov integer_part,al
mov cl,3
xor ch,ch
mov dl,10
to_array3:
 
 
 
xor ah,ah
mov al,integer_part
 
div dl
mov [di],ah
mov integer_part,al
cmp integer_part,10
jnb next3
mov [di-1],al
jmp show3
next3:
dec di
dec cl
loop to_array3
 
 
show3:
lea si,result_char
 
mov cx,3
to_ascii3:
 
add byte ptr[si],30h
inc si
loop to_ascii3
mov ah,09
lea dx,multa
int 21h
mov ah,09
lea dx,result_char
int 21h
mov result_char[0],0
mov result_char[1],0
mov result_char[2],0
mov al,number1
 
div number2 
mov result,al
xor ah,ah
to_char4:
mov di,offset data+2
 
 
 
mov al,result
mov integer_part,al
mov cl,3
xor ch,ch
mov dl,10
to_array4:
 
 
 
xor ah,ah
mov al,integer_part
 
div dl
mov [di],ah
mov integer_part,al
cmp integer_part,10
jnb next4
mov [di-1],al
jmp show4
next4:
dec di
dec cl
loop to_array4
 
 
show4:
lea si,result_char
 
mov cx,3
to_ascii4:
 
add byte ptr[si],30h
inc si
loop to_ascii4
mov ah,09
lea dx,division
int 21h
mov ah,09
lea dx,result_char
int 21h
 
exit:
int 20h
 
potency db 0
 times_counter db 0
msg1 db 'write the first number $'
msg2 db 'write the second number $'
 
array1 db 3 dup (0)
array2 db 3 dup (0)
integer_part db ?
 
number1 db ?  ;cabem en 1 byte
number2 db ?
 
result db ?
summa db 'sum : ',24h
difference db 'difference : ',24h
multiplication db 'multiplication : ',24h
division db 'division : ',24h
result_char db 3 dup (0),10
db 24h
 
 
code ends
  
  end start
Размещено в Без категории
Просмотров 322 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru