【发布时间】:2020-03-08 13:51:59
【问题描述】:
所以我是汇编新手,而且我也不太擅长递归,这是我目前拥有的代码,它应该翻译自:
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;
}
但由于某种原因,我处于无限循环中,我还想将结果存储在变量 PRODUCT 中,但我很难弄清楚如何做到这一点,我已经尝试在注释代码中但是我和我知道我需要帮助翻译基本案例并确定它们是否返回了正确的事物/值。
; 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
【问题讨论】:
-
我的主要内容:
LD R6 STACK ; Loading the address of the stack into R6 LD R0 FACT1 ; (n) Loading the variable FACT1 (3) into R0 LD R1 FACT2 ; (m) Loading the variable FACT1 (3) into R1 JSR MULT ; Calling the MULT function HALT
标签: recursion assembly stack multiplication lc3