【问题标题】:Why isn't my assembly program setting r1 to the correct value?为什么我的汇编程序没有将 r1 设置为正确的值?
【发布时间】:2015-06-24 20:32:01
【问题描述】:

我正在LC3机器上写一个汇编程序。

我的汇编程序是一个 LC3 程序,它将 R2 和 R3 相乘并将结果存储在 R1 中。

这是我的源代码(带有 cmets)

;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 模拟器中运行这个程序时,这就是我得到的 output

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

【问题讨论】:

  • 我只是运行你的程序,这不是我得到的。你把断点放在哪里了?你应该把它放在 HALT 指令下。否则你的值可能会被 HALT 陷阱覆盖。
  • 另请注意,您没有在循环中的任何地方使用 R2。
  • 断点不只是为了调试吗?为什么要在 HALT 指令处设置断点? HALT 不是已经停止程序了吗?
  • 我修复了我的 R2 以确保我将 R1 + R2 的结果存储在 R1 中。现在好看吗?
  • HALT 不会停止我拥有的模拟器中的 CPU,它实际上是一条伪指令(TRAP HALT)。这是一台学习机器,它不会执行任何实际有用的结果,因此要检查您的程序是否运行良好,您需要在它完成之前停止它或在某处打印结果。

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


【解决方案1】:

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

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

关于你的最后一个问题(以 cmets 为单位):

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

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

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

在汇编时考虑指令。

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

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

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

【讨论】:

  • 不应该存储结果吗? LOOP 添加 R1,R1,R2;将R1和R2相加,并将这些寄存器的数据相加结果存储在R1中?
  • @committedandroider 在循环结束时,R1 得到结果。但是......当你停止机器时,你正在调用一个“特殊例程”,其中再次使用寄存器以便更改它们的内容。
  • 我应该调用什么而不是更改内容?只是 .END 而不是 HALT?
  • 为什么调用 Result .FILL x0000 ?你不是已经调用了ST R1,Result 将寄存器存储在R1 中吗?
  • @committedandroider HALT 后,没有指令。您的程序在 HALT 处停止,这就是您需要 HALT 的原因。 Result .FILL x0000 只是一个指令,让汇编器保留一些稍后将在执行时使用的空间,如果您愿意,可以将 Result 视为变量。所以...ST R1, Result 将结果存储在变量Result 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多