assembly 需要帮助解释LC3的机器语言指令的第1、3和7行

vojdkbi0  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(259)

以下是我目前所做的工作。

.ORIG x30F6
LEA R1, 
ADD R2, R1, #14
ST R2, 
AND R2, R2, #0
ADD R2, R2, #5
STR R2, R1, #14
LDI R3, 
.END

我希望有人能完成问题中提到的三行中的一行,并展示将二进制指令翻译为LC3所采取的步骤。我正在学习的在线课程的大学教授只复习了ADD,而且,而不是。我试着在这个任务中使用其他操作码的原则,但是不能让代码组装。只有问题中提到的三行给我带来了麻烦。他上传了这个任务,但没有检查其他操作码。也不会回复我的电子邮件。

eoigrqb6

eoigrqb61#

您引用的指令都将pc相对立即数作为最终汇编操作数。
LC3 instruction set manual定义LEA,例如,在第534页的附录A中,如下所示:

+--------+------+------------------+
|   op   |  dr  |    PCOffset9     |
+--------+------+------------------+

DR = PC + 1 + SEXT(PCoffset9);

因此,对于第一个,您应该能够看到立即数具有值

111111101

二进制,尽管我们需要指出这个PCOffset9是一个有符号的字段-一个有符号的字段,它的符号位被设置,意味着它是负的。因此,这个立即数的十进制值是-3-并且通过.ORIGPC0x30F6对于那个指令,所以PC + 1x30F7,而x30F7-3x30F4,这与注解相匹配。
如何在汇编程序中编写该值在某种程度上取决于汇编程序将采用什么。
在正常的LC-3汇编用法中,您将为该操作数放置一个标签名称而不是一个常量,汇编程序将计算出要放入该立即数字段的立即数(通过从标签名称的地址中减去指令的PC-1,这两者都是汇编时常量)。
但在这种情况下,一个简单的常量(如#-3)应该可以正常工作(除非汇编程序不接受它)。

.ORIG x30F6
LEA R1, #-3
ADD R2, R1, #14
.END

使用此模拟器:https://wchargin.com/lc3web/
对于您的模拟器,您可以在x30 f4处放置一个命名标签,并在LEA中使用该标签名称。不幸的是,x30 f4在x30 f6之前,因此您必须将.ORIG备份2个值,如果您这样做,您的模拟器将假定此内存(用作数据)是代码的第一行......因此,我可能会建议:

.ORIG x30F3
ENTRY BR START
DATA1 .FILL #0
DATA2 .FILL #0
START LEA R1, DATA1
.END

这上面说(1)入口点位于x30 f3,但它所做的只是跳过(2)数据定位在x30f4&x30f5,如此类推(通过无条件分支)到(3)位置x30 f6。真实的的第一行在x30 f6处使用DATA 1的标签执行莱亚,您可以看到指令的十六进制值为xE 3FD,如代码表中所示,并且,它被反汇编为LEA R1, DATA1
使用这个功能不太强大的模拟器完成的工作量远远超出了组装入门课程的教学范围,因此我代表您的课程和教师向您道歉。
使用一个更好的模拟器可以解决这个问题,所以你可以简单地说LEA R1, #-3
作为一种选择,如果坚持使用有限的模拟器,一个简单的重新安排,选择将数据放在 * 代码 * 之后 * 而不是之前 *,会使这个过程更简单,更直接:

.ORIG x30F6
START LEA R1, DATA1
; ...
DATA1 .FILL #0
.END

相关问题