9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
1

Умножение двух 16-ти разрядных чисел

10.09.2013, 19:25. Показов 18979. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте . Помогите , пожалуйста, понять , как умножаются числа в ассемблере.
Читал , что если ax* на 16-ти разрядное число , то результат будет записываться в виде dx:ax , старшая часть в dx , а младшая в ax . Как это понимать ?
Например , если я пишу вот так:

Assembler
1
2
mov ax,op1   ;16 бит
mul op2        ;16 бит
Как мне с ним работать дальше ? В какой регистр записывается результат умножения ? Как обратиться к результату ?
Как , например , потом отнять /добавить какое-то число к этому результату?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.09.2013, 19:25
Ответы с готовыми решениями:

Умножение двух 32-разрядных беззнаковых целых чисел (нужна проверка решения)
Добрый вечер, прошел тему битовых сдвигов, прошу оценить мою реализацию умножения двух 32-разрядных...

Умножение 16 разрядных чисел с получением 32 разрядного результата
Доброго времени суток, требуется написать программу - по алгоритму умножения двоичных чисел в...

Вычитание двух 32-разрядных двоичных чисел
Добрый день! Понимаю, что задача простейшая, но все же вызывает затруднения. Мне надо написать...

Умножение двух 64-х разрядных чисел на 64битной системе
Добрый день. Изучаю умножение чисел по методу Кацубы. И в задании нужно умножить два 64...

61
Модератор
3489 / 2612 / 741
Регистрация: 19.09.2012
Сообщений: 7,973
10.09.2013, 19:58 2
Например, если перемножить два 16-ти битных числа ABCD и DCBA, то результат будет 9420FEF2, что явно больше 16-ти бит и в ax его уже не запихать. Поэтому, младшая часть числа (FEF2) записываетсяв ax, а старшая (9420) - в dx.
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
10.09.2013, 20:15  [ТС] 3
Цитата Сообщение от FIL Посмотреть сообщение
Например, если перемножить два 16-ти битных числа ABCD и DCBA, то результат будет 9420FEF2, что явно больше 16-ти бит и в ax его уже не запихать. Поэтому, младшая часть числа (FEF2) записываетсяв ax, а старшая (9420) - в dx.
А если мне нужно обратиться к целому результату ? Как это делается ?
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,424
10.09.2013, 20:25 4
Цитата Сообщение от NNN7 Посмотреть сообщение
А если мне нужно обратиться к целому результату ?
целому результату чего?
вот у тебя есть число(берем десятичные чтобы было понятно) 1000 * 1000
и есть четыре клетки чтобы записать результат (AX) получится (младшие) 0000 но есть еще четыре дополнительных клетки( DX) в них запишется (старшие)100 в общем (0100) (0000)
и что есть для тебя результат ?
0
Модератор
3489 / 2612 / 741
Регистрация: 19.09.2012
Сообщений: 7,973
10.09.2013, 20:28 5
NNN7, надо сдвинуть содержимое edx на 16 разрядов влево и сложить его с eax - получится "целый" результат.
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,424
10.09.2013, 20:37 6
Цитата Сообщение от FIL Посмотреть сообщение
NNN7, надо сдвинуть содержимое edx на 16 разрядов влево
и получим 0
сам сдвинь 16 разрядное число на 16 разрядов
да даже если не ноль то как можно старшие разряды складывать с младшими?
0
Модератор
3489 / 2612 / 741
Регистрация: 19.09.2012
Сообщений: 7,973
10.09.2013, 20:44 7
Цитата Сообщение от ValeryS Посмотреть сообщение
и получим 0
сам сдвинь 16 разрядное число на 16 разрядов
да даже если не ноль то как можно старшие разряды складывать с младшими?
edx - 32-х разрядный регистр, вообщето.
Если я сложу 94200000 с FEF2, то получу 9420FEF2.
Как у тебя с этим обстоит - не знаю.
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
10.09.2013, 20:44  [ТС] 8
Цитата Сообщение от ValeryS Посмотреть сообщение
целому результату чего?
вот у тебя есть число(берем десятичные чтобы было понятно) 1000 * 1000
и есть четыре клетки чтобы записать результат (AX) получится (младшие) 0000 но есть еще четыре дополнительных клетки( DX) в них запишется (старшие)100 в общем (0100) (0000)
и что есть для тебя результат ?
Спасибо за Ваш ответ. В ax и dx немного понятно .
На счёт целого результата: вот я пусть умножил два 16-ти разрядных числа A и B , образовались ax с младшими разрядами и dx с старшими разрядами . Но дальше мне нужно до этого произведения добавить какую-то цифру . Как это сделать , если результат разбит на 2 регистра ?
Вот этого не могу понять (
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,424
10.09.2013, 21:03 9
Цитата Сообщение от FIL Посмотреть сообщение
edx - 32-х разрядный регистр, вообщето.
а теперь открываем стартовый пост и удивляемся
Цитата Сообщение от NNN7 Посмотреть сообщение
Читал , что если ax* на 16-ти разрядное число , то результат будет записываться в виде dx:ax
речь идет о 16 битных регистрах
Цитата Сообщение от FIL Посмотреть сообщение
Если я сложу 94200000 с FEF2, то получу 9420FEF2.
покажи где ты
Цитата Сообщение от FIL Посмотреть сообщение
сдвинуть содержимое edx на 16 разрядов влево
вот по твоему
94200000>>16=9420
9420+FEF2 никак не получится 9420FEF2.
Цитата Сообщение от NNN7 Посмотреть сообщение
вот я пусть умножил два 16-ти разрядных числа A и B , образовались ax с младшими разрядами и dx с старшими разрядами . Но дальше мне нужно до этого произведения добавить какую-то цифру .
добавляй к младшему разряду ax если будет переполнение то добавляй к старшему разряду 1
вспомни математику 1-2 класс сложение столбиком
примерно будет выглядеть так
Assembler
1
2
3
clr c; очистим флаг переноса
add ax,n; добавим число к младшему разряду  
adc dx,0;добавим к старшему 0 если флаг переноса установлен( было переполнение) добавим 1(флаг переноса)
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от NNN7 Посмотреть сообщение
Спасибо за Ваш ответ.
Для спасибы кнопка есть:)



