x86 asm 奇怪数组 for 循环
x86 asm strange Array for loop
我不太理解这段代码。它看起来像是一个遍历结构数组的 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]
此代码初始化一个包含 23 个项目指针的数组。
mov esi, [eax+312]
这里 esi
是点数组的开始,这里:
mov esi, [esi+edx*4]
esi
是一个指针。您缺少 []
运算符。 esi+edx*4
表示一个指针的地址,这个指针的值指向esi
。 edx*4
用于获取指向对象的下一个指针,而不是对象本身。现在这将被初始化。真正的代码应该是这样的(为了简单起见,我只是这样写的,你的程序集中没有调用):
struct _mystruct *arr[23];
void init_struct(struct _mystruct *item)
{
...
}
for (int i=0; i < 23; i++)
init_struct(arr[i]));
我不太理解这段代码。它看起来像是一个遍历结构数组的 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]
此代码初始化一个包含 23 个项目指针的数组。
mov esi, [eax+312]
这里 esi
是点数组的开始,这里:
mov esi, [esi+edx*4]
esi
是一个指针。您缺少 []
运算符。 esi+edx*4
表示一个指针的地址,这个指针的值指向esi
。 edx*4
用于获取指向对象的下一个指针,而不是对象本身。现在这将被初始化。真正的代码应该是这样的(为了简单起见,我只是这样写的,你的程序集中没有调用):
struct _mystruct *arr[23];
void init_struct(struct _mystruct *item)
{
...
}
for (int i=0; i < 23; i++)
init_struct(arr[i]));