LC3代码,存储在堆栈中

时间:2016-04-14 01:44:46

标签: assembly stack lc3

下面是一段代码,用于将数字(或多个)存储到堆栈中。 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

1 个答案:

答案 0 :(得分:1)

我不能说我完全理解,发生了什么,只是为了放下一些不同的评论:

   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

这没有边界检查,因此它将很乐意在未分配的内存中运行。