如何用C语言读取硬件I/O寄存器或内存地址?

frankpjl 2008-01-17 03:13:23

我写的代码如下
用VC & DevCPP 编译成Win32程序会有Access violation
用TC 3.0 编译选择8086指令集 运行不会停止,一直作写入文件操作

#include <stdio.h>
#include <stdlib.h>

void main()
{
FILE * fp;
char * p = 0;
fp = fopen("read.txt", "wb+");
if(!fp) printf("create file error");
while(p <= (char *)0xFFFF)
{
fwrite(p, 1, 1, fp);
}

system("pause");
}
...全文
1352 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankpjl 2008-01-21
  • 打赏
  • 举报
回复
楼上的‘欧洲男人’,what the meaning of fpos switch?
euroman 2008-01-19
  • 打赏
  • 举报
回复
please fgetc()!!!!!!

fwrite() will not do the fpos switch!!!!
sheenl 2008-01-18
  • 打赏
  • 举报
回复
只能用CreateFile了, 必须经过windows的驱动层. dos那种直接读端口的好时光已经结束了.

dos的int 21也可以理解成是一种系统调用. 不过那个调用不需要权限的切换, 实际上不是真的系统调用, 和普通函数调用并没有本质区别.
frankpjl 2008-01-18
  • 打赏
  • 举报
回复
这么说如果要对硬件操作的话就只能进行系统调用了?
想起来貌似286以上的cpu就都有特权极进行保护了,用户进程无法访问受保护的地址空间
我想驱动电脑上的串口和并口
用汇编可以做出来,我想再用C语言实现,最好是Win32应用程序
  • 打赏
  • 举报
回复
楼主想用WIN和单片机通信?那就不该用DOS底下的东西
xxmv99 2008-01-18
  • 打赏
  • 举报
回复
长见识,还可以通过FILE来操作内存。。。
agaric 2008-01-18
  • 打赏
  • 举报
回复
保护模式下,你没有办法获得物理地址的内容,除非操作系统提供你接口。
sheenl 2008-01-17
  • 打赏
  • 举报
回复
ioremap得到的是内核空间的地址,用户空间的程序用不了ioremap。
保护模式下, 用户空间的程序都无法直接访问io地址,必须要通过系统调用之类的间接手法。
kingwoo 2008-01-17
  • 打赏
  • 举报
回复
linux下ioremap就是干重映射的活的
windows不晓得
frankpjl 2008-01-17
  • 打赏
  • 举报
回复
谢谢楼上各位的回答!
代码改为如下可以读取从0x00000开始的1M地址空间内容了
但是如何验证读取的内容还没有想到好的办法
我用debug程序d功能查看前0x00000 ~ 0x000FF 的内容与读取的内容基本一致

#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE * fp;
char * p = 0;
long i = 0;
printf("%d", sizeof(p));
fp = fopen("read.dat", "wb+");
if(!fp) printf("create file error");
else
while(i++ <= 0xFFFFF)
{
fwrite(p++, 1, 1, fp);
}

system("pause");
return 0;
}


那么保护模式下能不能用间接的方式读取保护地址空间的内容呢?
frankpjl 2008-01-17
  • 打赏
  • 举报
回复
奇怪 为什么看不到回复?
sheenl 2008-01-17
  • 打赏
  • 举报
回复
保护模式下, 你的程序立刻就回非法内存操作或者段错误.
实模式下, 不对内存保护, 可以读. 不过那时候near指针只有16位, 永远<= 0xFFFF. 改成far或者huge什么的应该行了.

建议你别用tc了, 早就该淘汰的东西, 想不出用她的理由.
goodluckyxl 2008-01-17
  • 打赏
  • 举报
回复
知道为什么出现不同的结果了吗?
TC是实模式 VC是保护模式
0x0000000地址在TC下可以被访问到
而在vc下属于保护段一般地址是操作系统的内容不允许被访问


访问硬件IO寄存器 那很简单
看硬件是如何挂载的 IO是通过总线访问的
定义器件地址直接访问就可以了
和指针一样的
ltc_mouse 2008-01-17
  • 打赏
  • 举报
回复
感觉你给的代码跟你的问题差别很大呀。读寄存器,嵌入汇编可以吗?

你的代码while是一个死循环;而p=NULL,在Windows中,普通应用程序访问0地址,是不允许的~
chlaws 2008-01-17
  • 打赏
  • 举报
回复
while(p <= (char *)0xFFFF) 这句是永真了.
而while里面没有break出来
所以就是死循环了.
若只是要把*p内容写入read.txt则 就一个fwrite就OK了.不用while

69,335

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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