Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2010, 19:27   #1
Khelleos
Новичок
Джуниор
 
Регистрация: 14.05.2010
Сообщений: 2
По умолчанию Длинная арифметика

Народ. помогите! Нужно реализовать на Ассемблере длинную арифметику.
Сложение и вычитание уже сделал, а с умножением и делением нет. Как делать умножение представляю, но не получается...
Пока что я хочу просто хочу умножить длинное число на короткое, но возникает ошибка, как ее исправить не знаю(((
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 // перейти, если меньше
}
}
Помогите кто чем может!!!!
Khelleos вне форума Ответить с цитированием
Старый 19.12.2010, 00:45   #2
Khelleos
Новичок
Джуниор
 
Регистрация: 14.05.2010
Сообщений: 2
По умолчанию

У меня теперь другая проблема(((. Не получается закончить внешний цикл(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
30



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
}
}
Khelleos вне форума Ответить с цитированием
Старый 20.12.2010, 09:08   #3
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

mul bx // ax = ax * bx тут ошибка

mul bx // dx:ax = ax * bx
dx=edx
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинная арифметика Indira Общие вопросы C/C++ 2 24.01.2010 10:28
длинная арифметика Dimarik Общие вопросы C/C++ 1 16.09.2009 12:02
Длинная арифметика DmT Помощь студентам 2 06.10.2007 22:43