这是ZEP2(用于教学的简单ISA)的代码。
##
begin load R1, 0
load R2, 7
loop add R1, y
dec R2
store R1, (0x0010)
cmp R2, 0
jeq stop
jmp loop
stop halt
y dat 16
##
到目前为止,这是我的代码。我想将7乘以16。
我需要在寄存器中加载0,然后需要x = 7和y =16。然后将y加到0并从x中分散1,直到x的值为0,R1的值为112。因此,此循环必须运行7次,并且每次将16加到以前存储的数字上。
答案 0 :(得分:1)
您想不使用MUL指令进行乘法。
您需要三个变量,一个累加器,一个乘数和一个被乘数。后两个变量之一将递减为零,而另一个保持不变,并将反复累加到累加器中。
您希望C等于:
int m1 = 7;
int m2 = 16;
int acc = 0;
while ( m1 > 0 ) {
acc += m2;
m1--;
}
在ZEP2中,这三个变量之一需要存储在内存中,因为这台机器只有2个寄存器。
您的想法有点正确,但是混淆了这三个变量。
我建议对累加器使用R1(答案),对m1使用R2(从7开始),对乘法器(m2,设置为16)使用内存0x010(根据您的选择)。>
这意味着
例如,acc += m2;
转换为add R1, (0x010)
,并且
m1--;
转换为dec R2
。
cmp
看起来像cmp R2, 0
;但是,请注意,dec
设置了条件代码,因此我们不需要将其与零进行比较即可使用条件分支。
要使用x dat 7
,请在循环之前将m1 = 7;
更改为m1 = x;
(C代码),这将是load r1, (x)
指令,其()为我相信得到x的值而不是x的地址。
与y dat 16
相似,将m2 = 16;
更改为m2 = y;
-但由于m2
已被保存在内存中,我们需要使用两条指令将其移至其中:一条加载放入一个寄存器中,然后将其存储到0x0010中,如下所示:load r2, (y); store r2, (0x0010)
。 (在这里,我们将R2用作短暂的临时地址,因此请在int acc = 0;
之前使用R2,因为它也使用R2 ...)