Iriska
Гость
|
|
« : 02-06-2004 15:15 » |
|
Задание.... Многословное умножение. т.е дано 2 адреса в памяти их надо перемножить помогите с алгоритмом плизззз... надо чтобы распространилось на число любой длины вернее я даже понимаю как делать... теоретически (как в столбик) но не получается (( еще у подруги с делением задание - деление 2ного слова на двойное слово но это я сделала правда с помощью вычитания, а с помощью div вообще как-нибудь это делается ? что бы 2ное на 2ное было
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 02-06-2004 16:04 » |
|
Iriska, а ты можеш выложить код. Или надо писать заново. Подобное есть у меня (рабочее), но только написано на паскале.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Anonymous
Гость
|
|
« Ответ #2 : 02-06-2004 19:16 » |
|
many_mul macro a,b,c,length ; push cx ; mov cx,length lea si,word1a lea di,word2a lea bx,word4a ml2: push cx ml1: mov ax,[si] mul [di] add [bx],ax add [bx+2],dx inc si inc si inc bx inc bx loop ml1 ; pop cx inc di inc di inc bx inc bx lea si,word1a loop ml2 add [bx+4],dx endm codesg segment assume cs:codesg,ds:codesg,es:codesg org 100h start: jmp begin word1a dw 05678h word1b dw 01234h word2a dw 05432h word2b dw 09876h word3a db 0 word3b db 0 word4a dq 0 word4b dq 0 begin: nop many_mul word1b,word2b,word4b,2 ret end start codesg ends ну вот это всё до чего я пока додумалась..... двойное слово на слово вроде бы умнодает.... а дальше у меня уже каша в голове
|
|
|
Записан
|
|
|
|
Iriska
Гость
|
|
« Ответ #3 : 02-06-2004 19:16 » |
|
many_mul macro a,b,c,length ; push cx ; mov cx,length lea si,word1a lea di,word2a lea bx,word4a ml2: push cx ml1: mov ax,[si] mul [di] add [bx],ax add [bx+2],dx inc si inc si inc bx inc bx loop ml1 ; pop cx inc di inc di inc bx inc bx lea si,word1a loop ml2 add [bx+4],dx endm codesg segment assume cs:codesg,ds:codesg,es:codesg org 100h start: jmp begin word1a dw 05678h word1b dw 01234h word2a dw 05432h word2b dw 09876h word3a db 0 word3b db 0 word4a dq 0 word4b dq 0 begin: nop many_mul word1b,word2b,word4b,2 ret end start codesg ends ну вот это всё до чего я пока додумалась..... двойное слово на слово вроде бы умнодает.... а дальше у меня уже каша в голове
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 02-06-2004 19:24 » |
|
деление 2ного слова на двойное слово но это я сделала правда с помощью вычитания, а с помощью div вообще как-нибудь это делается ? что бы 2ное на 2ное было вот пример
деление
1010111010 | 101 101 |_______ _______ | 10001011 0000111 101 ___ 01001 101 ____ 1000 101 ___ 011
умножение
11011 10111 ______ 11011 11011. 11011. . 00000. . . 11011. . . . _____________ 100110110 1
а длину в случае умножения надо знать заранее имхо
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #5 : 02-06-2004 20:05 » |
|
Умножение, в двоичном контексте, очень простое: 1) результат=0; 2) если младший бит arg2 равен нулю, то перейти на пункт 4,; 3) результат+=arg1; 4) arg1<<=1; 5) arg2>>=1; 6) если arg2 не ноль, то вернуться на 2; (цикл выполняется максимум N раз для N-разрядных чисел) Это беззнаковое умнржение.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 03-06-2004 02:10 » |
|
блин - пробелы уехали :? ...
|
|
|
Записан
|
|
|
|
Iriska
Гость
|
|
« Ответ #7 : 04-06-2004 15:47 » |
|
с делением не понимаю даже в теории..... можно отнимать от делителя делитель и получить делимое и делитель, а можно сделать это как-нибудь с помощью 2х DIV ? и еще знает ли кто-нибудь отладчик что бы можно было программу прокручивать в обратную сторону.... ну вернуться на шаг назад и т д или можно это с делать в Borland turbo debugger
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #8 : 04-06-2004 15:58 » |
|
Iriska, Я не думаю, что существует такой отладчик. Как например ты востановиш значение в регистре AX после команды xor AX,AX.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Anonymous
Гость
|
|
« Ответ #9 : 04-06-2004 18:41 » |
|
кажется я сделала это...... вот что получилось... в итоге методом тыка в отладчике и сделала вот что получилось: many_mul macro a,b,c,length mov cx,length lea si,word1a lea di,word2a lea bx,word4a ml2: push cx mov cx,2 ml1: mov ax,[si] mul [di] add [bx],ax add [bx+2],dx inc si inc si inc bx inc bx loop ml1 dec bx dec bx ; ; pop cx inc di inc di lea si,word1a loop ml2 endm
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #10 : 04-06-2004 19:21 » |
|
Я так понял, у тебя второе число 4 байтное. Молодец. Мельком просмотрел, вроде крупных ошибок не увидел. Но есть маленькие замечания ADD [bx+2],dx нужно делать ADC [bx+2], dx, после этого ADC [bx+4],0 нужно учитывать перенос. ADD его не учитывает. Да еще бы не помешало занулить word4a. Не плохо бы знать, что такое word1a, word2a, word4a.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Iriska
Гость
|
|
« Ответ #11 : 04-06-2004 21:10 » |
|
ну word1a,word2a имеется ввиду что там должно стоять a,b,c и length т е множимое, множитель, результат который должен быть length*2 и длина слова про ADC знаю.. но еще не думала как лучше сделать... длина слов любой должна быть не обязательно 2х или 4х или 8ми байтное.... в этом и сложности у меня
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #12 : 05-06-2004 06:38 » |
|
ADD нужно применять только при первом сложении. ADC нужно обязательно применять во втором и третьем сложении, что будет если когда AX складываеш с какой либо ячейкой и получаеш переполнение. И когда складываеш DX без ADC, то теряеш значение. word1a и word2a не обязательно должны быть длины 2*length, а word4a обязательно. При этом у тебя не будет головной боли, что ты перейдеш границу word4a. Потому что, результат умножение двух чисел никогда не будет длинее суммы длин двух чисел. для примера число 99. Если сделаеш 99*99=9801. длина числа 99 два, сумма длин четыре. Да кстати попробуй сделать побайтное умножение. При этом у тебя будет возможность делать умножение для нечетной lenght
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Sla
|
|
« Ответ #13 : 09-06-2004 16:01 » |
|
Вставлю свои пять копеек А про знаки забыли, а переполнение?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #14 : 09-06-2004 16:16 » |
|
Sla, Переполнение мы исключили с самого начала. Когда сделали длину произведения равной сумме длин множимого и множителя. В даном случае переполнение никогда не произойдет. Насчет знаков. Сначало надо девушке сделать без учета знаков, а потом.... Еше все впереди.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Iriska
Гость
|
|
« Ответ #15 : 12-06-2004 11:25 » |
|
я сдала вот в таком виде а с побайтным наверно подумаю many_mul macro a,b,c,length lea si,a lea di,b lea bx,c mov cx,length ml2: push cx mov cx,length ml1: mov ax,[si] mul [di] add [bx],ax adc [bx+2],dx adc [bx+4],0 inc si inc si inc bx inc bx loop ml1 dec bx dec bx pop cx inc di inc di lea si,a loop ml2 endm
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #16 : 12-06-2004 12:25 » |
|
Iriska, А для чего тебе надо программирование. Ты любиш это делать или тебя заставляют обстоятельства.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
|