加入收藏 设为首页 帮助中心
 
论坛首页
用户登录 | 用户注册 | 最新悬赏 | 最新贴子 | 会员中心 | 贴子搜索 | 网站地图 | 帮助中心 | 联系我们
站内搜索:
现在位置 > 维库电子开发网论坛 > 嵌入式系统/ARM技术 > 帮忙分析下如下一段汇编代码!
帖子主题: 帮忙分析下如下一段汇编代码!
你还没有登录,无法发表回复,请首先 登录.. [注 册]
积分:1440 爱的天国
发表于:2008-5-15 9:28:00 楼主
级别:二钻
积分:1440分
注册:2007年11月12日
.........................

.text:006123EC loc_6123EC:                             ; CODE XREF: sub_612310+C1j
.text:006123EC                 mov     eax, [ebx+8]
.text:006123EF                 push    ebp             ; FILE *
.text:006123F0                 push    1               ; size_t
.text:006123F2                 lea     ecx, [esp+70h+var_54] 
.text:006123F6                 push    4               ; size_t//读取4个字节 这里读取 数组的总数
.text:006123F8                 push    ecx             ; void *
.text:006123F9                 mov     [esp+78h+var_4C], eax
.text:006123FD                 mov     [ebx+8], edx
.text:00612400                 call    ds:fread    //这里应该是调用读取函数 将 4个字节转换成 整型数据
.text:00612406                 mov     eax, [esp+78h+var_54]//这里 esp+78h+var_54 应该是总数 变量
.text:0061240A                 add     esp, 10h
.text:0061240D                 xor     esi, esi
.text:0061240F                 test    eax, eax
.text:00612411                 mov     [esp+68h+var_58], esi  
.text:00612415                 jle     loc_612672 //进入循环如果接着读取数据位空 则读取结束关闭文件        
.text:00612415
.text:0061241B      //如下进入读取循环,每组32个字节读取,没读取一组 然后转换一组数据/然后接着读取下组数据
.text:0061241B loc_61241B:                             ; CODE XREF: sub_612310+35Cj
.text:0061241B                 push    ebp             ; FILE *
.text:0061241C                 push    1               ; size_t
.text:0061241E                 lea     edx, [esp+70h+var_20] //是结构体数组的指针变量?
.text:00612422                 push    20h             ; size_t  // 32字节 应该是按照数组整个读取的
.text:00612424                 push    edx             ; void *
.text:00612425                 call    ds:fread            //这里调用 fread  函数 开始读取数据
.text:0061242B                 lea     edi, [esp+78h+var_34] //  文件读取指针?
.text:0061242F                 or      ecx, 0FFFFFFFFh  //这个什么意思 难道是赋值0给ecx 还是?
.text:00612432                 xor     eax, eax   //清空 eax
.text:00612434                 add     esp, 10h     //16个字节  //指针变量地址+16个字节??
.text:00612437                 repne scasb          //?
.text:00612439                 not     ecx
.text:0061243B                 dec     ecx
.text:0061243C                 mov     eax, esi
.text:0061243E                 xor     edx, edx
.text:00612440                 mov     edi, [esp+68h+var_20]//78变成68什么意思 两个16个字节 难道是32字节?
.text:00612444                 div     ecx
.text:00612446                 or      ecx, 0FFFFFFFFh  //这个什么意思
.text:00612449                 mov     ebp, [esp+68h+var_18]  
.text:0061244D                 movsx   eax, byte ptr [esp+edx+68h+var_34]//  进行无符号扩展??
.text:00612452                 xor     edi, eax  // 进行逻辑或 运算么 ? 
.text:00612454                 xor     eax, eax
.text:00612456                 mov     [esp+68h+var_20], edi // 转换后 赋值给第一个变量
.text:0061245A                 lea     edi, [esp+68h+var_34]
.text:0061245E                 repne scasb
.text:00612460                 not     ecx
.text:00612462                 dec     ecx
.text:00612463                 mov     eax, esi
.text:00612465                 xor     edx, edx
.text:00612467                 mov     edi, [esp+68h+var_14]
.text:0061246B                 div     ecx
.text:0061246D                 or      ecx, 0FFFFFFFFh
.text:00612470                 movsx   eax, byte ptr [esp+edx+68h+var_34]
.text:00612475                 cdq
.text:00612476                 xor     edi, edx
.text:00612478                 xor     ebp, eax
.text:0061247A                 mov     [esp+68h+var_14], edi
.text:0061247E                 lea     edi, [esp+68h+var_34]
.text:00612482                 xor     eax, eax
.text:00612484                 xor     edx, edx
.text:00612486                 repne scasb
.text:00612488                 not     ecx
.text:0061248A                 dec     ecx
.text:0061248B                 mov     eax, esi
.text:0061248D                 div     ecx
.text:0061248F                 mov     [esp+68h+var_18], ebp
.text:00612493                 mov     ebp, [esp+68h+var_10]
.text:00612497                 lea     edi, [esp+68h+var_34]
.text:0061249B                 xor     eax, eax
.text:0061249D                 movsx   ecx, byte ptr [esp+edx+68h+var_34]
.text:006124A2                 xor     ebp, ecx
.text:006124A4                 or      ecx, 0FFFFFFFFh
.text:006124A7                 repne scasb
.text:006124A9                 not     ecx
.text:006124AB                 dec     ecx
.text:006124AC                 mov     eax, esi
.text:006124AE                 xor     edx, edx
.text:006124B0                 lea     edi, [esp+68h+var_34]
.text:006124B4                 div     ecx
.text:006124B6                 mov     ecx, [esp+68h+var_C]
.text:006124BA                 xor     eax, eax
.text:006124BC                 mov     [esp+68h+var_10], ebp
.text:006124C0                 movsx   edx, byte ptr [esp+edx+68h+var_34]
.text:006124C5                 xor     ecx, edx
.text:006124C7                 xor     edx, edx
.text:006124C9                 mov     [esp+68h+var_C], ecx
.text:006124CD                 or      ecx, 0FFFFFFFFh
.text:006124D0                 repne scasb
.text:006124D2                 not     ecx
.text:006124D4                 dec     ecx
.text:006124D5                 mov     eax, esi
.text:006124D7                 div     ecx
.text:006124D9                 mov     edi, [esp+68h+var_8]
.text:006124DD                 mov     ecx, [ebx+0Ch]
.text:006124E0                 movsx   eax, byte ptr [esp+edx+68h+var_34]
.text:006124E5                 xor     edi, eax
.text:006124E7                 mov     eax, [ebx+8]
.text:006124EA                 sub     ecx, eax
.text:006124EC                 mov     [esp+68h+var_8], edi
.text:006124F0                 mov     ebp, eax
.text:006124F2                 sar     ecx, 5
.text:006124F5                 cmp     ecx, 1
.text:006124F8                 jnb     loc_6125B1
.text:006124F8
.text:006124FE                 mov     edx, [ebx+4]
.text:00612501                 test    edx, edx
.text:00612503                 jz      short loc_612511
.text:00612503
.text:00612505                 mov     ecx, eax
.text:00612507                 sub     ecx, edx
.text:00612509                 sar     ecx, 5
.text:0061250C                 cmp     ecx, 1
.text:0061250F                 ja      short loc_612516
.text:0061250F
.text:00612511

