求助】请高手分析下这段简单的代码. rep movs ......

CSharp_XinBing 2009-09-02 12:55:21
在子程序开头.
mov esi, dword ptr [ebp+8]
lea edi, dword ptr [ebp-48]

push ecx

mov ecx, 0f
rep movs dword ptr es:[edi], dword ptr [esi]

pop ecx

esi装的好像是传入的参数.
edi是不是就是ebp-48这个值啊? 也就是局部数组的首地址?
那为什么后面的rep指令中要用es:[edi]? edi不是在堆栈中吗? 为什么要es开头. 这样数据是不是就没有传入到堆栈中啊? 还有一些代码我也发现地址是ebp-8, 即堆栈中, 但MOV时, 前面却加的是ds:[esi], 为什么是ds前缀?
为什么是加es, ds的前缀哪? 不应该是堆栈中吗? 另外edi中是不是装的就是ebp-48这个值? 谢谢
...全文
1085 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
PctGL 2009-09-03
  • 打赏
  • 举报
回复
不是那么简单, lz 有兴趣的话,看看有个俄罗斯人写的指令集解析的文章,对于段,选择子,和这种ds:es:之类的东西所代表的含义和用途其实有很多讲究,绝非简单理解上的无用,反而是非常重要的


缘之一念 2009-09-03
  • 打赏
  • 举报
回复
在子程序开头.
mov esi, dword ptr [ebp+8]
lea edi, dword ptr [ebp-48]

push ecx

mov ecx, 0f
rep movs dword ptr es:[edi], dword ptr [esi]

pop ecx

esi装的好像是传入的参数. 【我认为这句没有错】
edi是不是就是ebp-48这个值啊? 也就是局部数组的首地址?【也没有错】
那为什么后面的rep指令中要用es:[edi]? edi不是在堆栈中吗? 为什么要es开头. 这样数据是不是就没有传入到堆栈中啊? 还有一些代码我也发现地址是ebp-8, 即堆栈中, 但MOV时, 前面却加的是ds:[esi], 为什么是ds前缀?【看来楼主是一个DOS 16位汇编的高手,或者最起码学的汇编教材是16位的,我原来也很容易混淆,不过我的建议是抛开原来已知的寻址方式,先好好弄明白Win32汇编】
为什么是加es, ds的前缀哪? 不应该是堆栈中吗? 另外edi中是不是装的就是ebp-48这个值?【这个问题,要具体回答,需要照本宣科,我只想说32位汇编,因为地址空间足够用,已经不需要段+偏移这样的方式了,或者说系统和编译器已经帮我们做了这些事情,这里的ES,DS已经没有区别了,算是一个向后兼容的做法,也许某一天这些段寄存器会完全消失】

以上,纯粹个人唠叨,有什么不妥的地方,请见谅!
budao3 2009-09-02
  • 打赏
  • 举报
回复

mov esi, dword ptr [ebp+8]
;这边做的是将ebp+8的值赋给esi,(这个值应该是一个地址,指向一组数据,是由外面的函数传进来的)
lea edi, dword ptr [ebp-48]
;这个指令是求出【ebp-48】的offset(地址),并赋给edi(这边应该是前面先定义了一段空间给它使用,48是16进制)
push ecx

mov ecx, 0f
rep movs dword ptr es:[edi], dword ptr [esi]
;这边将ds:【esi】中的内容,搬到es:【edi】中,搬的数据是64byte.(这个指令默认是source是DS:[ESI];destination是es:[edi]);至于为什么要这样写,要看看es,ds指向哪个段,还有前面的代码是怎么样写的
pop ecx

大熊猫侯佩 2009-09-02
  • 打赏
  • 举报
回复
建议实际调试的时候看一下各个段寄存器的内容。
friendly_ 2009-09-02
  • 打赏
  • 举报
回复
mov esi, dword ptr [ebp+8]
lea edi, dword ptr [ebp-48]

push ecx

mov ecx, 0f
rep movs dword ptr es:[edi], dword ptr [esi]

pop ecx
-------------------------------------------------------
从ds:[esi]处复制0f*4个字节到es:[edi]处.其中esi通过参数提供,传参通过栈传参,在[ebp+8]处,edi有[ebp-48]提供,应该是个局部变量.在这里之所以用es,ds是因为movs指令决定的,看看movs指令的用法就知道了.
默认情况下,[]是取的数据段的内容即:ds:[],若用其他段的要加段前缀es:[],ss:[].
Jiessie 2009-09-02
  • 打赏
  • 举报
回复
无论linux还是Windows、通常,ss,es,ds,cs的描述符的基地址都是一样的。所以。开发中就忽略了这些。

21,496

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