gpt4 book ai didi

assembly - x86 程序集 : How do Disassemblers know how to break up instructions?

转载 作者:行者123 更新时间:2023-12-04 23:31:51 25 4
gpt4 key购买 nike

x86 反汇编器如何知道在哪里分解指令?

我在看 8088指令系统。例如,移动指令有 7 种变化,范围从 2 到 4 个字节。指令本身似乎没有遵循特定的顺序。 Why is x86 ugly?的另一个原因.

例如:

                        76543210  76543210  76543210  76543210
reg/mem to/from reg 100010dw ||regr/m
imm to reg/mem 1100011w ||000r/m dat dat w=1
imm to reg 1011wreg data dat w=1
imm to accum 1010000w addr-low addrhigh
accum to mem 1010001w addr-low addrhigh
reg/mem to seg 10001100 ||0ssr/m
seg to reg/mem 10001100 ||0ssr/m

Legend:
||=mod {NO-DISP=0,DISP-LOW,DISP-HIGH,REG}
ss=seg enum{es=0,cs,ss,ds}
reg=enum{ax=0,bx,cd,dx,bx,sp,bp,si,di (if w=1)} enum{al,bl...} (if w=0)
r/m=reg or mem (mod=3 then REG, else mem)

许多指令可以在第一个字节中重叠:
                        76543210  76543210  76543210  76543210
push 11111111 ||110r/m
inc 1111111w ||000r/m

位掩码似乎具有任意分配。反汇编器如何分解指令?

这个问题是 How to write a disassembler.的一个子集

最佳答案

查看我的 8086/8088 用户手册程序员引用 (ISBN 1-55512-010-5),可能已经绝版了几十年……附录 A 显示了按操作码顺序 0b00000000 到 0b11111111 的指令解码。看起来一点都不困惑。 add、sub、and、xor、cmp 等都以这样的方式分组,即多路复用器可以直接使用操作码位来路由输入和输出,而其他位选择 alu 对这些位执行的操作。

编写反汇编程序时,您希望使用这种表格或操作码表来对指令进行顶级排序。

在您的特定示例中,请注意每当您看到第一个操作码为 0xFF 时,第二个字节中间的三个位会告诉您故事的其余部分是哪条指令。所有这 8 种组合(一种是未定义的)都可以从这 3 位中表示并轻松解码。

是的,x86 指令集很疯狂。有趣和有趣的功能,但后来发明了更好的指令集。例如,x86 没有像 6502 那样走的唯一原因是动力,而不是质量。

你也应该看看这个:

How are hex sequence translated to assembly without ambiguity?

如何反汇编这个和任何其他可变字长指令集是按执行顺序进行的。如果您尝试按地址顺序线性地执行此操作,则会失败。从向量表开始获取入口地址,然后按照地址顺序遵循这些指令,记下并遵循所有分支,直到遇到无条件分支或返回或其他终止该指令串的指令。对每个分支目标重复此操作。这不会涵盖所有可能的指令,因为代码可能会在执行时计算地址(对于反汇编你无能为力)。

如果此代码中的任何一个是有意或无意地手写以绊倒反汇编程序,您可能会发生冲突,其中基于一个执行路径的一个操作码的第二个或第三个字节似乎是基于不同执行的指令的第一个操作码小路。例如,清除标志指令后跟条件分支(如果标志清除),接着是一个字节的数据,然后是作为分支目的地的实际指令。是的,我遇到过这个。它应该被您的反汇编程序捕获,您需要检查以在它们发生冲突时停止反汇编其中一个或两个执行路径。对于完整的反汇编,期望必须支持某种用户输入以将地址排除为操作码,以及让用户手动添加有效的操作码以便您遵循执行路径。

对于固定长度的指令集,您可以轻松地按地址或执行顺序进行反汇编,您的选择,从0到内存末尾的地址顺序当然是最简单的。不要在未定义的指令上出错,只需将它们标记为这样并继续前进,其中一些是数据。

x86 绝对是我尝试反汇编的最后一个可变长度指令集,并且我已经编写了许多反汇编程序。不想尝试那个项目。从一些固定长度的开始,比如图片和 ARM /拇指。尝试可变字长的 msp430,然后是 6502(小行星、小行星豪华版、月球着陆器等)。也许一两个星期的晚上来涵盖上述内容并获得感觉,然后如果愿望仍然存在,则攻击 x86。如果您将自己严格限制在 8088/8086 上,那还不错,需要确保您的工具正在生成这些指令,而不是进入 386 上的指令。

如果 push vs inc 困扰您,请务必先尝试其他类似 msp430 的东西。

关于assembly - x86 程序集 : How do Disassemblers know how to break up instructions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3983735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com