2013-11-28 2 views
0

Я строю схему процессора с 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 для цикла с моим набором команд?

+1

ли программа счетчик общего реестра в вашей архитектуре процессора? Если это так, вы можете сделать безусловную ветвь, загрузив адрес из памяти в этот регистр. В противном случае вы можете загрузить ноль в резервный регистр и использовать 'BZ'. – Michael

+0

ПК - это еще один регистр. Элемент управления записывается в него, когда программа выполняет BZ (если R0 == 0, он будет помещать адрес внутри ПК). Основная проблема заключается в том, что я хочу зацикливать, если оставшийся счет ** не **, а BZ будет зацикливаться, если это так .. –

+0

Конечно, но если у вас есть способ сделать безусловную ветвь (позволяет «называть ее« B », даже если это может быть комбинация инструкций в вашем случае), вы можете имитировать 'BNZ', используя' BZ skip'/'B loop' /' skip: ' – Michael

ответ

1

Вы можете изменить

BZ R1, (B) 

(B) 

в

BZ R1, (B) 
LD R0, Address  # constant 1 
SUB R0, R0 
BZ R0, (A) 

(B) 
+0

Это довольно элегантный способ сделать это! Я закончил внедрение BNZ вместо BZ: / –

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