下面是一段代码,用于将数字(或多个)存储到堆栈中。 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
答案 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
这没有边界检查,因此它将很乐意在未分配的内存中运行。