39 / 39 / 24
Регистрация: 13.05.2010
Сообщений: 282
Записей в блоге: 1
1

Длинная арифметика - умножить длинное число на короткое

17.12.2010, 20:01. Показов 4503. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ. помогите! Нужно реализовать на Ассемблере длинную арифметику.
Сложение и вычитание уже сделал, а с умножением и делением нет. Как делать умножение представляю, но не получается...
Пока что я хочу просто хочу умножить длинное число на короткое, но возникает ошибка, как ее исправить не знаю(((
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
void mul(unsigned short *arg1, unsigned short *arg2, unsigned short *res)
{
unsigned short b = 2;
__asm
{
mov ecx, 0 // ecx - счетчик цикла
mov edx, res // в edx указатель на элемент массива res
mov esi, arg1 // в esi указатель на элемент массива arg1
mov edi, arg2 // в esi указатель на элемент массива arg2
mov bx, b // bx = b[i]
mul_1:
mov ax, word ptr [esi] // ax = a[i]
 
mul bx // ax = ax * bx
 
mov word ptr [edx], ax // res[i] = ax
 
add esi, 2 // esi = esi + 2
add edx, 2 // edx = edx + 2
inc ecx // ecx = ecx + 1
cmp ecx, 32 // сравниваем ecx и 16
jl mul_1 // перейти, если меньше
}
}
Помогите кто чем может!!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2010, 20:01
Ответы с готовыми решениями:

Длинная арифметика: как ввести длинное число?
Находил миллион сайтов, где описывается, как работать с длинными числами, однако, не нашёл ни...

Длинная арифметика, длинное число (LongNum) для VBA - .DLL / .XLL
Друзья, всем привет! Для всех кто любит VBA, решил написать помощник в длинной арифметики. Это...

Длинная арифметика. Деление большого на короткое
Искал на форуме, но так ничего конкретного и не нашёл. У меня есть длинное число представленное...

Длинная арифметика. Чистый СИ. Деление длинного HEX на короткое INT
Всем привет. Не знаю с чего начать.... Есть 8-ми битный микроконтроллер.......... Возникла задача...

3
68 / 24 / 2
Регистрация: 16.05.2009
Сообщений: 73
17.12.2010, 23:31 2
при умножении ax на bx результат будет помещён в пару dx:ax (т.е. dx затирается даже если не было пререноса). Перенос разряда при умножении, как я понял, ты совершенно не учитываешь.
Лучше сделать:
перед циклом ax обнулить
add ax,word ptr [esi] - вместо mov ax, word ptr [esi]
после mov word ptr [edx], ax добавить mov ax,dx

и вместо регистра edx использовать другой или сохранять в стеке.
хотя там может быть и два переноса. вообщем посмотри сишный алгоритм и делай так же.
0
39 / 39 / 24
Регистрация: 13.05.2010
Сообщений: 282
Записей в блоге: 1
18.12.2010, 08:39  [ТС] 3
спасибо большое))) теперь работает)

Добавлено через 8 часов 51 минуту
У меня теперь другая проблема(((. Не получается закончить внешний цикл(mul_2). Подскажите что-нибудь, что бы все работало как надо, пожалуйста!!!! Заранее благодарю!
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
void mul(unsigned short *arg1, unsigned short *arg2, unsigned short *res)
{
    unsigned short b = 2;
    __asm
    {
        mov edi, res                        // в edx указатель на элемент массива res
        mov esi, arg1                       // в esi указатель на элемент массива arg1
        mov edx, arg2                       // в esi указатель на элемент массива arg2
        add edx, 62
        mov ax, 0               
mul_2:
        mov ecx, 31                         // ecx - счетчик внутреннего цикла
        mov bx, word ptr [edx]  // bx = b[i]
    mul_1:
            add ax, word ptr [esi + 2 * ecx]        // ax = a[i]
    
            mul bx                                  // ax = ax * bx
 
            mov word ptr [edi + 2 * ecx + 64], ax   // res[i] = ax
            mov ax, dx
 
            dec ecx                 // ecx = ecx + 1
            cmp ecx, 0              // сравниваем ecx и 32
            jge mul_1               // перейти, если меньше
        sub edx, 2
        //cmp [edx], 0
        jge mul_2
    }
}
0
68 / 24 / 2
Регистрация: 16.05.2009
Сообщений: 73
24.12.2010, 13:43 4
неудобно читать код, в котором комментарии не соответствуют коду))) они только с толку сбивают.
dx входит в состав edx, поэтому после умножения он затрется, а ты его как указатель на второй множитель используешь. во втором цикле делай push и pop dx-а.
ещё лучше сделать 2 loop-а, вместо условных переходов. cx естественно тоже сохранять.
и в длинной арифметике разряды обычно хранят в обратном порядке. так удобнее.
0
24.12.2010, 13:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2010, 13:43
Помогаю со студенческими работами здесь

Длинная арифметика.Возведение в степень длинного на длинное.
Возведение в степень длинного на длинное, очень надо. Желательно максимально рациональную версию....

Длинная арифметика: проверить, делится ли число на 101
Здравствуйте) помогите пожалуйста:(дано очень большое число, состоящее из более 2000 цифр ....

Длинная арифметика - возвести число в большую степень
Нужно возвести 3-300, подскажите, пожалуйста, идею, а то не очень понимаю

Умножает число длинное на короткое
Большое число должно хранится в массиве, а маленькое integer. Ответ должен хранится в массиве....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru