为什么我的装配程序将r1设置为正确的值?

时间:2015-04-17 20:12:12

标签: assembly simulator cpu-registers machine-code lc3

我正在LC3机器上写一个装配程序。

我的汇编程序是一个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并继续向R1添加R3并将结果存储到R1,而在这种情况下计数器R3或3大于零。

1 个答案:

答案 0 :(得分:2)

HALT只是用于停止机器的TRAP指令的“伪指令”。

你可以写:

TRAP x25  ;HALT the machine

但是这样你需要记住TRAP向量中的位置,在这种情况下x25。因此,最好只使用HALT

其他常见的TRAP也有pseduo说明:INOUT等。

我想你想把你的结果存储在某个地方。你可以这样做:

;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

<强> --------------------- EDIT ---------------------- ----

关于你的最后一个问题(在评论中):

  

如果HALT停止我的程序,Reslt .FILL x0000指令将如何运行   然后?

这是关于装配工如何运作的更多问题。

答案是因为:汇编时间!= 执行时间

指令在大会时考虑。

事实上,装配时间由两个通道组成:

  1. 解析创建符号表的符号
  2. 使用符号表将指令转换为“真正可执行/机器代码”。
  3. 这是实现汇编程序的一种非常常见的方式,而LC3汇编程序也不例外。