【问题标题】:LC3 Code, storing in the stackLC3 代码,存储在堆栈中
【发布时间】:2016-04-14 01:44:46
【问题描述】:

下面是一段代码,它应该将一个数字(或多个)存储到堆栈中。 R6 是堆栈指针。除此之外,我不太明白发生了什么。为什么要将 R6 存​​储在 R1 中,然后清除它? (我相信 AND R1,R1,0 清除 R1) LC3的新手,所以只是在寻找澄清。 提前谢谢你!

    ; storing in the stack
   STR R1, R6, 0   ;store num in first space
   AND R1, R1, 0 
   STR R3, R6, 1 ; store operator in 2nd place
   ADD R6, R6, 3 ; increment the stack
   STR R6, R6, -1 ; and provide a link to it in slot 3

   JSR INPUT ; back to input

【问题讨论】:

    标签: assembly stack lc3


    【解决方案1】:

    我不能说我完全理解,这是怎么回事,只是把一些不同的 cmets 放下:

       STR R1, R6, 0   ; MEM[R6] <- R1
       AND R1, R1, 0   ; R1 <- 0
       STR R3, R6, 1   ; MEM[R6+1] <- R3
       ADD R6, R6, 3   ; R6 <- R6 + 3
       STR R6, R6, -1  ; MEM[R6-1] <- R6
    

    这意味着你的记忆现在看起来像:

    0: original contents of R1
    1: original contents of R3
    2: address of memory slot 3
    3: empty, now pointed to by R6
    

    实际上,这段代码创建了一个单链表,每个节点中存储了两个值。这有点奇怪,因为它的构造方式显式依赖于内存的顺序性质,因此可以很好地处理数组,不需要链表。

    要记住的一点是,使堆栈成为堆栈的原因在于它运行的操作(即推送和弹出)与结构本身一样多。这可能是一个更简单的堆栈示例

    LEA R1, STACK  ; R1 is the next empty location
    
    PUSH:          ; Takes new value in R0
    ADD R1, R1, 1  ; Increment pointer
    STR R0, R1, 1  ; MEM[R1+1]<-R0
    RET
    
    PULL:          ; Returns new value in R0
    LDR R0, R1, -1 ; R0<-MEM[R1-1]
    ADD R1, R1, -1 ; Decrement pointer
    RET
    

    这不会进行边界检查,因此它会很高兴地在未分配的内存中运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-06
      • 2020-04-07
      • 2019-09-12
      • 2016-03-05
      • 2015-03-13
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      相关资源
      最近更新 更多