我一直在学习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指令?怎么说?
答案 0 :(得分:0)
.FILL
可以向输出文件中发射任意字节。
从手动编码指令到使用.fill
发出指令与让汇编程序从助记符+操作数对其进行编码之间,机器代码实际上没有区别。有关示例,请参见How to avoid executing variables in lc3 assembly。
当CPU解码/执行机器代码时,它并不关心字节如何到达那里,它只是将它们视为指令。您的反汇编程序也应这样做。
如果遇到的指令字不是有效的LC-3指令,则可以将其反汇编为.fill 0x1234
或类似内容,然后继续执行下一个字。这就是现有的反汇编程序对诸如ARM和x86之类的ISA所做的工作。