Как я могу умножить два 64-разрядных числа с помощью x86 ассемблер?

Для устройства MIUI OS

1) Перейдите к настройке

2) Прокрутите вниз до дополнительной настройки

3) Вы найдете вариант разработчика внизу

4) Включите это - Установите через USB: Toggle On

Включив это, он работает в моем устройстве MIUI8.

8
задан Monolo 14 September 2012 в 17:02
поделиться

7 ответов

Используйте то, что должно, вероятно, быть Вашим учебником курса, Randall Hyde "Искусство Ассемблера".

См. 4.2.4 - умножение расширенной точности

Хотя 8x8, 16x16, или 32x32 умножаются, обычно достаточно, существуют времена, когда можно хотеть умножить большие значения вместе. Вы будете использовать x86 единственный операнд MUL и инструкции IMUL для умножения расширенной точности..

Вероятно, самая важная вещь помнить при выполнении умножения расширенной точности состоит в том, что необходимо также выполнить дополнение многократно увеличенной точности одновременно. Сложение всех частичных продуктов требует нескольких дополнений, которые приведут к результату. Следующий список демонстрирует надлежащий способ умножиться два 64 битовых значения на процессоре на 32 бита..

(См. ссылку для полного протокола ассемблирования и иллюстраций.)

12
ответ дан 5 December 2019 в 13:02
поделиться

Так как Вы находитесь на x86, Вам нужны 4 инструкции по путанице. Разделите количества на 64 бита на два слова на 32 бита и умножьте низкие слова к самому низкому и 2-му самому низкому слову результата, затем обе пары низкого и высокого слова от различных чисел (они переходят к 2-му и 3-му самому низкому слову результата), и наконец оба высоких слова в 2 самых высоких слова результата. Добавьте их всех, вместе не забыв иметь дело с переносом. Вы не указывали расположение памяти вводов и выводов, таким образом, невозможно написать код кода.

2
ответ дан 5 December 2019 в 13:02
поделиться

Это зависит, какой язык Вы используете. Из того, что я помню от изучения блока MIPS, существует Перемещение От Верховного командования и Перемещение От команды Lo, или mflo и mfhi. mfhi хранят главные 64 бита, в то время как mflo хранит более низкие 64 бита общего количества.

0
ответ дан 5 December 2019 в 13:02
поделиться

ах блок, некоторое время, так как я использовал его. таким образом, я предполагаю, что настоящая проблема вот состоит в том, что микроконтроллер (для чего я раньше писал код в блоке так или иначе) Вы продолжаете работать, не имеет регистров на 64 бита? если это так, Вы собираетесь иметь повреждение числа, с которыми Вы работаете независимо и выполняете несколько умножения с частями.

это кажется, что это - присвоение домашней работы от способа, которым Вы сформулировали его, таким образом, я не собираюсь обстоятельно объяснять его гораздо дальше :P

0
ответ дан 5 December 2019 в 13:02
поделиться

Просто сделайте нормальное долгое умножение, как будто Вы умножали пару 2-разрядных чисел, кроме каждой "цифры" действительно 32-разрядное целое число. Если Вы умножаете два числа в X и Y адресов и храните результат в Z, то то, что Вы хотите сделать (в псевдокоде):

Z[0..3] = X[0..3] * Y[0..3]
Z[4..7] = X[0..3] * Y[4..7] + X[4..7] * Y[0..3]

Обратите внимание, что мы отбрасываем верхние 64 бита результата (так как 64-разрядное число времена 64-разрядное число является 128-разрядным числом). Также обратите внимание, что это принимает прямой порядок байтов. Кроме того, будьте осторожны относительно со знаком по сравнению с неподписанным, умножаются.

0
ответ дан 5 December 2019 в 13:02
поделиться

Найдите компилятор C, который поддерживает 64 бита (GCC делает IIRC), компилируют программу, которая делает просто, что, затем получите дизассемблирование. GCC может выложить его на своем собственном, и можно вытащить его из объектного файла с правильными инструментами.

OTOH их 32bX32b = 64b op на x86

a:b * c:d = e:f
// goes to
e:f = b*d;
x:y = a*d;  e += x;
x:y = b*c;  e += x;

все остальное переполняется

(непротестированный)

Отредактируйте Неподписанный только

0
ответ дан 5 December 2019 в 13:02
поделиться

Я держу пари, что Вы - студент, поэтому посмотрите, можно ли сделать эту работу: Сделайте это пословно и используйте сдвиги разряда. Продумайте наиболее эффективное решение. Остерегайтесь знакового бита.

-1
ответ дан 5 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: