Assembly 8080组装说明

Assembly 8080组装说明,assembly,disassembly,intel-8080,Assembly,Disassembly,Intel 8080,我正在为8080组装做一个拆卸器。如果我错了,请纠正我: 我所要做的就是逐字节读取二进制数据,将每个字节转换成一个命令。 或者是否存在会增加命令长度的条件(二进制)。为什么有dos标记?你是说8088而不是8080 在任何一种情况下都不能,绝对不能,你不能一次只线性移动一个字节。这两个指令集都是可变长度指令。您必须查看它们如何引导、向量表或条目地址,然后必须遵循可能的执行路径 从重置入口点开始线性分解,直到到达一个有条件或无条件的分支,这为您提供了另外两个入口点来进行线性分解。一个无条件的分支结

我正在为8080组装做一个拆卸器。如果我错了,请纠正我: 我所要做的就是逐字节读取二进制数据,将每个字节转换成一个命令。
或者是否存在会增加命令长度的条件(二进制)。

为什么有dos标记?你是说8088而不是8080

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

从重置入口点开始线性分解,直到到达一个有条件或无条件的分支,这为您提供了另外两个入口点来进行线性分解。一个无条件的分支结束一段的分解


您应该跟踪哪些字节是操作码,哪些字节是这些操作码的附加数据。如果你有字节i,k,l,m和i,k和l是操作码,或者说指令的第一个字节,j和m是第二个字节。如果你在其他地方找到了一个指向k字节所在地址的分支,那没关系,但是如果你找到了指向j字节所在地址的分支,那要么是个聪明的黑客,要么就是你有问题。如果这个问题是为了防止拆卸,我们也不会感到惊讶。编译器生成的代码通常不会有这个问题,但是手工汇编(机器代码)可能(在意外情况下)并且越往回走,就越有可能遇到手工编码的汇编/机器代码。

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

  • 1字节指令:例如,
    XRA A
  • 1字节指令后跟1字节数据:例如,
    MVIA,0
  • 1字节指令后跟2字节数据:例如,
    lxib,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。接着是一条
    lxib
    指令,将寄存器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反汇编的部分乐趣在于发现这些技巧

    这里也有操作数(如内存地址或立即数)。操作码是1字节,但如果需要额外的操作数,整个指令可能会超过1字节。无论如何,您都需要一个指令集引用,所以为什么不看看呢?