меня и моего друга пытаются написать код, в котором нам нужно умножить два 32-разрядных номера, что приведет к 64-разрядному номеру. Мы хотели, чтобы умножал чисел, используя метод добавления, проблема в том, что регистр может хранить только 8 бит (16 бит на пару) за раз. Мы искали решения, и было трудно найти что-нибудь действительно полезное для этой ситуации. Не могли бы вы дать нам какой-либо намек на то, как это сделать?(Assembly - 8085) Умножьте 32-разрядные номера
ответ
Дополнение - дополнение, мы узнали о добавлении в классной школе.
99
+ 1
====
9 + 1 = 0 нести один, мы делаем это в два раза, а затем получить 0 + 1 = 1
11
99
+ 1
====
100
Doesnt того, что база, в двоичном коде, мы могли бы это:
111
+001
====
же сделки, основание 2, 1 + 1 = 0 нести 1, повторить, что до тех пор, пока 1 + 0 = 1
111
111
+ 001
=====
1000
Но в отличие от бумаги и карандаша мы имеем более сильное ограничение на количество бит в компьютере, но это никоим образом не меняет способ его работы.
Я могу взять предыдущую проблему и разделить ее на регистры с двумя разрядными размерами.
11 11
1 11
+ 0 01
=== ==
10 00
первый является Младшие два бита 11 + 01 мы делаем математику и получить 00 с переносом из 1. вторая операция занимает перенос из предыдущей операции использует это в качестве ручной клади в , то добавим 01 + 00 с переносом в 1 и получим 10 с выводом 0.
Ничего волшебного нет.
Тогда позволяет получить более фундаментальный
01 11 11 10
0 1 1 1
+ 0 0 0 1
== == == ==
1 0 0 0
мы начинаем с lsbit, которая 1 + 1 с переносом в 0, так что 0 + 1 + 1 = 0 с переносом из 1. Это нести out - это перенос следующего столбца в двух столбцах. Который является переносом в 1 плюс 1 + 0 = 0 с выполнением 1. Четырех столбца совпадают с двумя 1 + 1 + 0 = 0 с выполнением 1. столбец восьмерок является переносом в из 1 + 0 + 0 = 1 с выполнением 0. Каждый столбец работает с теми же тремя вещами, добавленными вместе с переносом плюс операнд плюс операнд b, тогда вы получаете бит результата и бит выполнения. Вы можете объединить их так же широко, как вы хотите, миллионы бит, миллиарды бит, бесконечные.
Так что сборка обычно дает вам определенную поддержку здесь. У вашего alu есть работа, которая имеет тенденцию идти в бит флага переноса в каком-либо регистре состояния процессора. У вас есть два операнда и результат, промежуточные переносы, выполняющие перенос, управляются в самом алу, и вы не можете их увидеть. Иногда у вас есть нормальная инструкция добавить и еще добавить с инструкцией кэрри, где флаг переноса является перенос в и затем осуществляют посадку в этом бит переноса, а так и для систем, как, что вы бы
add
adc
adc
adc
...
для, как широкий набор значений, которые вы хотите, как правило, ограничен количеством имеющейся у вас памяти или другими подобными ограничениями (количество регистров).
Если вы не имеют сложение с переносом, то вы должны синтезировать, что
add
jnc lab0
add #1
lab0:
add
jnc lab1
add #1
lab1:
Некоторые наборы инструкций только имеют сложение с переносом так
clc ; clear carry bit
add
add
add
add
...
Я, очевидно, оставив регистры/операнды от этих инструкций, поскольку они не важны для «как сделать математику больше, чем количество бит, которое у меня есть в регистре». Как показано выше с математикой 1 и 2 бит, вам нужно подготовить свои данные и поместить их в операнды на основе столбцов, над которыми вы работаете. Если у вас есть 8-битные регистры и 8-разрядный алу, то вы делите ваши N-бит-операнды на 8-битные части, организуйте их так, чтобы вы работали с нижними байтами, а затем с более поздними байтами второго порядка и так далее. Правильно соединяясь, выполняйте один этап в следующем.
Не знаете, почему возникла проблема в поиске решений. Математика математики класса охватывает основы подсчета и добавления и переноса в следующий столбец, затем вы берете это в документации набора инструкций, где описывается добавление, и если есть добавление с переносом. Отображение операции добавления изменяет бит переноса, а добавление с переносом использует и изменяет бит переноса.
Большое спасибо за объяснение, я был очень смущен, и я должен теперь понять, как решить мою проблему –
Пусть два числа: AA55h и BB22h. Мы будем использовать второй номер в качестве счетчика. ALP is:
LXI B, AA55h LXI D, BB22h; счетчик LXI H, 0000h; 16bit перенос инициализации
Начало: MOV A, C ADD C MOV C, A
MOV A, B АЦП B MOV B, A
JNC Carry INX H Carry: DCX D; декремент счетчика JNZ Start
;; 16 бит переноса хранился в HL пары ;; 16-битовый результат был сохранен в BC пары
- 1. 8085 assembly: sign extend 8-bit to 16-bit
- 2. Умножьте число на коэффициент n раз для достижения нужного номера
- 3. Умножьте/добавьте начальное число для получения целевого номера
- 4. 8085 арифметическая программа
- 5. 8085 Simulator Misbehaving
- 6. 8085 Программа Assembly Language для создания массива в порядке возрастания от 2 других массивов
- 7. Maven assembly: assembly
- 8. 8085 умножение. Как это работает?
- 9. Как печатать первые цифры номера в MIPS Assembly Programming?
- 10. Умножьте два значения без знака 16 бит, не используя команды умножения или деления [8086 Assembly]
- 11. MIPS Assembly Язык: Delay
- 12. Умножьте проценты в Sass
- 13. Умножьте константу в R
- 14. Умножьте пустую проблему
- 15. Умножьте перед нормализацией
- 16. Умножьте функциональную кривую
- 17. Умножьте вложенные try-catch
- 18. умножьте значение в PHP
- 19. Умножьте содержимое Integerfield
- 20. Умножьте числа на переменные
- 21. Умножьте поплавок в сборке
- 22. Erlang: умножьте два списка
- 23. Умножьте назначенное значение диапазона
- 24. Умножьте фильтрацию в MongoDB
- 25. Умножьте все параметры функции
- 26. Умножьте на -1 VBA
- 27. SQL - Выберите умножьте условия
- 28. Умножьте выпадающее угловое
- 29. Умножьте диапазон с константой
- 30. Умножьте смежные элементы
Пожалуйста, объясните, почему вы не удовлетворены с сохранением значений в памяти (в том числе стек). – Netch
Я не понимаю, как я могу сохранить количество этого измерения, потому что оно больше 16 бит. Я новичок в сборке, и это может показаться простым вопросом. Я думал сократить число в 8 бит штук и хранить их в реестрах для расчета. Тем не менее, я не вижу способа написать код, который может добавить число N раз, потому что регистры могут работать только до 255 (в случае использования регистра в качестве счетчика, чтобы знать, когда остановить цикл добавления) –
Если вы новичок в сборке, но старый для некоторых других языков (C и т. Д.), Возможно, вы должны макетировать решение там для быстрой разработки, а затем перенести его в asm, как только вы это выясните. –