首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

刚学汇编,老大们指点下,小弟我想了1天都不明白

2012-02-21 
刚学汇编,老大们指点下,我想了1天都不明白LEAEDX,DWORDPTRDS:[406349]//地址进edxPUSHEDX//这里edx为:4063

刚学汇编,老大们指点下,我想了1天都不明白
LEA   EDX,DWORD   PTR   DS:[406349]     //地址进edx
PUSH   EDX                                               //这里edx为:406349,该地址指向一个字符串
                  //我们假定这个串就是"rageliu"吧
                                                              //显然这里入栈是做为下面lstrlenA()的参数
CALL   <JMP.&kernel32.lstrlenA>     //lstrlenA()函数取上面串长度,结果7在EAX
MOV   EBP,EAX                                         //-----------@到这句的时候我有下面的疑问


当到了最后的MOV   EBP,EAX这句的时候(这句还没有执行),EDX居然变为了40634A,
也就是说CALL   <JMP.&kernel32.lstrlenA> 执行后edx加了1,lstrlenA()函数为什么会使edx增加了1呢???

[解决办法]
我的系统是 xp/sp2, 下面是 kernel32!lstrlenA 函数的主要部分:

7C80BDB6 > 6A 08 PUSH 8
7C80BDB8 68 F0BD807C PUSH kernel32.7C80BDF0
7C80BDBD E8 0467FFFF CALL kernel32.7C8024C6
7C80BDC2 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
7C80BDC5 85C0 TEST EAX,EAX
7C80BDC7 0F84 68A80200 JE kernel32.7C836635
7C80BDCD 8365 FC 00 AND DWORD PTR SS:[EBP-4],0
7C80BDD1 8D50 01 LEA EDX,DWORD PTR DS:[EAX+1] ;* 这里给 edx 设置值
7C80BDD4 8A08 MOV CL,BYTE PTR DS:[EAX]
7C80BDD6 40 INC EAX
7C80BDD7 84C9 TEST CL,CL
7C80BDD9 ^75 F9 JNZ SHORT kernel32.7C80BDD4
7C80BDDB 2BC2 SUB EAX,EDX ;* 依此计算字符串长度
7C80BDDD 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFFFF
7C80BDE1 E8 1B67FFFF CALL kernel32.7C802501
7C80BDE6 C2 0400 RETN 4

由于上面的取当前字符后给 EAX 增 1 了, 所以, 遇到了结束字节 00 时, EAX 指向了 00 的下一个字符. 为了使得长度准确, 同样起始地址 (EDX) 也要增 1, 所以才有 lea edx, [eax+1]. 当然了, 也可以有其它的计算方法, 只是 ms 选择了这个方法而已.

热点排行