我正在为8080组装做一个反汇编。如果我错了,请纠正我: 我所要做的就是逐字节读取二进制文件,将每个字节转换为命令。 或者是否有条件会增加命令的长度(在二进制文件中)。
答案 0 :(得分:3)
为什么你有dos标签?你的意思是8088而不是8080?
在任何一种情况下都没有,绝对不是你不能一次只能线性地移动一个字节。这两个指令集都是可变长度指令。您必须查看它们如何引导,向量表或入口地址,然后您必须遵循可能的执行路径。
从重置入口点线性反汇编,直到达到有条件或无条件的分支,这为您提供了两个线性反汇编的入口点。无条件分支结束了一个部分的反汇编。
您应该跟踪哪些字节是操作码,哪些字节是这些操作码的附加数据。如果你有字节i j k l m和i,k和l是操作码,或者说是指令的第一个字节,j和m是次要字节。然后,如果在其他地方你找到了k字节所在地址的分支,那就没关系,但是如果你找到一个分支到j生存的那个聪明的黑客,或者你有问题。如果这个问题是故意阻止拆卸,那么不时会感到惊讶。编译器生成的代码通常不会出现这个问题,但手工装配(机器代码)可能(对于非预期的情况)以及更进一步的时间,你更喜欢在手工编码的汇编/机器代码上运行。
答案 1 :(得分:1)
与8086相比,8080的指令集在指令长度方面非常简单。只有三种情况:
XRA A
。MVI A,0
。LXI B,0
。这使得反汇编程序变得非常简单。事实上,这就是我通常学习8080汇编语言的方法:通过在我的计算机上拆解内置的Basic解释器(使用用Basic编写的反汇编程序,使用大量PEEK命令)并使用知识构建BIOS以便能够安装CP / M.
dwelch是正确的,代码可以跳转到指令的中间。 Microsoft Basic解释器使用了这个技巧,如下所示:
01 2E 00
01 2E 01
01 2E 02
... code using the value of L
在此序列中调用字节偏移量01将执行2E 00
,即MVI L,0
,它将寄存器L设置为零。然后遵循两个LXI B
指令,将寄存器BC设置为012E和022E,这是没有意义的(并忽略该值)。
在此序列中调用字节偏移量04将执行2E 01
,即MVI L,1
,它将寄存器L设置为1.然后执行一条LXI B
指令,将寄存器BC设置为022E,这是没有意义的(并且忽略了这个值)。
在此序列中调用字节偏移量07将执行2E 02
,即MVI L,2
,将寄存器L设置为2.
底线是在偏移09处,如果调用偏移量01,我们最终得到L = 0,如果调用偏移04则L = 1,或者如果调用偏移量07则L = 2。每个调用只需要3个字节(CD xxx xx
),设置这些不同L值的开销只有9个字节。
如果没有这个聪明,就必须使用15个字节,设置L(2个字节)并跳转到使用L(3个字节)的任何例程的开始,否则必须设置L通过调用者,意味着对例程的每次调用都需要5个字节(2个用于设置L,3个用于调用)而不是3个。
8080反汇编的部分乐趣就是发现这些技巧!