Добавлено через 5 минут
расшифровываю
add сложение двух операндов с записью результата в левый операнд
adc сложение двух операндов с записью результата в левый операнд плюс флаг переноса (0 если не установлен, 1 если установлен)
0
Модератор
3489 / 2612 / 741
Регистрация: 19.09.2012
Сообщений: 7,973
10.09.2013, 21:05 10
Цитата Сообщение от ValeryS Посмотреть сообщение
а теперь открываем стартовый пост и удивляемся
Я отвечал на вопрос:
Цитата Сообщение от NNN7 Посмотреть сообщение
А если мне нужно обратиться к целому результату ? Как это делается ?
(Помимо стартового поста бывают и другие...)

Цитата Сообщение от ValeryS Посмотреть сообщение
вот по твоему
94200000>>16=9420
9420+FEF2 никак не получится 9420FEF2.
По-моему, лево находится с другой стороны.
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,424
10.09.2013, 21:07 11
Цитата Сообщение от FIL Посмотреть сообщение
По-моему, лево находится с другой стороны.
ладно ошибся
как будет
94200000<<16????
не 0 ли?
0
Модератор
3489 / 2612 / 741
Регистрация: 19.09.2012
Сообщений: 7,973
10.09.2013, 21:15 12
После умножения в edx будет 00009420.
00009420 << 16 = 94200000
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
10.09.2013, 21:15  [ТС] 13
Цитата Сообщение от ValeryS Посмотреть сообщение
а теперь открываем стартовый пост и удивляемся
речь идет о 16 битных регистрах
покажи где ты
вот по твоему
94200000>>16=9420
9420+FEF2 никак не получится 9420FEF2.

добавляй к младшему разряду ax если будет переполнение то добавляй к старшему разряду 1
вспомни математику 1-2 класс сложение столбиком
примерно будет выглядеть так
Assembler
1
2
3
clr c; очистим флаг переноса
add ax,n; добавим число к младшему разряду  
adc dx,0;добавим к старшему 0 если флаг переноса установлен( было переполнение) добавим 1(флаг переноса)
Добавлено через 1 минуту

Не по теме:


Для спасибы кнопка есть:)



