首页
社区
课程
招聘
[求助]请高手分析下这段简单的代码. rep movs ......
发表于: 2009-9-1 10:01 7812

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

2009-9-1 10:01
7812
在子程序开头.
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这个值? 谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 314
活跃值: (271)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
路过学习~~
2009-9-1 10:19
0
雪    币: 92
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
edi存放的是[EBP-48]这个堆栈指针指向的数据,在这里可能是个地址。一个复制的目的地址。
2009-9-1 10:37
0
雪    币: 186
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
记得在32位汇编中,这些es cs ss什么的段都是忽略的,因为32位地址是平坦的。
2009-9-1 10:38
0
雪    币: 162
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
说一点我个人的理解
mov esi, dword ptr [ebp+8]          ;将堆栈ebp+8的4个字节的值送入esi(源字串数组地址)
lea edi, dword ptr [ebp-48]           ;将堆栈ebp-48的4个字节的值送入edi(目的字串数组偏移地址)

push ecx

mov ecx, 0f                                      ;字串操作次数
rep movs dword ptr es:[edi], dword ptr [esi]  ;将源字串送入目的字串

pop ecx

在32位Windows平台下,CS,DS,ES和SS可以直接寻址全部的4 GB地址空间,程序开始执行的时候,CS,DS,ES和SS都已经指向了正确的描述符,在整个程序的生命周期内,程序员不必改动这些段寄存器,也不必关心它们的值究竟是多少(实际上,想改也改不了)。(这段说明引自老罗的Windows环境下32位汇编语言程序设计)
以我的理解,它是对16位寻址方式的一种继承
2009-9-1 15:14
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
6
lea edi, dword ptr [ebp-48]

相当于

mov eax,ebp
sub eax,48
mov edi,eax

edi 放的是EBP-48 的结果;
2009-9-1 15:40
0
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢各位高手啦
我想问一个es:[edi]     //edi = ebp-48
这个是不是就是堆栈中的地址, 也即此函数局部变量数组的首地址. 而不管ES, 也就是说数据是存到堆栈中了, 而不是那个所谓的ES段中了? 谢谢!
2009-9-1 17:18
0
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
8
5楼说过了。

win32 线性寻址。不使用段寄存器。当然有一些特殊功能呢还是会使用到的。通常不用理会
2009-9-1 18:16
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
rep movs dword ptr es:[edi], dword ptr [esi]  
不就是
rep movsd
2009-9-1 19:00
0
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
分不够啊, 没给分的对不起啦
2009-9-2 15:54
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
rep movs dword ptr es:[edi], dword ptr [esi]

对类似的语句还是不太了解,最近碰到几个程序,频繁使用类似的指令。
2009-9-3 00:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
movs 是串指令.
将esi中的东西移动ecx个到edi中去
rep是无条件重复.

相应的指令 还有 movsb 一次移动一个字节,类似movsw一个字.
当然还有repe cmpsb 一次比较一个字节 当比较结果为真 进行下一个比较.
2009-9-3 10:06
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
movs系列指令 我记得就这么规定的

ds:esi  源
es:edi 目的
cx     次数

rep movsb 一次一字节源向目的拷贝一字节数据 拷贝后自动调整指针到下个字符
拷贝次数由 ecx值决定 应该是这样的

实际写的时候 都是

rep movsb =  rep movs byte ptr es:[edi], byte ptr [esi]
rep movsw =  rep movs word ptr es:[edi], word ptr [esi]
rep movsd =  rep movs dword ptr es:[edi], dword ptr [esi]
2009-9-8 19:33
0
雪    币: 1337
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
进来学习一下,刚开始学
2009-9-8 23:57
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
进来学习下,
2009-9-9 12:13
0
雪    币: 63
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
学习......
2011-7-9 18:06
0
雪    币: 754
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
以下是我个人理解,因为我只在大学学习过16位的汇编,至于win32汇编也是刚学没多久。
首先,lea edi,dword ptr [ebp-48]  它的作用就是将ebp-48送入edi中,也就是lz理解的edi中存放的是局部数组的首地址,具体的说就是使edi指向局部数组的首地址。
其次,movs这个指令的格式是这样的
       movs 目标操作数,源操作数      
目标操作数寻址方式只能是es:[edi],es不能替换
2011-7-9 21:40
0
游客
登录 | 注册 方可回帖
返回
//