如何分辨lc3操作码和lc3处理器指令之间的区别

时间:2018-11-21 18:20:01

标签: assembly disassembly lc3

我一直在学习lc3,而我正在写disassembler。我有一个问题,当阅读汇编的lc3代码时,如何分辨操作码和处理器指令(例如.FILL指令)之间的区别。

现在,LC3指令的宽度为16位。这是一个示例:

0000100000000111

此示例是BR(分支)指令。左边的前4个数字(0000)表示这是BR操作码,而后面的3个数字(100)分别是测试条件(负,零和正),因此100表示​​仅测试负数,110表示测试是否为负或零,等等。如果这三个位均未置位,则实际上这不是BR指令,而是处理器指令。因此,以下内容:

0000000001001001

从左数开始的前4个是0000,因此通常这是BR指令,但是由于未设置Neg,Zero,Pos位,因此它是.FILL处理器指令,表示所有16而是将位计算为一个十六进制数,在这种情况下为0x0049。

现在,这只是16个操作码之一。我也碰巧知道TRAP指令(1111)的操作码具有类似的特殊情况,即,如果设置了相同的三位中的任何一位(在右边加一位),那么它不是TRAP指令。现在,由于操作码0000和操作码1111具有这些特殊情况,因此它们之间的操作码也应具有这样的特殊情况是有意义的。但是我浏览了所有可以找到的文档,而且似乎没有地方提到这些情况(尽管我知道我是对lc3汇编程序生成的.lst文件的了解)。有人知道任何提及此的文档吗?还是有人知道这些“特殊情况”吗?谢谢

编辑: 感谢您的答复,但是我仍然不确定如何分辨指令和数据之间的区别。这是我刚从.lst文件复制的几行内容:

(305A) 0059  0000000001011001 (  45)                 .FILL x0059
(305B) 0000  0000000000000000 (  45)                 .FILL x0000
(305C) FFD0  1111111111010000 (  46) RESET           .FILL xFFD0
(305D) 0045  0000000001000101 (  47) LINE1           .FILL x0045

请注意,如果不是因为没有设置NZP位,那么很容易将前两行和最后几行读为BR指令。第三行和TRAP指令也是如此。那么,这呢:

0101001001100000   ;; or 0x5260

这是AND指令还是.FILL指令?怎么说?

1 个答案:

答案 0 :(得分:0)

.FILL可以向输出文件中发射任意字节。

从手动编码指令到使用.fill发出指令与让汇编程序从助记符+操作数对其进行编码之间,机器代码实际上没有区别。有关示例,请参见How to avoid executing variables in lc3 assembly

当CPU解码/执行机器代码时,它并不关心字节如何到达那里,它只是将它们视为指令。您的反汇编程序也应这样做。

如果遇到的指令字不是有效的LC-3指令,则可以将其反汇编为.fill 0x1234或类似内容,然后继续执行下一个字。这就是现有的反汇编程序对诸如ARM和x86之类的ISA所做的工作。