1

我正在 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 模拟器中运行这个程序时,这就是我得到的输出在此处输入图像描述

R3 最后保持正确的值,但 R1 保持 -1.... 有人看到我的代码有问题吗?我确保在开始时清除 R1,并继续将 R3 添加到 R1 并将结果存储到 R1,而在这种情况下,计数器 R3 或 3 大于零。

4

1 回答 1

2

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

你可以写:

TRAP x25  ;HALT the machine

但是通过这种方式,您需要记住 TRAP 向量中的位置,在这种情况下为x25。所以最好只使用HALT

其他常见的 TRAP 也有伪指令: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

- - - - - - - - - - -编辑 - - - - - - - - - - - - -

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

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

这更多是关于汇编程序如何工作的问题。

答案是因为:组装时间!=执行时间

指令在装配时被考虑。

事实上,Assembly Time 由两遍组成:

  1. 解析符号创建符号表
  2. 使用符号表将指令转换为“真正的可执行/机器代码”。

这是实现汇编器的一种非常常见的方式,LC3 汇编器也不例外。

于 2015-04-18T02:25:50.137 回答