............................................

.text:00612672 loc_612672:                             ; CODE XREF: sub_612310+105j
.text:00612672                 push    ebp             ; FILE *
.text:00612673                 call    ds:fclose
.text:00612679                 add     esp, 4
.text:0061267C                 pop     edi
.text:0061267D                 pop     esi
.text:0061267E                 pop     ebp
.text:0061267F                 pop     ebx
.text:00612680                 add     esp, 58h
.text:00612683                 retn
.text:00612683
.text:00612683 sub_612310      endp
.text:00612683


反汇编代码用途是 读取一个文件(存储 N组数据)!
文件结构:
总数4字节  存储数据的总组数
每组共32字节 每个存储8个数据 ,每个数据4个字节 

存储的数据都是long型 

不过都是处理过的,请帮忙看下 是经过哪些处理  (逻辑或  还是逻辑异或   或者其它 )

 
积分:1440 爱的天国
发表于:2008-5-15 9:31:00 1 楼
级别:二钻
积分:1440分
注册:2007年11月12日
虽然是长了点,但是还是麻烦大家帮忙一下啊.
谢谢啦
 
积分:674 棒球英豪
发表于:2008-5-16 10:13:00 2 楼
级别:五星
积分:674分
注册:2007年11月14日
那个or ecx, 0ffffffffh,可能是设置ecx为最大值,因为后面有repne等指令,因为不知道目的串的大小,所以就给ecx一个最大值。

