Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
Agiseva
0 / 0 / 0
Регистрация: 22.01.2015
Сообщений: 7
1

Вычисление уравнения с большими числами

18.01.2017, 17:53. Просмотров 603. Ответов 7
Метки нет (Все метки)

Выводит не правильно ответ, не могу понять почему.Все время одно и тоже длинное число в ответе. И еще какой регистр использовать чтобы в него можно было поместить число >65535
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
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
text segment 'code'
assume cs:text,ds:data
perenos proc
 push cx
 push di
 lea di,delimoe
 mov cx,4
 rep movsw
 pop di
 pop cx
 ret
perenos endp
 
mul32 proc
 push ax
 push bx
 push cx
 push dx
 
 mov ax,word ptr cd
 mov bx,ax
 mul word ptr ab
 mov word ptr abcd,ax
 mov cx,dx
 mov ax,bx
 mul word ptr ab+2
 add ax,cx
 adc dx,0
 mov bx,ax
 mov cx,dx
 mov ax,word ptr cd+2
 mul word ptr ab
 add ax,bx
 adc cx,dx
 mov word ptr abcd+2,ax
 mov ax,word ptr cd+2
 mul word ptr ab+2
 add ax,cx
 adc dx,0
 mov word ptr abcd+4,ax
 mov word ptr abcd+6,dx
 pop dx
 pop cx
 pop bx
 pop ax
 ret
mul32 endp
 
div64_16 proc
 push ax
 push dx
 xor dx,dx
 mov ax,word ptr delimoe+6
 div delitel
 mov word ptr chast+6,ax
 mov ax,word ptr delimoe+4
 div delitel
 mov word ptr chast+4,ax
 mov ax,word ptr delimoe+2
 div delitel
 mov word ptr chast+2,ax
 mov ax,word ptr delimoe
 div delitel
 mov word ptr chast,ax
 mov ostatok,dx
 pop dx
 pop ax
 ret
div64_16 endp
 
div64_32 proc
 push ax
 push bx
 push cx
 push dx
 push si
 push di
 push bp
 
 mov si,word ptr delimoe64+6
 mov di,word ptr delimoe64+4
 mov dx,word ptr delimoe64+2
 mov ax,word ptr delimoe64
 mov cx,word ptr delitel32+2
 mov bx,word ptr delitel32
 mov bp,32
b1:
 shl ax,1
 rcl dx,1
 rcl di,1
 rcl si,1
 cmp si,cx
 ja b2
 jb b3
 cmp di,bx
 jb b3
b2:
 sub di,bx
 sbb si,cx
 inc ax
b3:
 dec bp
 jnz b1
 
 mov word ptr chast32+2,dx
 mov word ptr chast32,ax
 mov word ptr ostatok32+2,si
 mov word ptr ostatok32,di
 pop bp
 pop di
 pop si
 pop dx
 pop cx
 pop bx
 pop ax
 ret
div64_32 endp
 
outp proc
 push ax
 push cx
 push dx
 push bx
 xor cx,cx
 mov bx,000Ah
cont:
 xor dx,dx
 div bx
 push dx
 inc cx
 or ax,ax
 jnz cont
next:
 mov ah,02h
 pop dx
 add dl,30h
 int 21h
 loop next
 pop bx
 pop dx
 pop cx
 pop ax
 ret
outp endp
 
bigout proc
 push ax
 push cx
 push bx
 push es
 push ds
 pop es
 cld
 call perenos
 mov delitel,10
 xor bx,bx
 xor cx,cx
n1:
 call div64_16
 mov ax,ostatok
 push ax
 inc bx
 lea si,chast
 call perenos
 lea si,nolik
 lea di,delimoe
 mov cx,4
 repe cmpsw
 jne n1
 mov cx,bx
n2:
 pop ax
 call outp
 loop n2
 pop es
 pop bx
 pop cx
 pop ax
 ret
bigout endp
 
 
inp proc
 push cx
 push bx
 push dx
 xor bx,bx
 mov cl,02h
go:
 mov ah,01h
 int 21h
 cmp al,30h
 jb all
 cmp al,39h
 ja all
 sub al,30h
 shl bx,1
 
 mov dx,bx
 shl bx,cl
 add bx,dx
 add bl,al
 adc bh,00h
 jmp go
all:
 mov ah,02h
 mov dl,0ah
 int 21h
 mov dl,0dh
 int 21h
 mov ax,bx
 pop dx
 pop bx
 pop cx
 ret
