Assembly LC3代码,存储在堆栈中

Assembly LC3代码,存储在堆栈中,assembly,stack,lc3,Assembly,Stack,Lc3,下面是一段代码,用于将一个数字(或多个数字)存储到堆栈中。R6是堆栈指针。除此之外,我不太明白发生了什么。为什么要将R6存储在R1中,然后清除它?(我相信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 p

下面是一段代码,用于将一个数字(或多个数字)存储到堆栈中。R6是堆栈指针。除此之外,我不太明白发生了什么。为什么要将R6存储在R1中,然后清除它?(我相信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

我不能说我完全理解,到底发生了什么,但我只想写下一些不同的评论:

   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
实际上,这段代码正在创建一个单链表,每个节点中存储两个值。这有点奇怪,因为它的构造方式明确地依赖于内存的顺序性质,因此可以很好地处理数组,而不需要链表

要记住的一件事是,使堆栈成为堆栈的是它运行的操作(即推送和弹出)以及结构本身。这里可能有一个更简单的堆栈示例

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
lear1,栈;R1是下一个空位置
推送:;在R0中获取新值
加上R1,R1,1;增量指针
strr0,R1,1;MEM[R1+1]
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