用or而不用mov,可能是要同时设置或清除寄存器的值。
 
积分:1364 风的承诺
发表于:2008-5-19 9:47:00 3 楼
级别:二钻
积分:1364分
注册:2007年11月23日
这段代码使用esp来访问局部变量和参数,比较难懂,因为esp不断变化,所以有时esp+68有时esp+78。

lea     edx, [esp+70h+var_20] //是结构体数组的指针变量?
这是取变量的地址,从这段代码中无法判断出是不是结构体数组,看起来不像。

lea     edi, [esp+78h+var_34] //  文件读取指针?
这也是取变量地址。

or      ecx, 0FFFFFFFFh  //这个什么意思 难道是赋值0给ecx 还是?
这是给ecx赋值为最大无符号整数,这样写比用mov的代码短一些。

add     esp, 10h     //16个字节  //指针变量地址+16个字节??
调整栈指针,这是C函数调用之后的栈清理操作,因为调用函数之前像栈中push了10H个字节数据。

repne scasb          //?
前面将ecx赋值为最大无符号整数,与此代码搭配,不限制长度查找字符。

movsx   eax, byte ptr [esp+edx+68h+var_34]//  进行无符号扩展??
这是有符号扩展,将char型数据强制转换为long型数据。无符号扩展用movzx。

xor     edi, eax  // 进行逻辑或 运算么 ?
这是异或运算。
 
积分:315 momo
发表于:2008-5-19 11:46:00 4 楼
级别:四星
积分:315分
注册:2008年05月19日

难得啊,现在很少有精通汇编了,顶一下

 

 
积分:1452 冬天的雪花
发表于:2008-5-21 9:25:00 5 楼
级别:二钻
积分:1452分
注册:2007年11月10日
.text:0061241B loc_61241B:                             ; CODE XREF: sub_612310+35Cj 
.text:0061241B     push    ebp             ; FILE * 
.text:0061241C     push    1               ; size_t 
.text:0061241E     lea     edx, [esp+70h+var_20] //第一个变量的地址 
.text:00612422     push    20h             ; size_t  // 32字节 
.text:00612424     push    edx             ; void * 
.text:00612425     call    ds:fread          

上面是定义了 一个数组 首地址赋给dex 定义 每读取数据依一次 读取长度为 32个字节 )
然后调用 fread函数 读取32个字节数据给整个数组 
下面的没有跳出循环 ,应该是在每读取一组数据后 然后 处理每个数组里面的数据

每个已经读取的数组里面有8个变量数据 每个4个字节 其中 第2个和 最后一个不需要处理 其它的 需要处理下 才最终存到数组里面 ,所以下面的处理过程 只涉及到了 6个数组里面的变量 

.text:0061242B     lea     edi, [esp+78h+var_34] //  装如数组指针变量的地址?应该是首地址?
.text:0061242F     or      ecx, 0FFFFFFFFh  // 给ecx赋值为最大无符号整数 
.text:00612432     xor     eax, eax   //清空eax
.text:00612434     add     esp, 10h     //调整栈指针
.text:00612437     repne scasb          //不限制长度查找字符,查找什么字符?
.text:00612439     not     ecx    //ecx取反
.text:0061243B     dec     ecx   //ecx减1

//整个ecx在这里起什么作用?难道就是存储 数组变量的数据不成  这里的代码老重复 这段代码在数据读取过程中的到底是什么意思 这个ECX是否就是将读取到的4字节数据 进行 转换 每次需要处理的 变量数据是否就存在ecx里面?

