所以我刚开始组装,我也不太擅长递归,这是我到目前为止拥有的代码,它应该从:
int mult(int n, int m) {
if (n == 1)
return m;
else if (m == 1)
return n;
else
return mult(n-1,m-1)+n+m-1;
} 但出于某种原因,我也应该将结果存储在变量产品中,但我很难想出如何做到这一点,我尝试了注释代码,但我和我都知道,我需要帮助翻译基本案例,并确定它们是否返回正确的东西/值。
; main - going to calculate the product of two nonnegative numbers.
PRODUCT .Fill 0
; input in R0 and R1
; output in R0
MULT
ADD R6 R6 -1 ; Pushed it (closer to zero)
STR R1 R6 0 ; storing register on stack
ADD R6 R6 -1
STR R2 R6 0
ADD R6 R6 -1
STR R3 R6 0
ADD R6 R6 -1
STR R4 R6 0
ADD R6 R6 -1
STR R5 R6 0
ADD R6 R6 -1
STR R7 R6 0
ADD R2 R0 -1 ; Saves the subtraction of n from R0 to R2
BRz BASECASE1 ; if (n == 1) return m
ADD R3 R1 -1 ; Saves the subtraction of m from R1 to R3
BRz BASECASE2 ; else if (m == 1) OR if (m - 1) == 0 return n
; recursive case begins
ADD R2 R0 0 ; copy n into R2
ADD R3 R1 0 ; copy m into R3
ADD R0 R0 -1 ; mult (n-1,
ADD R1 R1 -1 ; m-1)
ADD R4 R2 R3 ; storing n+m in R4
ADD R4 R4 -1 ; subtracting 1 form n + m and storing in R4
JSR MULT ; else return mult(n-1, m-1) + n+m-1;
ADD R5 R4 R1
ADD R0 R5 R0
;ST R0, PRODUCT
BASECASE1
LDR R7 R6 0 ; Restoring registers
ADD R6 R6 1
LDR R5 R6 0
ADD R6 R6 1
LDR R4 R6 0
ADD R6 R6 1
LDR R3 R6 0
ADD R6 R6 1
LDR R2 R6 0
ADD R6 R6 1
LDR R1 R6 0
ADD R6 R6 1
RET ; returns m
BASECASE2
LDR R7 R6 0
ADD R6 R6 1
LDR R5 R6 0
ADD R6 R6 1
LDR R4 R6 0
ADD R6 R6 1
LDR R3 R6 0
ADD R6 R6 1
LDR R2 R6 0
ADD R6 R6 1
LDR R1 R6 0
ADD R6 R6 1
RET ; returns n
.END发布于 2019-11-12 21:17:57
您正在显示main概念的注释,但它不包括任何调用函数的代码。
您需要一个main,它将参数加载到r0和r1中(值要乘以),然后用JSR调用JSR;调用之后,main应该将r0存储在产品中,然后使用HALT停止程序。
变量产品应该出现在主代码之后,这取决于您使用的模拟器,因为一些模拟器将执行他们找到的第一件事情(因此应该是主代码)。
其他评论:
unnecessary.
https://stackoverflow.com/questions/58825708
复制相似问题