鱼C论坛

 找回密码
 立即注册
查看: 2399|回复: 4

麻烦会C++的朋友帮翻译下代码,翻译成汇编代码

[复制链接]
发表于 2013-1-15 23:04:05 | 显示全部楼层 |阅读模式
50鱼币
我想仔细理解这段代码的知识
但C++的代码只能看懂个大概,现在又没时间去学习C++,所以拜托那位大哥帮翻译成汇编。先谢谢了

原文:
         这是遍历怪物二叉树的函数。为了提高效率本人使用的是非递归算法。
void getguailist(BiTree *t){
int top=0,i=0;
BiTree *p,*s[255];
p=t;
    do{
        while(p->EndofR!=1){
            GUAILIST[i++]=p->ADDRESS;
            if(p->EndofR!=1){
                s[top++]=p->Rchild;
                p=p->Lchild;
            }
        }
        if(top>=0) p=s[--top];
    }while(top>=0);

}
这是获得怪物二叉树根地址的函数:
ULONG getguaiADDRESS(){
ULONG cc;
    __asm{
        MOV EAX,DWORD PTR DS:[0X51F1B8]
        MOV ECX,DWORD PTR DS:[EAX]
        LEA ECX,DWORD PTR DS:[EAX+0X4DC8]
        MOV EAX,[ECX+0X14]
        MOV ECX,[EAX+0X4]
        MOV cc,ECX
        }
return cc;
}

调用的时候是这样的:
getguailist((BiTree *)getguaiADDRESS());
这样怪物二叉树的怪物结构地址便存储在了GUAILIST[ ]这个数组中勒。

二叉树的存储结构是个三叉链表:
typedef struct BiTree{
    BiTree *Lchild,*Parent,*Rchild;
    ULONG ID,ADDRESS;
    BYTE EndofL,EndofR;
}BiTree;
结束标志为  EndofR为1

最佳答案

查看完整内容

自己对二叉树值只有个概念, 没去学过 而且自己智商不高恐怕也无法用 纯汇编实现,(二叉树在高级语言的支持下代码、运算量减少很多 而纯汇编的工作量则是数倍的增加) 针对这段代码,虽然翻译代码量不算太大,但是逻辑要求可能很费时。 非线性数据结构遍历很麻烦。。 限于能力太低,只能提供WIN32ASM的编写思路+纯中文翻译 这样即使不会C++也能理解了 void getguailist(BiTree *t) //此句传入一个t指针指向 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-15 23:04:06 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-18 17:56 编辑

自己对二叉树值只有个概念,
没去学过
而且自己智商不高恐怕也无法用

纯汇编实现,(二叉树在高级语言的支持下代码、运算量减少很多
而纯汇编的工作量则是数倍的增加)
针对这段代码,虽然翻译代码量不算太大,但是逻辑要求可能很费时。
非线性数据结构遍历很麻烦。。

限于能力太低,只能提供WIN32ASM的编写思路+纯中文翻译
这样即使不会C++也能理解了



void getguailist(BiTree *t)    //此句传入一个t指针指向二叉树首地址
//简单用汇编来讲就是一个DWORD的地址中存储着另一个地址,这个地址指向的

是一个结构的首地址
至于这个t的地址是怎么得到的,应该是注入后,通过下面那段汇编得到的
那段汇编根据不同游戏就不同

{
int top=0,i=0;//这个定义变量应该不用讲了吧
BiTree *p,*s[255]; //定义一个p指针(dword大小的变量)用来指向一个二叉树

首地址,再定义一个S指针数组,这个数组可以指向255个二叉树首地址
这里P和S的ASM实现就是DW开辟一段内存来存地址
p=t; //把P指针(就是一个DWORD变量)赋值为传进来的指针t
    do{
        while(p->EndofR!=1)//意思大概就是结构中有内容时,条件成立
        {
            GUAILIST[i++]=p->ADDRESS;//把该地址存放到自己定义的怪物数

组中,利用i作为怪物数组的下标
            if(p->EndofR!=1)//如果结构中没内容,也就是没怪物吧
                {
                s[top++]=p->Rchild;//这两句就像一个树的结构,分左右,

我自己没学过这结构,抱歉
                p=p->Lchild;
            }
        }
        if(top>=0) p=s[--top];
    }while(top>=0);

}
这是获得怪物二叉树根地址的函数:
ULONG getguaiADDRESS(){
ULONG cc;
    __asm{
//这边的代码是根据不同游戏分析出来的获取方法,跟找CALL差不多
公式也就是这样[[[[[51F1B8h]]+4dc8h]+14h]+4h]
        MOV EAX,DWORD PTR DS:[0X51F1B8]
        MOV ECX,DWORD PTR DS:[EAX]
        LEA ECX,DWORD PTR DS:[EAX+0X4DC8]
        MOV EAX,[ECX+0X14]
        MOV ECX,[EAX+0X4]
        MOV cc,ECX
根据这段汇编,获取方法就是
先获取0X51F1B8这个地址中的值放到eax
然后把eax的值作为地址再找到一个地址放到ecx
把EAX的值+0x4dc8放到ecx
把ECX+14H作为地址找到这个地址中的值放到EAX
再把EAX+4H作为地址找到这个地址中的值放到ECX
这时ECX就是想要的值了
放到变量cc中


        }
return cc;
}

调用的时候是这样的:
getguailist((BiTree *)getguaiADDRESS());
这样怪物二叉树的怪物结构地址便存储在了GUAILIST[ ]这个数组中勒。

二叉树的存储结构是个三叉链表:
typedef struct BiTree{
    BiTree *Lchild,*Parent,*Rchild;
    ULONG ID,ADDRESS;
    BYTE EndofL,EndofR;
}BiTree;
这边是BitTree结构定义
结束标志为  EndofR为1



能力十分菜,不要笑话我哈,希望能帮到你

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-18 15:45:07 | 显示全部楼层

{:1_1:}谢谢啦,对我帮助很大啊。我也要分点时间出来学下C++才行了,毕竟汇编的教程和资料都太少了,没法参考啊。。。

评分

参与人数 1鱼币 +5 收起 理由
メ㊣逆ご帅☆ + 5 非常高兴能帮助你Y(^o^)Y

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-9 19:31:45 | 显示全部楼层
gcc -S xxx.c 直接生成汇编代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-10 01:22:31 | 显示全部楼层
half-life 发表于 2013-2-9 19:31
gcc -S xxx.c 直接生成汇编代码

楼上的朋友谢谢啊,,,有这功能啊,改天我试试,2叉树和递归遍历2叉树我已经吃透了,还是实践中学到的知识来得充实啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 00:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表