反汇编的程序源代码是C++ 所以读取的时候调用了fread函数 ,那么每次读取 一个long型4字节数据 是在 fread函数里面转换的还是调用完成后在这里转换成 long型的?在这个代码里面可以看出来么  ?

.text:0061243C     mov     eax, esi //esi为空 这里应该是清空eax
.text:0061243E     xor     edx, edx  //清空dex
.text:00612440     mov     edi, [esp+68h+var_20]

//第一个变量的数值赋给edi  按照我的理解 数组第一个变量的地址 [esp+68h+var_20] 应该和前面的[esp+70h+var_20] 数组首地址是同一个地址都指向数组第一个变量 ,对么?

.text:00612444     div     ecx  //无符号除法?什么意思?
.text:00612446     or      ecx, 0FFFFFFFFh  //整个ecx在这里起什么作用?
.text:00612449     mov     ebp, [esp+68h+var_18]  


.text:0061244D     movsx   eax, byte ptr [esp+edx+68h+var_34]

//  edx 都清空了 [esp+edx+68h+var_34] 来个 edx是什么意思? 这里的有符号扩展指的什么意思?

.text:00612452     xor     edi, eax  // 
.text:00612454     xor     eax, eax 
.text:00612456     mov     [esp+68h+var_20], edi // 转换后 赋值给第一个变量 ?


好象源代码 是使用的指针进行文件数据操作 ?我的目的很简单 到底对每个数据做了哪些处理即可xor  或者 or..

文件里面每个数组里面第二个数据个最后没有经过处理的 是 DE  23 B8 00   其余经过处理过的数据 全部都是 DE FF FF FF 这种格式的 
所以我猜测 处理的过程跟  or   ecx, 0FFFFFFFFh  这种代码有很大关系 
 
积分:912 绿叶
发表于:2008-5-22 9:17:00 6 楼
级别:一钻
积分:912分
注册:2007年11月10日
.text:0061242B     lea     edi, [esp+78h+var_34] //  装如数组指针变量的地址?应该是首地址?
.text:0061242F     or      ecx, 0FFFFFFFFh  // 给ecx赋值为最大无符号整数
.text:00612432     xor     eax, eax   //清空eax 
.text:00612434     add     esp, 10h     //调整栈指针 
.text:00612437     repne scasb          //不限制长度查找字符,查找什么字符? 
.text:00612439     not     ecx    //ecx取反 
.text:0061243B     dec     ecx   //ecx减1 
这一段是在[esp+78h+var_34]开始的内存中搜索0,应该是计算字符串的长度。

.text:0061243C     mov     eax, esi //esi为空 这里应该是清空eax 
.text:0061243E     xor     edx, edx  //清空dex 
.text:00612440     mov     edi, [esp+68h+var_20] 
.text:00612444     div     ecx  //无符号除法?什么意思? 
.text:00612446     or      ecx, 0FFFFFFFFh  //整个ecx在这里起什么作用? 
.text:00612449     mov     ebp, [esp+68h+var_18]   
这一段是把esi的值除以ecx,esi不一定是0,因为可以是从其它地方跳转到这里来执行的。
除法的余数是保存在edx中的,所以下面的edx不是0。

使用esp寻址的指令,你注意一下其前面push和pop还有add esp、sub esp的指令,自己来计算内存位置。
 
积分:938 爱的花园
发表于:2008-5-23 9:23:00 7 楼
级别:一钻
积分:938分
注册:2007年11月09日

我也很想达到这咱境界,请问高手方法是什么.

 
积分:1650 指尖划过
发表于:2008-5-24 8:42:00 8 楼
级别:二钻
积分:1650分
注册:2007年11月02日

6楼
不错哦!看来是高手,以后我们切磋切磋吧!

 
快速回复:
用户名: 密码:  验证码,看不清楚?请点击刷新验证码 注册新帐号?
上传图片格式(jpg/gif/png)和文件格式(rar/pdf)
 
 
网站简介s广告服务网站地图帮助信息联系方式问题报告
Copyright 2007 - 2008 bbs.weeqoo.com
Powered By weeqoo Version 8.0.0XML