gpt4 book ai didi

assembly - 在机器代码中引用寄存器

转载 作者:行者123 更新时间:2023-12-02 08:03:37 25 4
gpt4 key购买 nike

我正在查看一些汇编代码和相应的内存转储,但我无法理解发生了什么。我正在使用this as reference for opcodes for x86this as reference for registers in x86 。当我遇到这些命令时,我意识到我仍然遗漏了一大块拼图。

8B 45 F8       - mov eax,[ebp-08] 
8B 80 78040000 - mov eax,[eax+00000478]
8B 00 - mov eax,[eax]

基本上我不明白操作码后面的两个字节是什么意思,而且我找不到任何提供命令的逐位格式的地方(如果有人可以指出我)非常感谢)。

CPU 如何知道每个命令的长度?

根据我的引用,这个 8B mov 命令允许使用 32b 或 16b 寄存器,这意味着有 16 个可能的寄存器(AX、CX、DX、BX、SP、BP、SI、DI 及其扩展等效项)。这意味着您需要一个完整的字节来指定每个操作数中使用哪个寄存器。

到目前为止还好,操作码后面的两个字节可以指定要使用哪些寄存器。然后我注意到这些命令在内存中逐字节堆叠,并且所有三个命令都使用不同数量的字节来指定取消引用第二个操作数时要使用的偏移量。

我想你可以将寄存器限制为只能将 16b 与 16b 一起使用,以及将 32b 与 32b 一起使用,但这只会释放一个位,不足以告诉 CPU 偏移量有多少字节。

哪些值对应哪些寄存器?

困扰我的第二件事是,虽然我的引用文献明确对寄存器进行了编号,但我没有看到与这些命令中操作码后面的字节有任何相关性。这些命令似乎甚至与它们本身也不一致。第二个和第三个命令都是从 eax 到 eax,但第一个字节的中间有一点不同。

根据我的引用,我假设 0 是 EAX,1 是 ECX,2 是 EDX,依此类推。然而,这并没有让我深入了解如何在 RAX、EAX、AX、AL 和 AH 之间指定。有些命令似乎只接受 8b 寄存器,而其他命令则接受 16b 或 32b,而在 x86_64 上,有些命令似乎接受 16b、32b 或 64b 寄存器。那么你会做类似 0-7 是 R、8-15 是 E、16-23 非扩展、24-31 是 H 和 L 的事情吗?即使是类似的东西,看起来应该更容易找到手册或指定的东西。

最佳答案

操作码后的第一个字节是 ModR/M 字节。您链接的第一个引用包含页面末尾的 ModR/M 字节的表格。对于诸如此类的存储器访问指令,ModR/M 字节指示正在加载或存储的寄存器以及用于存储器访问的寻址模式。

ModR/M 字节后面的字节取决于 ModR/M 字节的值。

在指令“mov eax, [ebp-8]”中,ModR/M 字节为 45。从 32 位 ModR/M 字节表来看,这意味着 Reg 为 eax,有效地址为 [EBP]+显示8。指令的下一个字节 F8 是 8 位有符号偏移量。

指令的操作数大小可以隐含在指令中,也可以由指令前缀指定。例如,对于 mov 指令(例如示例中的指令),66 前缀表示 16 位操作数。如果您使用 64 位模式,则 48 前缀表示 64 位操作数。

8位操作数通常由指令的低位表示。如果将示例中的指令从 8B 更改为 8A,它就会变成 al 中的 8 位移动。

关于assembly - 在机器代码中引用寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45526209/

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