inp endp
 
 
scr0 proc
 push ax
 mov ah,09h
 int 21h
 pop ax
 ret
scr0 endp
 
myproc proc
 mov ax,data
 mov ds,ax
 lea dx,str1
call scr0
lea dx,stra
 
 call scr0
  call inp
 mov a,ax
 mov ax,a
 lea dx,ps_vk
 call scr0
lea dx,strb
 call scr0
  call inp
 mov b,ax
 mov ax,b
 lea dx,ps_vk
 call scr0
 
lea dx,strc
 call scr0
  call inp
 mov c,ax
 mov ax,c
 lea dx,ps_vk
 call scr0
 
lea dx,strd
 call scr0
 call inp
 mov d,ax
 mov ax,d
 lea dx,ps_vk
 call scr0
 
 mov ax,d
 imul d
 mov word ptr ab,ax
 mov word ptr ab+2,dx
 mov ax,11037
mov word ptr cd,ax
mov word ptr cd+2,0
call mul32
mov ax,word ptr abcd
mov word ptr delimoe,ax 
mov ax,word ptr abcd+2
mov word ptr delimoe+2,ax 
mov ax,word ptr abcd+4
mov word ptr delimoe+4,ax 
mov ax,word ptr abcd+6
mov word ptr delimoe+6,ax
; 11037*d*d
mov ax,c
imul c
mov word ptr ab,ax
mov word ptr ab+2,dx
mov ax,c
mov word ptr cd,ax
mov word ptr cd+2,0
call mul32 
;c*c*c
mov ax,word ptr abcd
mov word ptr delitel,ax 
mov ax,word ptr abcd+2
mov word ptr delitel+2,ax 
mov ax,word ptr abcd+4
mov word ptr delitel+4,ax 
mov ax,word ptr abcd+6
mov word ptr delitel+6,ax
 mov ax,876 
 imul a
 imul a ;a*876
 mov word ptr ab,ax
 mov word ptr ab+2,dx
 mov cx,b
 mov word ptr cd,ax
 mov word ptr cd+2,0
 call mul32
mov ax,word ptr abcd
add word ptr delitel,ax 
mov ax,word ptr abcd+2
adc word ptr delitel+2,ax 
mov ax,word ptr abcd+4
adc word ptr delitel+4,ax 
mov ax,word ptr abcd+6
adc word ptr delitel+6,ax 
;c*c*c+876a*a*b 
call div64_16
mov word ptr delimoe,ax 
mov ax,word ptr chast+2
mov word ptr delimoe+2,ax 
mov ax,word ptr chast+4
mov word ptr delimoe+4,ax 
mov ax,word ptr chast+6
mov word ptr delimoe+6,ax
;11037*d*d/c*c*c+876a*a*b
mov ax,11831
imul a
imul a
mov word ptr ab,ax
mov word ptr ab+2,dx
 mov cx,a
 mov word ptr cd,ax
 mov word ptr cd+2,0
 call mul32
