|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.12.2010, 19:27 | #1 |
Новичок
Джуниор
Регистрация: 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 // перейти, если меньше } } Помогите кто чем может!!!! |
19.12.2010, 00:45 | #2 |
Новичок
Джуниор
Регистрация: 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 } } |
20.12.2010, 09:08 | #3 |
Форумчанин
Регистрация: 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 |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Длинная арифметика | 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 |