2015-04-17 49 views
1

我寫了LC3機器上的彙編程序。爲什麼不是我的彙編程序設置R1爲正確的值?

我的裝配程序是一個程序LC3倍增R2和R3,並將結果存儲在R1。

這是我的源代碼(帶註釋)

;Sets pc to this address at start of program 
.ORIG x3000 
;R1 will store the result lets clear it(ANd with 0) 
AND R1,R1,x0 
;R2 will be multiplied by R3, let's clear both of them 
AND R2,R2,x0 
AND R3,R3,x0 
;Test case 4 * 3 = 12; 
ADD R2,R2,4 
ADD R3,R3,3 
;Add to increment zone 
LOOP Add R1,R1,R2; 
;Decrement the counter, in this case the 3 or R3 
ADD R3,R3,x-1 
BrP LOOP 
HALT 
.END 

我的測試用例乘以4 * 3的結果應該是12和應當被存儲在R1。然而,當我在我的LC3模擬器中運行此程序,這是我得到的輸出enter image description here

R3保留在最後的正確值,但R1保留-1 ....有沒有人看到我的代碼問題?我確信在開始清除R1並繼續增加對R3 R1和存儲結果到R1,而計數器,R3,或在這種情況下,3是大於零。

+0

我只是運行你的程序,這不是我得到的。你把你的斷點放在哪裏?你應該把它放在HALT指令中。否則,您的值可能會被HALT陷阱覆蓋。 – m0skit0

+0

還要注意,你在循環中的任何地方都沒有使用R2。 – m0skit0

+0

是不是隻用於調試的斷點?爲什麼在HALT指令中放置一個斷點? HALT是否已經停止了該程序? – committedandroider

回答

2

HALT只是一個「僞指令」爲用於暫停機器TRAP指令。

你可以寫:

TRAP x25 ;HALT the machine 

但這種方式,你需要記住的陷阱向量的位置,在這種情況下x25。所以最好僅使用HALT

其他一些常見的陷阱也有pseduo的指令:INOUT

要存儲你的結果某處我asume。你可以這樣做:

;Sets pc to this address at start of program 
.ORIG x3000 
;R1 will store the result lets clear it(ANd with 0) 
AND R1,R1,x0 
;R2 will be multiplied by R3, let's clear both of them 
AND R2,R2,x0 
AND R3,R3,x0 
;Test case 4 * 3 = 12; 
ADD R2,R2,4 
ADD R3,R3,3 
;Add to increment zone 
LOOP Add R1,R1,R2; 
;Decrement the counter, in this case the 3 or R3 
ADD R3,R3,x-1 
BrP LOOP 
ST R1, Result   ;STORE R1 at Result 
HALT 
Result .FILL x0000 ;this will be x000C=12h after execution 
.END 

---------------------編輯-------------- ------------

關於你的最後一個問題(在評論):

如果HALT停止我的程序,如何將Reslt .fill僞X0000指令運行 呢?

這更是一個關於裝配是如何工作的問題。

答案是因爲:大會時間 = 執行時間

指令在大會時間考慮。

事實上,組裝時間由兩關:

  1. 解析符號創建一個符號表
  2. 轉換指令「真正可執行/機器代碼」使用符號表。

這是實現彙編程序的一種非常常見的方式,LC3彙編程序也不例外。

+0

不應該存儲結果? LOOP添加R1,R1,R2; 添加R1和R2並將這些寄存器的數據添加到R1中的結果? – committedandroider

+0

@committedandroider在你的LOOP結束時,R1有結果。但是,當你暫停機器時,你正在調用一個「特殊程序」,在這裏再次使用寄存器,以便改變它們的內容。 – JosEduSol

+0

我應該怎樣稱呼而不是更改內容?只是.END而不是HALT? – committedandroider

相關問題