;(11831*a*a*a
mov ax,word ptr abcd
sub word ptr delimoe,ax 
mov ax,word ptr abcd+2
sbb word ptr delimoe+2,ax 
mov ax,word ptr abcd+4
sbb word ptr delimoe+4,ax 
mov ax,word ptr abcd+6
sbb word ptr delimoe+6,ax
lea si,delimoe
 ;lea si,x1
 call bigout
 lea dx,str2
 mov ah,09h
 int 21h
outpr: 
 mov ax,4c00h
 int 21h
myproc endp
text ends
 
data segment
ab dd 0
cd dd 0
abcd dq ?
nolik dq 0
delimoe dq 0
delitel dw 0
chast dq 0
ostatok dw 0
delimoe64 dq 0
delitel32 dd 0
chast32 dd 0
ostatok32 dd 0
a dw 1
b dw 1
c dw 1
d dw 1
y dw ?
x1 dq 0
x2 dq 0
x3 dq 0
x4 dq 0
x5 dq 0
x6 dq 0
str1 db 'y=(110370*d^2)/(c^3+876*a^2*b)-11831*a^3',0ah,0dh,'$'
str2 db ' ',0ah,0dh,'$'
stra db 'Vvedite a=','$'
strb db 'Vvedite b=','$'
strc db 'Vvedite c=','$'
strd db 'Vvedite d=','$'
ps_vk db 0ah,0dh,'$'
c10 dw 10
data ends
 
stack1 segment para stack 'stack'
db 128 dup(?)
stack1 ends
end myproc
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2017, 17:53
Ответы с готовыми решениями:

Посчитать уравнение с большими числами
x=((k^2)*bc-878*a^2)/18780*k+b*c^2

Как избежать переполнения при работе с большими числами
При написании программы возникла проблема с большими числами. У меня есть число, которое копится в...

Как переделать калькулятор, чтобы работал с большими числами?
.model tiny .code JUMPS ; эта директива заставляет генерировать код, при котором можно писать...

Прога в debug. Вычисление формулы. Трабл с длинными числами.
Посоны, посоны! Проблема некая вкралась в код мой. Задание - написать программу для вычисления...

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

7
Vic3Dexe
1 / 1 / 0
Регистрация: 29.01.2017
Сообщений: 10
01.02.2017, 13:14 2
Цитата Сообщение от Agiseva Посмотреть сообщение
выводит не правильно ответ, не могу понять почему
Увы, мы тоже, т.к. неизвестно, какой правильный.
Что показала отладка?
Цитата Сообщение от Agiseva Посмотреть сообщение
какой регистр использовать чтобы в него можно было поместить число >65535
Любой, имеющий разрядность более 16 бит - eax, ebx и т.п., также подойдет пара 16-битных, напр. dx:ax
Ну или FPU, но задача явно подразумевает решение в целых числах.
0
ФедосеевПавел
Модератор
5603 / 2825 / 1146
Регистрация: 01.02.2015
Сообщений: 9,170
Записей в блоге: 1
01.02.2017, 13:32 3
Нет. Тут требуется решение подобное "длинной арифметике".

Но Agiseva не озвучил задание. Возможно, что данная лабораторка не подразумевает таких познаний и всё ограничивается 16-битными регистрами.
0
Vic3Dexe
1 / 1 / 0
Регистрация: 29.01.2017
Сообщений: 10
02.02.2017, 14:19 4
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Тут требуется решение подобное "длинной арифметике".
Ну т.е. в целых числах, поэтому FPU как бы не при делах.
Но вопрос о регистре мог быть самостоятельным, потому и упомянул FPU.
0
02.02.2017, 14:19
Constantin Cat
2721 / 1473 / 419
Регистрация: 28.02.2015
Сообщений: 2,998
Завершенные тесты: 1
02.02.2017, 18:03 5
Цитата Сообщение от Vic3Dexe Посмотреть сообщение
Ну т.е. в целых числах, поэтому FPU как бы не при делах.
Почему? Он тоже может работать с целыми числами и даже сохранять результат в формате BCD/
0
Vic3Dexe
1 / 1 / 0
Регистрация: 29.01.2017
Сообщений: 10
03.02.2017, 12:53 6
Цитата Сообщение от Constantin Cat Посмотреть сообщение
Он тоже может работать с целыми числами
Может, но:
-во-1 он хранит их в дробном формате, могут быть ограничения по точности
-во-2 при использовании FPU проблемы "длинных чисел" не возникает обычно, исходную формулу в строке 379 он прожует без проблем, и суть задания будет потеряна
0
Jin X
4966 / 1553 / 179
Регистрация: 14.12.2014
Сообщений: 2,977
Записей в блоге: 11
Завершенные тесты: 3
03.02.2017, 16:55 7
Цитата Сообщение от Vic3Dexe Посмотреть сообщение
во-1 он хранит их в дробном формате, могут быть ограничения по точности
Если число имеет разрядность не более 64 бит (вместе со знаком), то никакой потери точности не будет, т.к. FPU оперирует 80-битными числами, в которых мантисса + знак занимают 64 бита...
0
Vic3Dexe
1 / 1 / 0
Регистрация: 29.01.2017
Сообщений: 10
04.02.2017, 02:07 8
Цитата Сообщение от Jin X Посмотреть сообщение
не более 64 бит (вместе со знаком), то никакой потери точности не будет
Согласен, но мы в о проблеме в общем, так сказать
0
04.02.2017, 02:07
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2017, 02:07

Работа с большими числами
Подскажиье, пожалуйста, как работать с большими числами. Допустим у меня есть число...

Работа с большими числами
var a,b:double; begin assign(input, 'input.txt'); reset(input); assign(output,...

Операции с большими числами
Всем доброго времени суток! Меня интересует такая проблема. В известном алгоритме электронной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.