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

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

2006-5-27 18:50
4353
最近编写的一个程序中要初始化一段内存,所以要用到初化函......什么?变量在定时不就可以初化吗...嗯是的....高级语言的确是这样.但是我是用汇编写的.对于局部变量在定义时是无法初化的.但在用之前又需必要初始化的..否则可能会有意想不到的结果....查了下有库函数:
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是不等的...对于全局变量程序可以,但是对于局部变量...
它在堆栈段中....程序能初始化内存吗...我认为不能....
我也是刚开始学不久..有些地方理解的不深,有错误请大家指正....请高手给偶一点指点....不胜感激.......

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

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

强烈要求。。。老大给解释下。。。。。。。
游客
登录 | 注册 方可回帖
返回