首页
社区
课程
招聘
关于内存初始化函数的一些问题......拿来大家一走讨论下....
发表于: 2006-5-27 18:50 4823

关于内存初始化函数的一些问题......拿来大家一走讨论下....

2006-5-27 18:50
4823
最近编写的一个程序中要初始化一段内存,所以要用到初化函......什么?变量在定时不就可以初化吗...嗯是的....高级语言的确是这样.但是我是用汇编写的.对于局部变量在定义时是无法初化的.但在用之前又需必要初始化的..否则可能会有意想不到的结果....查了下有库函数:
VOID ZeroMemory(
  PVOID Destination,
                 // address of block to fill with zeros
  DWORD Length   // size, in bytes, of block to fill with zeros
);
可以用...但为了练习,还是自己写一个吧....我写了一个如下:

FillZero       proc   uses edi, _pvoidDest:dword, dwSize:dword
               
               mov        ecx, dwSize
               mov        edi, _pvoidDest
               push       ds
               pop        es
               
               xor        eax, eax
               rep  stosb
               
               ret
FillZero       endp
但写完之后自己想了下,有以下疑问:

对于windows其段地址寄存器是由系统来维护的...其中DS,ES,SS是想等的....所以程序程序可以正常初化内存....但是对于DOS程序
其DS,SS是不等的...对于全局变量程序可以,但是对于局部变量...
它在堆栈段中....程序能初始化内存吗...我认为不能....
我也是刚开始学不久..有些地方理解的不深,有错误请大家指正....请高手给偶一点指点....不胜感激.......

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
初始化内存当然要知道这段内存空间是如何寻址的。
Windows提供的函数比较复杂,并不只是简单的清零操作
2006-5-28 12:16
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
ZeroMemory和memset函数VC都能内联进去的,因为方法很简单,就是rep stosd/stosb.
2006-5-28 15:54
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
怎么这么少人讨论呀.....都谈一下吗.......
2006-5-30 19:33
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
唉。。。郁闷呀。。。偶找到了一点资料。。。如下:
16 位 Windows 下的把代码分成 DATA,CODE 等段的内存模式不同,WIN32 只有一种内存模式,即 FLAT 模式,意思是"平坦"的内存模式,再没有 64K 的段大小限制,所有的 WIN32 的应用程序运行在一个连续、平坦、巨大的 4GB 的空间中。这同时也意味着您无须和段寄存器打交道,您可以用任意的段寄存器寻址任意的地址空间.........16位的WINDOWS还是和DOS一样。。。有不同的段。。。但是对于32位的。。。。就没有有。。。可以直接用CS,DS,ES,SS,。。。中的任意 一个来寻址要初化的空间。。。。我想是不是16位的WINDOW中不存在ZeroMemery()这样的函数。。。。。。。。。

强烈要求。。。老大给解释下。。。。。。。
2006-5-31 17:29
0
游客
登录 | 注册 方可回帖
返回
//