2016-04-14 13 views
0

以下は、1桁(または複数)をスタックに格納するコードです。 R6はスタックポインタです。それ以外に、私は何が起きているのかよく分かりません。 R1にR6を保存してから、それをクリアするのはなぜですか? (私はR1とR1がR1をクリアすると信じています) LC3の初心者です。 ありがとうございました!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

私は何が起こっている、私は完全に理解して言うことはできませんが、ただ、いくつかの異なった意見を下に置くために:

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 

実際、このコードは、各ノードに2つの値が格納された単一リンクリストを作成しています。ちょっと変わったのは、メモリのシーケンシャルな性質に明示的に依存する方法で構築されているため、配列でうまく動作し、リンクされたリストを必要としないからです。

スタックをスタックにするのは、構造自体が実行する操作(プッシュとポップ)であることに留意してください。これはおそらくもっと簡単なスタックの例です

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 

これは境界チェックを行わないため、割り当てられていないメモリ上でうまく動作します。

関連する問題