gpt4 book ai didi

assembly - 了解 x86 MOV 语法

转载 作者:行者123 更新时间:2023-12-02 08:00:01 26 4
gpt4 key购买 nike

我认为这是一个很容易(也许很简单)的问题,但经过近两个小时的谷歌搜索后,我已经放弃了。我很确定我的问题是因为我只是不明白语法在做什么。

我正在查看 IDA 中的一些反汇编代码,但我不知道以下代码在做什么:

mov dl, byte_404580[eax]

如果我跳转到 byte_404580,我会发现 .data:00404580 byte_404580 db 69h 告诉我该值为 0x69。但我不明白这是如何使用的。

让我提供此代码出现的上下文:

mov eax, 0x73             ; Move hex 73 to EAX
and eax, 0x0F ; Keep lower half of EAX
mov dl, byte_404580[eax] ; MAGIC

根据上述假设,EAX 最初为 0x73,我得到 DL=0x76。我尝试过改变 EAX 的值来查找某种模式,但我无法弄清楚发生了什么。

最佳答案

此语法用于表示内存寻址,类似于 C 的数组语法 (array[index])。您的示例相当于计算表达式 0x404580 + (eax & 0x0F),将其视为一个地址,并从此地址中取出一个字节。这表明 0x404580 处的数据是一个字节数组(最有可能是 0x10 元素,基于掩码)。

如果这回答了您的问题,您可以停止阅读此处。

<小时/>

如果您进入“选项”>“常规”并将“显示操作码字节”设置为非零值,您将看到指令字节的实际值,并能够将它们与处理器文档交叉引用以了解发生的情况。这通常不是必需的,但它可能具有教育意义。例如:

mov dl, byte_404580[eax]

可以表示为字节序列:

8A 14 05 80 45 40 00

使用Intel's Architecture Manual, Volume 2A ,可以如下解码:

8A - instruction opcode for MOV r8, r/m8 - determines the operand sizes

14 - the Mod R/M byte:
| 00010100b
Mod | 00
R/M | 100
Reg | 010

Mod R/M combination 00-100 is specified as "followed by the SIB byte".
Reg 010 stands for register DL/DX/EDX, the destination operand.

05 - the SIB byte:
| 00000101b
Scale | 00
Index | 000
Base | 101

This combination is specified as [scaled value of EAX] + a 32 bit displacement.

80 45 40 00 - the displacement itself, 0x404580

将这些加在一起,您将得到:

该指令从EAX + 0x404580获取一个字节并将其移入DL寄存器。

<小时/>

IDA 使用此信息推断 0x404580 处有一个字节大小的值数组,如果还没有名称,则尝试命名该位置,尝试调整指定项目的大小跨越正确字节数的位置(它不一定知道该数组中有多少元素,因此它实际上并不在那里创建数组)并将显示的表达式转换为 byte_404580[eax].

关于assembly - 了解 x86 MOV 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12148010/

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