我想与使用循环的汇编程序中的add进行乘法

时间:2019-10-15 18:43:08

标签: assembly

这是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加到以前存储的数字上。

1 个答案:

答案 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 ...)