Добавлено через 5 минут
расшифровываю
add сложение двух операндов с записью результата в левый операнд
adc сложение двух операндов с записью результата в левый операнд плюс флаг переноса (0 если не установлен, 1 если установлен)
Спасибо за ответ ) А где опять же хранится результат нашего сложения ? В ax ?

А как поступать с вычитанием ? Если , например , есть такой пример : A-(B*C).

Извините , что достаю Вас вопросами )
0
programmer
2391 / 525 / 69
Регистрация: 01.06.2011
Сообщений: 3,639
10.09.2013, 21:16 14
влево-не вправо!
(9420<<16) + FEF2=9420FEF2;

NNN7,если приходиться работать с 16 разрядными регистрами,то прибавлять необходимо к младшей части числа.
При условии,что прибавляем 16 разрядное число.Если происходит переполнение,то делать инкримент старшей части в dx.
Опять все зависит от условий задачи.это примерный вариант.

Assembler
1
2
3
4
5
6
7
8
mov ax,FFFEh
mov bx,F9A5h;множитель
mul bx
mov bx,FFFFh;слагаемое
add ax,bx;сложение
jnс @not_carry;переход,при условии,что флаг переноса (cf) не был установлен.
inc dx;при переполнении инкремент dx
@not_carry
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
10.09.2013, 22:00  [ТС] 15
Цитата Сообщение от Thread Посмотреть сообщение
влево-не вправо!
(9420<<16) + FEF2=9420FEF2;

NNN7,если приходиться работать с 16 разрядными регистрами,то прибавлять необходимо к младшей части числа.
При условии,что прибавляем 16 разрядное число.Если происходит переполнение,то делать инкримент старшей части в dx.
Опять все зависит от условий задачи.это примерный вариант.

Assembler
1
2
3
4
5
6
7
8
mov ax,FFFEh
mov bx,F9A5h;множитель
mul bx
mov bx,FFFFh;слагаемое
add ax,bx;сложение
jnс @not_carry;переход,при условии,что флаг переноса (cf) не был установлен.
inc dx;при переполнении инкремент dx
@not_carry
А как сделать вычитание ?
А-(В*С)
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,424
10.09.2013, 22:09 16
Цитата Сообщение от FIL Посмотреть сообщение
После умножения в edx будет 00009420.
00009420 << 16 = 94200000
Цитата Сообщение от Thread Посмотреть сообщение
влево-не вправо!
(9420<<16) + FEF2=9420FEF2;
гаспада я с вас балдею
откуда взялось число 9420?

Цитата Сообщение от FIL Посмотреть сообщение
Например, если перемножить два 16-ти битных числа ABCD и DCBA, то результат будет 9420FEF2,
отсюда???
если я напишу (32 битный режим)
Assembler
1
2
3
mov EAX,ABCDh
mov EDX,DCBAh
mul EDX
то в EAX будет 9420FEF2 ничего в EDX не будет(точнее будет 0)
если напишу так (16 битный режим)
Assembler
1
2
3
mov AX,ABCDh
mov DX,DCBAh
mul DX
то в DX (никаким EDX здесь не пахнет) будет 9420 а в AX будет FEF2
ну и куда я должен сдвигать DX( на 16 разрядов в 16разрядном регистре) и как должен складывать с AX?????
не надо путать режимы
в DX (EDX) записывается то что не влезло а AX(EAX)
а теперь прошу код как можно умножать 16 битку( а главное зачем) и потом это переводить в 32х битку

Цитата Сообщение от NNN7 Посмотреть сообщение
А где опять же хранится результат нашего сложения ? В ax ?
в AX младшие разряды в DX старшие
(это такое большое число которое уже не влазит в AX)
Цитата Сообщение от NNN7 Посмотреть сообщение
А как поступать с вычитанием ?
прочитай что такое sub и sbb

Цитата Сообщение от NNN7 Посмотреть сообщение
есть такой пример : A-(B*C).
ну можно например так
Assembler
1
2
3
4
5
6
7
8
mov CX,(HING)A; старшие 16 бит числа A
mov BX,(LOV)A; младшие 16 бит числа A
mov AX,B;  число B (меньше или равно 16 бит)
mov DX,C; число C (меньше или равно 16 бит)
mul DX; B*C
clr C; очистим флаг переноса
sub AX,BX;  вычитаем младшие разряды
sbb DX,CX; вычитаем старшие разряды( с учетом переноса)
результат в DX:AX

