8080装配澄清

时间:2016-05-14 12:38:24

标签: assembly disassembly intel-8080

我正在为8080组装做一个反汇编。如果我错了,请纠正我: 我所要做的就是逐字节读取二进制文件,将每个字节转换为命令。 或者是否有条件会增加命令的长度(在二进制文件中)。

2 个答案:

答案 0 :(得分:3)

为什么你有dos标签?你的意思是8088而不是8080?

在任何一种情况下都没有,绝对不是你不能一次只能线性地移动一个字节。这两个指令集都是可变长度指令。您必须查看它们如何引导,向量表或入口地址,然后您必须遵循可能的执行路径。

从重置入口点线性反汇编,直到达到有条件或无条件的分支,这为您提供了两个线性反汇编的入口点。无条件分支结束了一个部分的反汇编。

您应该跟踪哪些字节是操作码,哪些字节是这些操作码的附加数据。如果你有字节i j k l m和i,k和l是操作码,或者说是指令的第一个字节,j和m是次要字节。然后,如果在其他地方你找到了k字节所在地址的分支,那就没关系,但是如果你找到一个分支到j生存的那个聪明的黑客,或者你有问题。如果这个问题是故意阻止拆卸,那么不时会感到惊讶。编译器生成的代码通常不会出现这个问题,但手工装配(机器代码)可能(对于非预期的情况)以及更进一步的时间,你更喜欢在手工编码的汇编/机器代码上运行。

答案 1 :(得分:1)

与8086相比,8080的指令集在指令长度方面非常简单。只有三种情况:

  1. 1字节指令:例如,XRA A
  2. 1字节指令后跟1字节数据:例如,MVI A,0
  3. 1字节指令后跟2个字节的数据:例如,LXI B,0
  4. 这使得反汇编程序变得非常简单。事实上,这就是我通常学习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反汇编的部分乐趣就是发现这些技巧!