dAb 发表于 2013-1-15 23:04:05

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

我想仔细理解这段代码的知识
但C++的代码只能看懂个大概,现在又没时间去学习C++,所以拜托那位大哥帮翻译成汇编。先谢谢了

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

}
这是获得怪物二叉树根地址的函数:
ULONG getguaiADDRESS(){
ULONG cc;
    __asm{
      MOV EAX,DWORD PTR DS:
      MOV ECX,DWORD PTR DS:
      LEA ECX,DWORD PTR DS:
      MOV EAX,
      MOV ECX,
      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

メ㊣逆ご帅☆ 发表于 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; //定义一个p指针(dword大小的变量)用来指向一个二叉树

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

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

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

}
这是获得怪物二叉树根地址的函数:
ULONG getguaiADDRESS(){
ULONG cc;
    __asm{
//这边的代码是根据不同游戏分析出来的获取方法,跟找CALL差不多
公式也就是这样[[[[]+4dc8h]+14h]+4h]
      MOV EAX,DWORD PTR DS:
      MOV ECX,DWORD PTR DS:
      LEA ECX,DWORD PTR DS:
      MOV EAX,
      MOV ECX,
      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



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

dAb 发表于 2013-1-18 15:45:07

メ㊣逆ご帅☆ 发表于 2013-1-17 22:11 static/image/common/back.gif
自己对二叉树值只有个概念,
没去学过
而且自己智商不高恐怕也无法用


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

half-life 发表于 2013-2-9 19:31:45

gcc -S xxx.c 直接生成汇编代码

dAb 发表于 2013-2-10 01:22:31

half-life 发表于 2013-2-9 19:31 static/image/common/back.gif
gcc -S xxx.c 直接生成汇编代码

楼上的朋友谢谢啊,,,有这功能啊,改天我试试,2叉树和递归遍历2叉树我已经吃透了,还是实践中学到的知识来得充实啊
页: [1]
查看完整版本: 麻烦会C++的朋友帮翻译下代码,翻译成汇编代码