Добавлено через 1 минуту
Цитата Сообщение от Thread Посмотреть сообщение
При условии,что прибавляем 16 разрядное число.Если происходит переполнение,то делать инкримент старшей части в dx.
ADC использовать религия не позволяет?
0
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
10.09.2013, 22:27  [ТС] 17
Цитата Сообщение от ValeryS Посмотреть сообщение
гаспада я с вас балдею
откуда взялось число 9420?


отсюда???
если я напишу (32 битный режим)
Assembler
1
2
3
mov EAX,ABCDh
mov EDX,DCBAh
mul EDX
то в EAX будет 9420FEF2 ничего в EDX не будет(точнее будет 0)
если напишу так (16 битный режим)
Assembler
1
2
3
mov AX,ABCDh
mov DX,DCBAh
mul DX
то в DX (никаким EDX здесь не пахнет) будет 9420 а в AX будет FEF2
ну и куда я должен сдвигать DX( на 16 разрядов в 16разрядном регистре) и как должен складывать с AX?????
не надо путать режимы
в DX (EDX) записывается то что не влезло а AX(EAX)
а теперь прошу код как можно умножать 16 битку( а главное зачем) и потом это переводить в 32х битку


в AX младшие разряды в DX старшие
(это такое большое число которое уже не влазит в AX)

прочитай что такое sub и sbb



ну можно например так
Assembler
1
2
3
4
5
6
7
8
mov CX,(HING)A; старшие 16 бит числа A
mov BX,(LOV)A; младшие 16 бит числа A
mov AX,B;  число B (меньше или равно 16 бит)
mov DX,C; число C (меньше или равно 16 бит)
mul DX; B*C
clr C; очистим флаг переноса
sub AX,BX;  вычитаем младшие разряды
sbb DX,CX; вычитаем старшие разряды( с учетом переноса)
результат в DX:AX

Добавлено через 1 минуту

ADC использовать религия не позволяет?

А если А у нас 8 бит ? Это ж вы показали , если А - 32 бита ?
0
Модератор
3489 / 2612 / 741
Регистрация: 19.09.2012
Сообщений: 7,973
10.09.2013, 22:29 18
Цитата Сообщение от ValeryS Посмотреть сообщение
то в DX (никаким EDX здесь не пахнет) будет 9420 а в AX будет FEF2
DX - это младшая половина EDX, если кому интересно.
0
Модератор
Эксперт по электронике
8876 / 6651 / 912
Регистрация: 14.02.2011
Сообщений: 23,424
10.09.2013, 22:39 19
Цитата Сообщение от FIL Посмотреть сообщение
DX - это младшая половина EDX, если кому интересно.
а есть еще DL младшая половина DX и DH старшая половина
ты давай код показывай где сдвигать надо

Цитата Сообщение от NNN7 Посмотреть сообщение
А если А у нас 8 бит ? Это ж вы показали , если А - 32 бита ?
значит в старших разрядах будет 0
0
Модератор
3489 / 2612 / 741
Регистрация: 19.09.2012
Сообщений: 7,973
10.09.2013, 22:55 20
Цитата Сообщение от ValeryS Посмотреть сообщение
код показывай
Delphi
1
2
3
4
5
  mov ax, $ABCD
  mov dx, $DCBA
  mul dx
  shl edx, 16
  add dx, ax
Результат в edx
0
10.09.2013, 22:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2013, 22:55
Помогаю со студенческими работами здесь

Схема умножение двух 8-ми разрядных двоичных чисел
Здравствуйте, уважаемые форумчане! Есть задача: Построить схему умножения двух 8-ми разрядных...

AT90S1200. Умножение 4-х разрядных чисел на ASM
Здравствуйте! Столкнулся с проблемой. Нужно написать ПО на ассемблере (умножение 4-разрядных чисел...

МС68HC11 (Micro-IDE). Умножение двоично-десятичных 8-разрядных чисел
МС68HC11 (Micro-IDE). Умножение двух двоично десятичный 8-разрядных чисел. вот часть кода...

Сложение, вычитание и умножение 32-разрядных чисел в формате с плавающей точкой (float)
Добрый день. Прошу помощи в решении задачи на Generic 8051 ЗАДАЧА: Реализовать подпрограммы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru