Форум программистов, компьютерный форум, киберфорум
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
39 / 39 / 24
Регистрация: 13.05.2010
Сообщений: 282
Записей в блоге: 1

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

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

Студворк — интернет-сервис помощи студентам
Народ. помогите! Нужно реализовать на Ассемблере длинную арифметику.
Сложение и вычитание уже сделал, а с умножением и делением нет. Как делать умножение представляю, но не получается...
Пока что я хочу просто хочу умножить длинное число на короткое, но возникает ошибка, как ее исправить не знаю(((
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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2010, 20:01
Ответы с готовыми решениями:

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

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

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

3
68 / 24 / 2
Регистрация: 16.05.2009
Сообщений: 73
17.12.2010, 23:31
при умножении 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  [ТС]
спасибо большое))) теперь работает)

Добавлено через 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
неудобно читать код, в котором комментарии не соответствуют коду))) они только с толку сбивают.
dx входит в состав edx, поэтому после умножения он затрется, а ты его как указатель на второй множитель используешь. во втором цикле делай push и pop dx-а.
ещё лучше сделать 2 loop-а, вместо условных переходов. cx естественно тоже сохранять.
и в длинной арифметике разряды обычно хранят в обратном порядке. так удобнее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.12.2010, 13:43
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru