x86 asm 奇怪的数组 for 循环

Posted

技术标签:

【中文标题】x86 asm 奇怪的数组 for 循环【英文标题】:x86 asm strange Array for loop 【发布时间】:2018-09-02 05:09:37 【问题描述】:

我不能完全理解这段代码。这似乎是一个遍历结构数组的 for 循环。但是由于索引跳得不够远,它会不断覆盖自己。

                xor     edx, edx
                db      66h, 66h, 66h, 66h
                nop     word ptr cs:[eax+eax+00000000h]
loc_1808450:
                mov     esi, [eax+312]
                mov     esi, [esi+edx*4]
                mov     dword ptr [esi+12], 0
                movsd   xmm0, qword ptr ds:(loc_180815C - 180815Ch)[ecx]
                movsd   qword ptr [esi+4], xmm0
                mov     byte ptr [esi+64], 0
                mov     byte ptr [esi+82], 0
                mov     byte ptr [esi+65], 0
                mov     dword ptr [esi+40], 0
                mov     dword ptr [esi+44], 0
                mov     dword ptr [esi+48], 0
                mov     byte ptr [esi+66], 0FFh
                mov     dword ptr [esi+16], 0
                mov     dword ptr [esi+71], 0
                mov     dword ptr [esi+67], 0
                mov     byte ptr [esi+81], 0
                mov     word ptr [esi+79], 0
                mov     dword ptr [esi+75], 0
                mov     dword ptr [esi+87], 0
                mov     dword ptr [esi+83], 0
                mov     word ptr [esi+95], 0
                mov     dword ptr [esi+91], 0
                mov     byte ptr [esi+98], 100
                mov     byte ptr [esi+97], 100
                mov     byte ptr [esi+99], 0
                mov     byte ptr [esi+100], 0
                mov     byte ptr [esi+101], 0
                mov     dword ptr [esi+20], 0FFFFFFFFh
                mov     dword ptr [esi+24], 0FFFFFFFFh
                mov     dword ptr [esi+36], 0
                mov     dword ptr [esi+28], 0
                mov     dword ptr [esi+32], 0
                mov     dword ptr [esi+56], 0
                mov     dword ptr [esi+52], 0
                mov     dword ptr [esi+60], 0
                mov     dword ptr [esi+106], 0
                mov     dword ptr [esi+102], 0
                mov     dword ptr [esi+114], 0
                mov     dword ptr [esi+110], 0
                mov     byte ptr [esi+118], 0
                inc     edx
                cmp     edx, 23
                jnz     loc_1808450

这是我从代码中了解到的:

mov esi, [esi+edx*4] 似乎设置了数组和 inc edx 更新 i++

数组的大小为 119,而 i*4 永远不会是足够大的内存跳转,因此它最终会覆盖中的值 movsd xmm0, qword ptr ds:(loc_180815C - 180815Ch)[ecx]

【问题讨论】:

我不知道您认为 EDX、119 或 movsd 中的值如何相互关联。 EDX 用作索引以在某处获取指向内存的指针。没有给出有多少内存,但每个指针很可能有 119 个字节。 对不起,我还是新手。我已经有 10 年没有接触过 c++ 了,所以我的指针假设可能有很大的缺陷。 【参考方案1】:

此代码初始化一个包含 23 个项目指针的数组。

mov esi, [eax+312]

这里esi是点数组的开始,这里:

mov esi, [esi+edx*4]

esi 是一个指针。您缺少 [] 运算符。 esi+edx*4 显示了一个指针的地址,该指针的值指向esiedx*4 用于获取指向对象的下一个指针,而不是对象本身。现在这将被初始化。真正的代码应该是这样的(为简单起见,我只是这样写的程序集中没有调用):

struct _mystruct *arr[23];

void init_struct(struct _mystruct *item)

    ...


for (int i=0; i < 23; i++)
    init_struct(arr[i]));

【讨论】:

所以它是指向数组的指针而不是数组本身?我想象它是这样的:struct _mystruct arr[23]; 非常感谢 @SinisterMephisto 它是一个指针数组(或者更好地说,如果我们从[eax+312] 开始查找,则指向指针数组的指针)。此外,struct _mystruct *arr[23]; 在某种程度上类似于双指针访问方式。 1 来自数组,1 来自类型。 :)

以上是关于x86 asm 奇怪的数组 for 循环的主要内容,如果未能解决你的问题,请参考以下文章

x86 asm中的括号是啥意思?

奇怪的 for 循环语法

字符串长度的for循环奇怪地跳过了一些字符

奇怪的蟒蛇“嵌套” for循环

Lua for循环减少我?奇怪的行为[重复]

为什么for循环在JavaScript构造函数中表现得很奇怪?[已关闭]