在BCB中不能直接通过地址来访问内存吗?帮帮忙,看我这段代码为什么提示"非法内存访问"

xin_ni 2003-04-13 04:53:19
小第学BCB不久,不知道能不能直接通过地址来访问内存,编了以下代码试的时候提示"非法内存访问"

#define MK_FP(seg,ofs) ((void *)(((unsigned long)(seg)<<16)|(unsigned)(ofs))) //用于通过段地址和偏移地址组成要访问的地址.本来这个宏在bc的dos.h中有的,但是bcb中没有,没办法只好把它的原型找出来拷贝在这里了.:)
......
......
......
unsigned *p1;
unsigned segadr=0xd004;
p1=(unsigned int *)MK_FP(segadr,0X0004);
while((*p1)!=0){
*p1=*p1&0x07ff|0x0800;
p1+=8;
}
运行时提示在访问0xd0040004的时候非法.

bcb中能这么直接访问内存吗?
如果不能应该怎么做呢?
...全文
65 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
BCB 2003-04-14
  • 打赏
  • 举报
回复
windows保护方式可不是上个世纪的DOS实方式!
很复杂,要查N个资料!
xin_ni 2003-04-14
  • 打赏
  • 举报
回复
我现在有一个自己做的板子,将一些数据放在了固定的物理内存中.我应该怎么去访问这些数据呢?
zhdhj 2003-04-14
  • 打赏
  • 举报
回复
看错了,这个地址在3G以上是系统内存也是不可写的!
zhdhj 2003-04-14
  • 打赏
  • 举报
回复
windows是在386以后的保护模式下运行的。是采用分段(段选择子)+分叶机制的内存管理模式,数据段和代码段的起始虚地址都是从0开始的,在你程序中你认为的内存物理地址,其实在运行是cpu把它解释成虚址的。经过MK_FP(segadr,0X0004)后,线性地址是0xd0040004,此处一般是代码段内容,不可写的所以你程序 应该是运行到此处
*p1=*p1&0x07ff|0x0800;出错!
qiuafa 2003-04-14
  • 打赏
  • 举报
回复
up
deavilness 2003-04-13
  • 打赏
  • 举报
回复
你怎么把 dos 的 20 位的分段寻址拿到 32 位的 windows 下面用?如果这样可以,那么 110V 的电器也可以直接插到 220V 的电源上面去用了!

就算你这碰巧是一个正确的 32 位地址,windows 也会保护进程的内存空间,这样子做当然是不可能的。
xin_ni 2003-04-13
  • 打赏
  • 举报
回复
没人知道吗?
upup
xin_ni 2003-04-13
  • 打赏
  • 举报
回复
这应该是个简单问题吧?
怎么没人知道呢?
各位快帮帮我啊.
xin_ni 2003-04-13
  • 打赏
  • 举报
回复
有些地址是不让访问,但是总有可以访问的吧.
怎么没人回答呢,我急啊.在线等待.......
猎人66 2003-04-13
  • 打赏
  • 举报
回复
有些地方好象不让访问吧,

13,873

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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