首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向工程,左位移位7

反向工程,左位移位7
EN

Stack Overflow用户
提问于 2011-04-20 06:40:12
回答 2查看 737关注 0票数 3

我一直在尝试对游戏的一个功能进行逆向工程,但我有点困惑。我对逆向工程非常陌生(我使用的是ollydbg btw),所以我还不知道所有的技巧和细节。

不管怎样,这是我的问题所在。当你拿起游戏中的任何物品时,都会调用这个函数。然后,它计算项目的值,并将该值添加到您的分数中。在调用函数之前,会推送一个值,我很确定它就是项的ID。这是让我感到困惑的代码:

代码语言:javascript
复制
SHL ESI,7
MOV CX,WORD PTR DS:[EDX+ESI+42]

ESI =项目ID EDX =常量值FE56A0

我猜测EDX (FE56A0)是一个项目数组的开始,ESI是项目的索引,42是项目持有的值的索引。这可能有点奇怪,因为你的位将ESI向左移动了7。随着ESI的增加,它的位移位值不是线性增长的。

因此,如果EDX表示数组的开始,而ESI将是一个索引,则数组中的项的大小将不相等。这段代码的含义让我困惑不解。

有人知道这段代码代表了什么吗?

EN

回答 2

Stack Overflow用户

发布于 2011-04-20 06:43:48

该数组可能包含128字节长的结构。移位7将ID乘以128,给出访问该ID的结构所需的偏移量。42将是进入结构的偏移量。

这是因为乘法实际上线性地增加了相乘后的索引:

代码语言:javascript
复制
0 << 7 == 0
1 << 7 == 128
2 << 7 == 256
3 << 7 == 384

等。

这段代码只是访问存储在数组中的结构的一个成员。

票数 3
EN

Stack Overflow用户

发布于 2011-04-20 06:50:44

可能是EDX指向数组所属的某个结构的开头。数组之前的数据需要42个字节,数组中的每个元素需要128个字节。(1<<7是128 -移位通常被用作2的幂的快速乘法。)例如,如下所示:

代码语言:javascript
复制
// EDX points here
struct GameItems
{
   int numItems;
   int stuff;
   int moreStuff;
   char[30] data;
   GameItem[MAX_ITEMS] items;  // offset 42 bytes from start
};

struct GameItem
{
   // 128-bit structure
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5723586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档