【问题标题】:Recursive programming with Stack in ASM and LC3在 ASM 和 LC3 中使用堆栈进行递归编程
【发布时间】: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


【解决方案1】:

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

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

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

其他cmets:

  • 您通常有一个正确的想法,即您需要保存和恢复一些寄存器,包括 r7(返回地址寄存器),并且此保存/恢复需要在堆栈上进行,因为这是一个递归例程。

  • 您将 n 和 m 分别保存在 r2 和 r3 中,但以后不要使用它们(例如,在调用后保存它们很重要),所以这是不必要的。

    李>
  • 调用后您的代码使用 R1 进行计算,但这是一个未知值,因为它是一个参数寄存器。

  • BASECASE1 没有按照 C 代码所说的去做(它应该返回 m)

【讨论】:

  • 我有一个主要的,我只是没有包括它,但我的主要是:LD R6 STACK;将堆栈的地址加载到 R6 LD R0 FACT1 ; (n) 将变量 FACT1 (3) 加载到 R0 LD R1 FACT2 中; (m) 将变量 FACT1 (3) 加载到 R1 JSR MULT 中;调用MULT函数HALT
  • 另外,我将如何在寄存器中返回该值,我是否使用 ADD?
  • 是的,您可以添加零以将寄存器值从一个复制到另一个。要返回 m,请将 r1 移动(使用 add)到 r0。顺便说一句,你用的是什么模拟器?我喜欢在线的wchargin.github.io/lc3web/#,但它需要在数字前加#。
  • 它是从一个文件中下载的,它是一个保存到计算机上的实际 LC3 应用程序,我真的不太了解。但是感谢您对返回寄存器的帮助。
  • 我想我在 ASM 中使用两个参数递归时遇到了问题,我现在有:` ADD R3 R1 -1 ;保存从 R1 到 R3 的 m 减法 BRz BASECASE2 ; else if (m == 1) OR if (m - 1) == 0 return n ;递归案例开始 ADD R4 R0 R1 ;将 n+m 存储在 R4 ADD R0 R0 -1 中; mult (n-1, ADD R1 R1 -1 ; m-1) ADD R4 R4 -1 ;从 n + m 中减去 1 并存储在 R4 JSR MULT 中;否则返回 mult(n-1, m-1) + n+m-1;添加 R5 R4 R1 ;加 R0 R5 0 ; 0 是 R0`
猜你喜欢
  • 2014-02-26
  • 2019-05-05
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2018-10-03
  • 2023-04-11
  • 1970-01-01
相关资源
最近更新 更多