Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: многсловное умножение  (Прочитано 16870 раз)
0 Пользователей и 8 Гостей смотрят эту тему.
Iriska
Гость
« : 02-06-2004 15:15 » 

Задание....

Многословное умножение.

т.е дано 2 адреса в памяти их надо перемножить

помогите с алгоритмом плизззз...
надо чтобы распространилось на число любой длины
вернее я даже понимаю как делать... теоретически (как в столбик) но не получается Жаль((

еще у подруги с делением задание - деление 2ного слова на двойное слово но это я сделала правда с помощью вычитания, а с помощью div вообще как-нибудь это делается ? что бы 2ное на 2ное было Не понял
Записан
Finch
Спокойный
Администратор

il
Offline 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


ну вот это всё до чего я пока додумалась..... двойное слово на слово вроде бы умнодает.... а дальше у меня уже каша в голове  Жаль
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 02-06-2004 20:05 » 

Умножение, в двоичном контексте, очень простое:
1) результат=0;
2) если младший бит arg2 равен нулю, то перейти на пункт 4,;
3) результат+=arg1;
4) arg1<<=1;
5) arg2>>=1;
6) если arg2 не ноль, то вернуться на 2;
(цикл выполняется максимум N раз для N-разрядных чисел)
Это беззнаковое умнржение.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 03-06-2004 02:10 » 

блин - пробелы уехали  :? ...
Записан

Iriska
Гость
« Ответ #7 : 04-06-2004 15:47 » 

с делением не понимаю даже в теории..... можно отнимать от делителя делитель и получить делимое и делитель, а можно сделать это как-нибудь с помощью 2х DIV Не понял?

и еще знает ли кто-нибудь отладчик что бы можно было программу прокручивать в обратную сторону.... ну вернуться на шаг назад и т д или можно это с делать в Borland turbo debugger Не понял
Записан
Finch
Спокойный
Администратор

il
Offline 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
Спокойный
Администратор

il
Offline 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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #12 : 05-06-2004 06:38 » new

ADD нужно применять только при первом сложении. ADC нужно обязательно применять во втором и третьем сложении, что будет если когда AX складываеш с какой либо ячейкой и получаеш переполнение. И когда складываеш DX без ADC, то теряеш значение. word1a и word2a не обязательно должны быть длины 2*length, а  word4a обязательно. При этом у тебя не будет головной боли, что ты перейдеш границу word4a. Потому что, результат умножение двух чисел никогда не будет длинее суммы длин двух чисел. для примера число 99. Если сделаеш 99*99=9801. длина числа 99 два, сумма длин четыре. Да кстати попробуй сделать побайтное умножение. При этом у тебя будет возможность делать умножение для нечетной lenght
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 09-06-2004 16:01 » 

Вставлю свои пять копеек Улыбаюсь
А про знаки забыли, а переполнение?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline 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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #16 : 12-06-2004 12:25 » 

Iriska, А для чего тебе надо программирование. Ты любиш это делать или тебя заставляют обстоятельства.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines