Форум программистов, компьютерный форум CyberForum.ru

Реализовать длинную арифметику ассемблерными вставками - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
10.12.2011, 06:36     Реализовать длинную арифметику ассемблерными вставками #1
привет всем, нужна помощь в освоении асм вставок, нужно написать длинную арифметику сложения, вычитание, умножение деление, т.е. это 4 функции. Помогите пожалуйста, я в асм не оч разбираюсь, простую арифметику еще понял а эту что то так и не могу понять что откуда зачем почему
среда vs2010

Добавлено через 10 часов 12 минут
разве никто ничего не знает что ли??(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2011, 06:36     Реализовать длинную арифметику ассемблерными вставками
Посмотрите здесь:

C++ Задача на длинную арифметику
C++ Реализовать длинную арифметику
Как доделать длинную целочисленную арифметику? C++
C++ Нужны примеры с ассемблерными вставками
C++ Переделать в длинную арифметику
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
10.12.2011, 08:29     Реализовать длинную арифметику ассемблерными вставками #2
Цитата Сообщение от eddilou Посмотреть сообщение
я в асм не оч разбираюсь
Если не разбираетесь - разберитесь (c) Кэп.
http://www.insidepro.com/kk/144r.shtml
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
10.12.2011, 13:44  [ТС]     Реализовать длинную арифметику ассемблерными вставками #3
Цитата Сообщение от Евгений М. Посмотреть сообщение
Если не разбираетесь - разберитесь (c) Кэп.
http://www.insidepro.com/kk/144r.shtml
это основу я знаю, я про длинную арифметику
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
10.12.2011, 16:37     Реализовать длинную арифметику ассемблерными вставками #4
Цитата Сообщение от eddilou Посмотреть сообщение
я про длинную арифметику
http://e-maxx.ru/algo/big_integer
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
10.12.2011, 17:01  [ТС]     Реализовать длинную арифметику ассемблерными вставками #5
Цитата Сообщение от Евгений М. Посмотреть сообщение
Конечно спасибо. но это СИшный вариант а мне нужна ассемблеровская вставка
т.е. 4 функции с асм вставками
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.12.2011, 17:06     Реализовать длинную арифметику ассемблерными вставками #6
eddilou, готовых таких извращений вы вряд ли найдете, а писать за так никто не будет
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
10.12.2011, 18:17  [ТС]     Реализовать длинную арифметику ассемблерными вставками #7
Цитата Сообщение от Jupiter Посмотреть сообщение
eddilou, готовых таких извращений вы вряд ли найдете, а писать за так никто не будет
я не прошу за так, а я прошу лишь помочь имея ввиду подскзать с чего начать и что использовать
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.12.2011, 18:20     Реализовать длинную арифметику ассемблерными вставками #8
eddilou, вам уже дали две ссылки с чего начать
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
10.12.2011, 18:30  [ТС]     Реализовать длинную арифметику ассемблерными вставками #9
там сишный вариант и о с асм никак не переплетается
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.12.2011, 18:37     Реализовать длинную арифметику ассемблерными вставками #10
eddilou, я вам уже написал
Цитата Сообщение от Jupiter Посмотреть сообщение
готовых таких извращений вы вряд ли найдете
изучайте асм по 1-й ссылке, изучайте арифметику по 2-й и пишите
eddilou
3 / 3 / 0
Регистрация: 21.11.2010
Сообщений: 194
18.12.2011, 17:00  [ТС]     Реализовать длинную арифметику ассемблерными вставками #11
Цитата Сообщение от Jupiter Посмотреть сообщение
eddilou, я вам уже написал

изучайте асм по 1-й ссылке, изучайте арифметику по 2-й и пишите
вот написал прогу, но она не так работает почему то...
числа должны быть 16ричные и их 32
т.е к примеру A=02020202020202020202020202020202
C++
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
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#include<iostream>
using namespace std;
int* subtrction(int* mas1, int kol_ya1, int z1, int* mas2, int kol_ya2, int z2, int &kol_ya3, int &z3);
 
int* addition(int* mas1, int kol_ya1, int z1, int* mas2, int kol_ya2, int z2, int &kol_ya3, int &z3)
{
    int i,*mas3, sl1, sl2;
    if (z1!=z2)
    {
        z1=z2;
        mas3=subtrction(mas1, kol_ya1, z1, mas2, kol_ya2, z2, kol_ya3, z3);
        return mas3;
    }
    else
    {
        if (kol_ya1>kol_ya2)
            kol_ya3=kol_ya1;
        else 
            kol_ya3=kol_ya2;
        mas3=(int*)malloc((kol_ya3+1)*sizeof(int));
        mas3[1]=0; 
        mas3[0]=0;
__asm
{
    xor esi, esi
forkol_ya3:
    cmp esi, kol_ya1
    jge ifkol_ya1_2
    mov eax, mas1
    mov ebx, dword ptr [eax][4*esi]
    mov sl1, ebx
    jmp ifkol_ya1_end
ifkol_ya1_2:
    xor eax, eax
    mov sl1, eax
ifkol_ya1_end:
    cmp esi, kol_ya2
    jge ifkol_ya2_2
    mov eax, mas2
    mov ebx, dword ptr [eax][4*esi]
    mov sl2, ebx
    jmp ifkol_ya2_end
ifkol_ya2_2:
    xor eax, eax
    mov sl2, eax
ifkol_ya2_end:
    mov eax, sl1
    mov ecx, sl2
    add eax, ecx
    cdq
    mov ecx,10000
    idiv ecx
    mov ecx, mas3
    mov ebx, dword ptr [ecx][4*esi]
    add ebx, edx
    mov ecx, mas3
    mov dword ptr [ecx][4*esi], ebx
    mov dword ptr [ecx][4*esi+4], eax
    xor ebx, ebx
    mov dword ptr [ecx][4*esi+8], ebx
    inc esi
    mov ebx, dword ptr [kol_ya3]
    cmp esi, dword ptr [ebx]
    jl forkol_ya3
    mov eax, mas3
    mov ebx, dword ptr [ebx][4*esi]
    xor edx,edx
    cmp ebx, edx
    je to_exit
    inc kol_ya3
to_exit:
    mov eax, z1
    mov z3, eax
}
        return mas3;
    }
}
//--------------------------------------------------------------------//
 
int* subtrction(int* mas1, int kol_ya1, int z1, int* mas2, int kol_ya2, int z2, int &kol_ya3, int &z3)
{
    int i,*masl,*mas3,*masg, vch, cf=0, kol_yaminus;
    if (z1!=z2)
    {
        z2=z1;
        mas3=addition(mas1, kol_ya1, z1, mas2, kol_ya2, z2, kol_ya3, z3);
        return mas3;
    }
    if (kol_ya1>kol_ya2)
    {
        kol_ya3=kol_ya1;
        kol_yaminus=kol_ya2;
        masg=mas1;
        masl=mas2;
        z3=z1;
    }
    if (kol_ya1<kol_ya2)
    {
        kol_ya3=kol_ya2;
        kol_yaminus=kol_ya1;
        masg=mas2;
        masl=mas1;
        z3=z2;
            if (z1==1)
                z3=0;
            else
                z3=1;
    }
    if (kol_ya1==kol_ya2)
    {
        kol_ya3=kol_ya2;
        kol_yaminus=kol_ya2;
        if (mas1[kol_ya1-1]>mas2[kol_ya2-1])
        {
            masg=mas1;
            masl=mas2;
            z3=z1;
        }
        else
        {
            masg=mas2;
            if (z1==1)
                z3=0;
            else
                z3=1;
        }
    }
    mas3=(int*)malloc(kol_ya3*sizeof(int));
    mas3[1]=0; mas3[0]=0;
__asm
{
    xor esi, esi
forkol_ya3:
    mov eax, kol_yaminus
    cmp esi, eax
    jge elsekol_yaminusus
    mov ecx, masl
    mov ebx, dword ptr[ecx][esi*4]
    add ebx, cf
    mov vch, ebx
    jmp elsekol_yaminusus_2
elsekol_yaminusus:
    mov ecx, mas3
    mov ebx, dword ptr[ecx][esi*4]
    add ebx, cf
    mov vch, ebx
elsekol_yaminusus_2:
    mov ebx, masg
    mov eax, dword ptr[ebx][esi*4]
    sub eax, vch
    mov ebx, mas3
    mov dword ptr[ebx][esi*4], eax
    xor ebx, ebx
    mov cf, ebx
    cmp eax, ebx
    jge mas3to_exit
    mov ecx, 10000
    add eax, ecx
    mov ebx, mas3
    mov dword ptr[ebx][esi*4], eax
    mov eax, 1
    mov cf, eax
    mas3to_exit:
    xor eax, eax
    mov ebx, mas3
    mov dword ptr[ebx][esi*4+4], eax
    inc esi
    mov ebx, dword ptr [kol_ya3]
    mov ecx,dword ptr [ebx]
    cmp esi, ecx
    jl forkol_ya3
    mov cf, ecx
}
    for (i=kol_ya3-1;i>0;i--)
        if (mas3[i]==0)
            cf--;
    kol_ya3=cf;
    return mas3;
}
//---------------------------------------------------------//
int* mul(int* mas1, int kol_ya1, int z1, int* mas2, int kol_ya2, int z2, int &kol_ya3, int &z3)
{
    int i,k,*mas3,j,temp,tempya,sdvig,*tempm,kk,t1,t2,t3;
    mas3=(int*)malloc((kol_ya1+kol_ya2)*sizeof(int));
    tempm=(int*)malloc((kol_ya1+kol_ya2)*sizeof(int));
    for (i=0;i<kol_ya1+kol_ya2;i++)
        mas3[i]=0;
    z3=z1*z2;
    //пока не дойдем до начала во втором числе
__asm
{
    xor esi,esi
    mov i, esi
for2chisla:
    mov esi, i
    mov sdvig, 1
    mov ebx, mas2
    add ebx, esi
    add ebx, esi
    add ebx, esi
    add ebx, esi
    mov eax, [ebx]
    mov temp, eax
    xor esi, esi
    mov j, esi
foryach2chisla:
        mov j, esi
        xor esi, esi
        mov ebx, kol_ya1
        add ebx, kol_ya2
        inc ebx
        xor eax, eax
        xor ecx, ecx
forobnultemp:
            mov edi, tempm
            stosd
            add tempm, 4
            inc ecx
            cmp ecx, ebx
            jl forobnultemp
        sub tempm, ecx
        sub tempm, ecx
        sub tempm, ecx
        sub tempm, ecx
//идем по 1 числу
for1chisla:
            mov ebx, tempm
            add ebx, i
            add ebx, i
            add ebx, i
            add ebx, i
            add ebx, esi//ebx=tempm[i+k]
            add ebx, esi
            add ebx, esi
            add ebx, esi
            mov eax, temp
            mov ecx, 10
            xor edx, edx
            div ecx
            mov eax, edx;   eax=temp%10
            mul sdvig;      eax=temp%10*sdvig
            mov ecx, mas1
            add ecx, esi
            add ecx, esi
            add ecx, esi
            add ecx, esi
            mov edx, [ecx];     edx=mas1[k]
            mul edx;        eax=temp%10*sdvig*mas1[k]
            add eax, [ebx];     ebx=temp%10*sdvig*mas1[k]+tempm[i+k]
            mov ecx, 10000
            div ecx
            mov edi, tempm
            add edi, i
            add edi, i
            add edi, i
            add edi, i
            add edi, esi
            add edi, esi
            add edi, esi
            add edi, esi
            xchg eax, edx
            stosd
            xchg eax, edx
            stosd           
            inc esi
            mov k, esi  
            cmp esi, kol_ya1
            jl for1chisla
        mov esi, j
        mov eax, sdvig
        mov ecx, 10
        mul ecx
        mov sdvig, eax
        mov eax, temp
        mov ecx, 10
        div ecx
        mov temp, eax
//вызов сложения    
        lea eax,t1
        xor eax, eax
        push eax        //z3
        lea eax, kk
        push eax        //kol_ya3
        xor eax, eax
        push eax            //z2
        mov eax, kol_ya1
        add eax, kol_ya2
        inc eax
        push eax            //kol_ya2
        push mas3           //mas2
        xor eax, eax
        push eax            //z1
        mov eax, i
        add eax, k
        inc eax
        push eax            //kol_ya1
        push tempm          //mas1
        call addition
        mov mas3, eax
        pop eax
        pop eax
        pop eax
        pop eax
        pop eax
        pop eax
        pop eax
        pop eax
//проверка на выход
        mov eax, mas2
        add eax, i
        add eax, i
        add eax, i
        add eax, i
        mov ebx, [eax]
        cmp ebx, 0
        jne idem_dalshe
        mov eax, i
        cmp eax, kol_ya2
        je to_exit
idem_dalshe:
//конец цикла по ячейке 2 числа
        inc esi
        mov k, esi
        inc j
        mov esi, j
        cmp esi, 4
        jl foryach2chisla
    inc i
    mov esi, i
    cmp esi, kol_ya2
    jl for2chisla
to_exit:
}
    kol_ya3=kol_ya1+kol_ya2;
    if (mas3[kol_ya3-1]==0)
        kol_ya3--;
    return mas3;
}
//функция чтения. на вход указатель на файл, указатель в файле, поставленный на начало числа; еще указатель на количество ячеек; указатель знака числа
int* readlong(FILE *in, fpos_t position, int &kol_ya, int &z)
{
    char c;
    int kol_num=0,*mas, numpol=0,temp=0,tempc;
    fsetpos(in, &position);
    kol_ya=0;   
    c=fgetc(in);
    if (c=='-')
        z=1;
    else
    {
        z=0;
        fsetpos(in, &position);
    }
    c='0';
    while ((c>='0')&&(c<='9'))
    {
        kol_num++;
        c=fgetc(in);
    }
    kol_num--;
    fgetpos (in, &position);
    if (c!=-1)
    position-=2;
    kol_ya=kol_num/4;
    if (kol_num%4!=0)
        kol_ya++;
    mas=(int*)malloc(kol_ya*sizeof(int));
    //получили количество ячеек в массиве
    while(kol_num>=0)
    {
        if ((numpol%4==0)||(kol_num==0))
        {
            if (numpol%4==0)
                mas[numpol/4-1]=temp;
            if (kol_num==0)
                mas[numpol/4]=temp;
            temp=0;
        }
        position--;
        fsetpos(in,&position);
        c=fgetc(in);
        tempc=atoi(&c);
        temp=pow(10.,numpol%4)*tempc+temp;
        numpol++;
        kol_num--;
    }
    return mas;
}
//*******************************************//
void main()
{
    FILE *in,*out;
    fpos_t position;
    char c='1';
    int kol_ya1,kol_ya4,kol_ya5, zt1,z5, kol_ya3, z3, kol_ya2, zt2,z4,*mas1,*mas2,*mas3,*mas4,*mas5,i,*t1,z1,kol_yat1,*t2,z2,kol_yat2;
    in=fopen("d:\\in.txt","r");
    fgetpos(in, &position);
//считаем кол-во цифер на 1 строке  
    mas1=readlong(in, position, kol_ya1, z1);
//считаем кол-во цифер на 2 строке
    c='1';
    fsetpos(in, &position); 
    while (((c>='0')&&(c<='9'))||(c=='-'))
        c=fgetc(in);
    fgetpos(in, &position);
    mas2=readlong(in, position, kol_ya2, z2);
//считаем кол-во цифер на 3 строке
    c='1';
    fsetpos(in, &position); 
    while (((c>='0')&&(c<='9'))||(c=='-'))
        c=fgetc(in);
    fgetpos(in, &position);
    mas3=readlong(in, position, kol_ya3, z3);
    fclose(in);
//D = C-A*B
    t1=mul(mas1,kol_ya1,z1,mas2,kol_ya2,z2,kol_yat1,zt1);
    mas4=subtrction(mas3, kol_ya3,z3,t1, kol_yat1,zt1,kol_ya4,z4);
//E = B*B-A+C   
    mas5=mul(mas2,kol_ya2,z2,mas2,kol_ya2,z2,kol_ya5,z5);
    mas5=subtrction(mas5, kol_ya5,z5,mas1, kol_ya1,z1,kol_ya5,z5);
    mas5=addition(mas5, kol_ya5,z5,mas3, kol_ya3,z3,kol_ya5,z5);
//  cout<<mas5;
    out=fopen("d:\\out.txt","w");
    if (z4==1)
    fprintf(out,"-");
    for (i=kol_ya4-1;i>=0;i--)
    fprintf(out,"%4d",mas4[i]);
    fprintf(out,"\n");  
    if (z5==1)
    fprintf(out,"-");
    for (i=kol_ya5-1;i>=0;i--)
    fprintf(out,"%4d",mas5[i]);
    fclose(out);
//  system("pause");
}
Добавлено через 4 часа 4 минуты
тут нет программистов знающих длинную арифметику на ASMе???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2011, 18:20     Реализовать длинную арифметику ассемблерными вставками
Еще ссылки по теме:

C++ Задача на длинную арифметику
Задача на длинную арифметику C++
C++ c ассемблерными вставками C++

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

Или воспользуйтесь поиском по форуму:
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
18.12.2011, 18:20     Реализовать длинную арифметику ассемблерными вставками #12
Цитата Сообщение от eddilou Посмотреть сообщение
тут нет программистов знающих длинную арифметику на ASMе???
Ну разумеется.
Yandex
Объявления
18.12.2011, 18:20     Реализовать длинную арифметику ассемблерными вставками
Ответ Создать тему
Опции темы

Текущее время: 09:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru