Я строю схему процессора с Logisim. Мой процессор имеет только 2 регистра общего назначения и 16-байтовую ОЗУ. Я закодирован следующий набор команд (Rxy означает одно из двух регистров)Умножение с использованием добавления и ограниченного набора инструкций
• ADD Rxy, Rxy (add Rxy and Rxy and store result inside the first register)
• SUB Rxy, Rxy (same but with sub)
• ST Rxy, Address (save value of Rxy into RAM address)
• LD Rxy, Address (load into Rxy value at RAM address)
• BZ Rxy, Address (branch to address if value of Rxy is zero)
Я думал, что я мог бы использовать уменьшаю второе слагаемого, пока она не достигнет 0, и на каждый шаге, добавьте первое слагаемое к себе.
For example, 5*3 = 5+5+5 ; 3-1-1-1
Но я не уверен, что моя команда может разрешить эту программу ... У меня есть только ветвь, если Rxy равно 0, в то время как я хотел бы расшириться, если не равен 0.
Моя программа в настоящее время выглядит следующим образом:
Пусть R1 поджат со вторыми слагаемыми (итерация осталось COUNT)
(A) LD R0, Address # constant 1
SUB R1, R0 # decrement iteration left
ST R1, Address # save iteration count in memory
LD R0, Address # Load first addend
LD R1, Address # load current total
ADD R0, R1 # do addition
ST R0, Address # save new current total
BZ R1, (B) # if iteration is 0, then display and end, else add
(B)
STOP
есть ли ва y для цикла с моим набором команд?
ли программа счетчик общего реестра в вашей архитектуре процессора? Если это так, вы можете сделать безусловную ветвь, загрузив адрес из памяти в этот регистр. В противном случае вы можете загрузить ноль в резервный регистр и использовать 'BZ'. – Michael
ПК - это еще один регистр. Элемент управления записывается в него, когда программа выполняет BZ (если R0 == 0, он будет помещать адрес внутри ПК). Основная проблема заключается в том, что я хочу зацикливать, если оставшийся счет ** не **, а BZ будет зацикливаться, если это так .. –
Конечно, но если у вас есть способ сделать безусловную ветвь (позволяет «называть ее« B », даже если это может быть комбинация инструкций в вашем случае), вы можете имитировать 'BNZ', используя' BZ skip'/'B loop' /' skip: ' – Michael