2013-12-20 2 views
-2

меня и моего друга пытаются написать код, в котором нам нужно умножить два 32-разрядных номера, что приведет к 64-разрядному номеру. Мы хотели, чтобы умножал чисел, используя метод добавления, проблема в том, что регистр может хранить только 8 бит (16 бит на пару) за раз. Мы искали решения, и было трудно найти что-нибудь действительно полезное для этой ситуации. Не могли бы вы дать нам какой-либо намек на то, как это сделать?(Assembly - 8085) Умножьте 32-разрядные номера

+0

Пожалуйста, объясните, почему вы не удовлетворены с сохранением значений в памяти (в том числе стек). – Netch

+0

Я не понимаю, как я могу сохранить количество этого измерения, потому что оно больше 16 бит. Я новичок в сборке, и это может показаться простым вопросом. Я думал сократить число в 8 бит штук и хранить их в реестрах для расчета. Тем не менее, я не вижу способа написать код, который может добавить число N раз, потому что регистры могут работать только до 255 (в случае использования регистра в качестве счетчика, чтобы знать, когда остановить цикл добавления) –

+1

Если вы новичок в сборке, но старый для некоторых других языков (C и т. Д.), Возможно, вы должны макетировать решение там для быстрой разработки, а затем перенести его в asm, как только вы это выясните. –

ответ

1

Дополнение - дополнение, мы узнали о добавлении в классной школе.

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-битные части, организуйте их так, чтобы вы работали с нижними байтами, а затем с более поздними байтами второго порядка и так далее. Правильно соединяясь, выполняйте один этап в следующем.

Не знаете, почему возникла проблема в поиске решений. Математика математики класса охватывает основы подсчета и добавления и переноса в следующий столбец, затем вы берете это в документации набора инструкций, где описывается добавление, и если есть добавление с переносом. Отображение операции добавления изменяет бит переноса, а добавление с переносом использует и изменяет бит переноса.

+0

Большое спасибо за объяснение, я был очень смущен, и я должен теперь понять, как решить мою проблему –

0

Пусть два числа: 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 пары

Смежные вопросы