首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASM和LC3中栈的递归编程

ASM和LC3中栈的递归编程
EN

Stack Overflow用户
提问于 2019-11-12 19:49:22
回答 1查看 1.2K关注 0票数 0

所以我刚开始组装,我也不太擅长递归,这是我到目前为止拥有的代码,它应该从:

代码语言:javascript
复制
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;
} 

但出于某种原因,我也应该将结果存储在变量产品中,但我很难想出如何做到这一点,我尝试了注释代码,但我和我都知道,我需要帮助翻译基本案例,并确定它们是否返回正确的东西/值。

代码语言:javascript
复制
    ; 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
EN

回答 1

Stack Overflow用户

发布于 2019-11-12 21:17:57

您正在显示main概念的注释,但它不包括任何调用函数的代码。

您需要一个main,它将参数加载到r0和r1中(值要乘以),然后用JSR调用JSR;调用之后,main应该将r0存储在产品中,然后使用HALT停止程序。

变量产品应该出现在主代码之后,这取决于您使用的模拟器,因为一些模拟器将执行他们找到的第一件事情(因此应该是主代码)。

其他评论:

unnecessary.

  • Your

  • 您通常有一个正确的想法,您需要保存和恢复一些寄存器,包括r7 (返回地址寄存器),并且这种保存/恢复需要发生在堆栈上,因为这是一个递归例程。在r2和r3中分别保留n和m的

  • ,但以后不要使用它们(例如在调用之后保存它们很重要),所以这是调用使用R1进行计算之后的

  • 代码,但这是一个未知的值,因为它是一个参数,所以register.

  • BASECASE1不执行C代码说的(它应该返回m)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58825708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档