




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实现在Windows下直接读写内存的方法 1.利用Windows提供的各个段选择符标号,在C源程序中将选择符标号说明为外部变量。其对照表如下:表12.利用宏定义MAKELONG(段内偏移量,&段选择符标号)即可得到一个长指针。3.经上述方法得到的指针与C语言中定义的指针是一样的。4.如果使用的段是D000H或E000H或其它上位内存时,需改动Windows的系统配置文件SYSTEM.INI,利用字符器,在386Enh小节中加入EmmExclude=xxxxyyyy一行,禁止Windows使用这段存储空间。值xxxx和yyyy是16位内存范围。如开发的插件占用D000H段的64K,则应加入这样一行:EmmExclude=d000-dfff。利用这一方法,已使我们自己开发的电路板(占用D000H段),在Windows控制下成功地运行了。考虑到读者没有相应的硬件,这里以读取中断向量、计算机ROM的制造时间和对DOS用户通讯区的读写为例,详见以下程序。对于DOS用户通讯区的内容,读者可用DOS的DEBUG程序检查(D命令)和修改(E命令)。DOS的用户通讯区在004000F0H处开始,共计16个字节。在修改时请注意:从004000F0H开始存放可显示ASCII码字符串,并以0结尾。;MEMORY.DEF模块定义文件NAMEMemoryDESCRIPTIONdemotrateanintergratedmenuEXETYPEWINDOWSSTUBWITUB.EXECODEPRELOADMOVEABLEDISCARDABLEDATAPRELOADMOVEABLEMULTIPLEHEAIZE1024STACKSIZE8192EXPORTSWndProc/*-MEMORY.RC直接读写内存的资源定义文件-*/#includememory.hMemoryMenuMENUBEGINPOPUP取中断向量&IBEGINMENUITEMint0&3h,IDM-INT03HMENUITEMint&10h,IDM-INT10HMENUITEMint&21h,IDM-INT21HENDPOPUPROM区域&RBEGINMENUITEM制造时间&T,IDM-TIMEMENUITEM取用户通讯区&U,IDM-READMENUITEM存用户通讯区,IDM-WRITEENDMENUITEMa退出&X,IDM-EXITEND/*-MEMORY.H直接读写内存的头文件-*/#defineIDM-INT03H101#defineIDM-INT10H102#defineIDM-INT21H103#defineIDM-TIME201#defineIDM-READ202#defineIDM-WRITE203#defineIDM-EXIT300/*-MEMORY.C用户对固定内存直接读写的表演程序-*/#include#includememory.h#includeintPASCALWinMain(HANDLE,HANDLE,LTR,int);longFARPASCALWndProc(HWND,UINT,UINT,LONG);/*-WinMain()-*/intPASCALWinMain(HANDLEhItance,HANDLEhPrevItance,LTRlzCmdLine,intnCmdShow)MSGmsg;HWNDhWnd;WNDCLAwndclaif(!hPrevItance)wndcla.style=CS-HREDRAW|CS-VREDRAW;wndcla.lpfnWndProc=WndProc;wndcla.cbClsExtra=0;wndcla.cbWndExtra=0;wndcla.hItance=hItance;wndcla.hIcon=LoadIcon(NULL,IDI-ALICATION);wndcla.hCursor=LoadCursor(NULL,IDC-ARROW);wndcla.hbrBackground=GetStockObject(WHITE-BRUSH);wndcla.lzMenuName=MemoryMenu;wndcla.lzClaame=直接读写存储器;if(!RegisterCla(&wndcla)returnFALSE;hWnd=CreateWindow(直接读写存储器,直接读写存储器,WS-OVERLAEDWINDOW,CW-USEDEFAULT,CW-USEDEFAULT,CW-USEDEFAULT,CW-USEDEFAULT,NULL,NULL,hItance,NULL);if(!hWnd)returnFALSE;ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);while(GetMeage(&msg,NULL,0,0)TralateMeage(&msg);DiatchMeage(&msg);returnmsg.wParam;/*-WndProc()-*/longFARPASCALWndProc(HWNDhWnd,UINTmeage,UINTwParam,LONGlParam)HDChDC;HPENhOldPen,hNewPeRECTrect;TEXTMETRICtm;PAINTSTRUCTUINTi;charStrbuf50;WORDfar*InterruptVector;charfar*bioexternWORD-0000H;externWORD-0040H;externWORD-F000H;switch(meage)caseWM-MAND:switch(wParam)caseIDM-INT03H:InterruptVector=(WORDfar*)MAKELONG(0,&-0000H);wrintf(Strbuf,向量地址:X:XHn,*(InterruptVector0x06),*(InterruptVector0x07);MeageBox(hWnd,Strbuf,int03h,MB-OK|MB-ICOTOP);return0;caseIDM-INT10H:InterruptVector=(WORDfar*)MAKELONG(0,&-0000H);wrintf(Strbuf,向量地址:X:XHn,*(InterruptVector0x20),*(InterruptVector0x21);MeageBox(hWnd,Strbuf,int10h,MBOK|MB-ICOTOP);return0;caseIDM-INT21H:InterruptVector=(WORDfar*)MAKELONG(0,&-0000H);wrintf(Strbuf,向量地址:X:XHn,*(InterruptVector0x42),*(InterruptVector0x43);MeageBox(hWnd,Strbuf,int21h,MB-OK|MB-ICOTOP);return0;caseIDM-TIME:bios=(charfar*)MAKELONG(0xfff5,&-F000H);MeageBox(hWnd,bios,ROM制造时间,MB-OK|MB-ICOTOP);return0;caseIDM-READ:bios=(charfar*)MAKELONG(0xF0,&-0040H);MeageBox(hWnd,bios,取用户通讯区内容,MB-OK|MB-ICOTOP);return0;caseIDM-WRITE:bios=(charfar*)MAKELONG(0xF0,&-0040H);for(i=0;i10;i)*(biosi)=Ai;*(bios10)=0;MeageBox(hWnd,WriteA-Jcharstring!,写用户通讯区内容,MB-OK|MB-ICOTOP);return0;caseIDM-EXIT:SendMeage(hWnd,WM-CLOSE,0,0);return0;break;caseWM-DESTROY:PostQuitMeage(0);return0;default:break;returnDefWindowProc(hWnd,meage,wParam,lParam);/*-EndProgrammingofDemo-*/ 1.利用Windows提供的各个段选择符标号,在C源程序中将选择符标号说明为外部变量。其对照表如下:表12.利用宏定义MAKELONG(段内偏移量,&段选择符标号)即可得到一个长指针。3.经上述方法得到的指针与C语言中定义的指针是一样的。4.如果使用的段是D000H或E000H或其它上位内存时,需改动Windows的系统配置文件SYSTEM.INI,利用字符器,在386Enh小节中加入EmmExclude=xxxxyyyy一行,禁止Windows使用这段存储空间。值xxxx和yyyy是16位内存范围。如开发的插件占用D000H段的64K,则应加入这样一行:EmmExclude=d000-dfff。利用这一方法,已使我们自己开发的电路板(占用D000H段),在Windows控制下成功地运行了。考虑到读者没有相应的硬件,这里以读取中断向量、计算机ROM的制造时间和对DOS用户通讯区的读写为例,详见以下程序。对于DOS用户通讯区的内容,读者可用DOS的DEBUG程序检查(D命令)和修改(E命令)。DOS的用户通讯区在004000F0H处开始,共计16个字节。在修改时请注意:从004000F0H开始存放可显示ASCII码字符串,并以0结尾。;MEMORY.DEF模块定义文件NAMEMemoryDESCRIPTIONdemotrateanintergratedmenuEXETYPEWINDOWSSTUBWITUB.EXECODEPRELOADMOVEABLEDISCARDABLEDATAPRELOADMOVEABLEMULTIPLEHEAIZE1024STACKSIZE8192EXPORTSWndProc/*-MEMORY.RC直接读写内存的资源定义文件-*/#includememory.hMemoryMenuMENUBEGINPOPUP取中断向量&IBEGINMENUITEMint0&3h,IDM-INT03HMENUITEMint&10h,IDM-INT10HMENUITEMint&21h,IDM-INT21HENDPOPUPROM区域&RBEGINMENUITEM制造时间&T,IDM-TIMEMENUITEM取用户通讯区&U,IDM-READMENUITEM存用户通讯区,IDM-WRITEENDMENUITEMa退出&X,IDM-EXITEND/*-MEMORY.H直接读写内存的头文件-*/#defineIDM-INT03H101#defineIDM-INT10H102#defineIDM-INT21H103#defineIDM-TIME201#defineIDM-READ202#defineIDM-WRITE203#defineIDM-EXIT300/*-MEMORY.C用户对固定内存直接读写的表演程序-*/#include#includememory.h#includeintPASCALWinMain(HANDLE,HANDLE,LTR,int);longFARPASCALWndProc(HWND,UINT,UINT,LONG);/*-WinMain()-*/intPASCALWinMain(HANDLEhItance,HANDLEhPrevItance,LTRlzCmdLine,intnCmdShow)MSGmsg;HWNDhWnd;WNDCLAwndclaif(!hPrevItance)wndcla.style=CS-HREDRAW|CS-VREDRAW;wndcla.lpfnWndProc=WndProc;wndcla.cbClsExtra=0;wndcla.cbWndExtra=0;wndcla.hItance=hItance;wndcla.hIcon=LoadIcon(NULL,IDI-ALICATION);wndcla.hCursor=LoadCursor(NULL,IDC-ARROW);wndcla.hbrBackground=GetStockObject(WHITE-BRUSH);wndcla.lzMenuName=MemoryMenu;wndcla.lzClaame=直接读写存储器;if(!RegisterCla(&wndcla)returnFALSE;hWnd=CreateWindow(直接读写存储器,直接读写存储器,WS-OVERLAEDWINDOW,CW-USEDEFAULT,CW-USEDEFAULT,CW-USEDEFAULT,CW-USEDEFAULT,NULL,NULL,hItance,NULL);if(!hWnd)returnFALSE;ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);while(GetMeage(&msg,NULL,0,0)TralateMeage(&msg);DiatchMeage(&msg);returnmsg.wParam;/*-WndProc()-*/longFARPASCALWndProc(HWNDhWnd,UINTmeage,UINTwParam,LONGlParam)HDChDC;HPENhOldPen,hNewPeRECTrect;TEXTMETRICtm;PAINTSTRUCTUINTi;charStrbuf50;WORDfar*InterruptVector;charfar*bioexternWORD-0000H;externWORD-0040H;externWORD-F000H;switch(meage)caseWM-MAND:switch(wParam)caseIDM-INT03H:InterruptVector=(WORDfar*)MAKELONG(0,&-0000H);wrintf(Strbuf,向量地址:X:XHn,*(InterruptVector0x06),*(InterruptVector0x07);MeageBox(hWnd,Strbuf,int03h,MB-OK|MB-ICOTOP);return0;caseIDM-INT10H:InterruptVector=(WORDfar*)MAKELONG(0,&-0000H);wrintf(Strbuf,向量地址:X:XHn,*(InterruptVector0x20),*(InterruptVector0x21);MeageBox(hWnd,Strbuf,int10h,MBOK|MB-ICOTOP);return0;caseIDM-INT21H:InterruptVector=(WORDfar*)MAKELO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 62453-1:2025 EN Field device tool (FDT) interface specification - Part 1: Overview and guidance
- 【正版授权】 ISO 80000-9:2019/AMD1:2025 EN Amendment 1 - Quantities and units - Part 9: Physical chemistry and molecular physics
- 新版部编人教版一年级下册道德与法治全册教案
- 重庆课件研发
- 暑假新课预习提升练:第三单元检测卷《分数除法》(含解析)-2024-2025学年人教版六年级数学下学期
- 重庆市课件大赛
- 外研版(一起)五年级英语上册Module 1~10单元达标测试卷(共10套含答案)
- 突破与量有关的化学(离子)方程式的书写(含解析)-2026届高中化学一轮复习讲义
- 重工作业课件
- 老年人防毒知识培训课件
- 铭记历史缅怀先烈,珍爱和平开创未来课件
- 二年级数学下册口算天天练
- 有机化学课件(李景宁主编)第1章-绪论
- 全友导购员培训资料(机密)
- 白话译文《渔樵问对》(全篇)
- 医院消毒灭菌效果监测制度
- +GF+-SIGNET8850电导率变送器手册
- 大豆收购合同范本
- 2023学年完整公开课版水准仪认识
- 人文地理学(王恩涌)
- 教育学第五章教师与学生
评论
0/150
提交评论