微机原理实验指导书--正文.doc_第1页
微机原理实验指导书--正文.doc_第2页
微机原理实验指导书--正文.doc_第3页
微机原理实验指导书--正文.doc_第4页
微机原理实验指导书--正文.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

系 统 介 绍AEDK8688ET教学实验机是由中国航空工业总公司615研究所下属的上海航虹高科技实业公司开发、研制和生产的,是集实验、开发、自诊断功能于一体的高新技术实验系统。该系统自带微处理器、键盘、数码管、监控程序和自诊断程序,提供ISA总线接口缓冲驱动卡,具有独立运行(不须PC机)、串行监控和ISA总线三种运行方式。该系统不仅可以做微机原理和接口实验,还可以外接机电实验平台,做机电一体化实验。实验三 独立的单扳机运行方式一、 实验要求掌握独立单扳机运行方式的条件及相关命令的使用二、 资源介绍1 CPU(8088)2 存储器:27C512(64KEPROM)-70000H7FFFFH 62256(32KRAM)-80000H87FFFH 用户程序区-80300H87FFFH3 接口芯片:8255、8259、8253、8251、0809、0832、8279,1384 输入输出设备:键盘、数码管 三、 开关设置及连线1将J2、J3用40芯连接电缆连接起来,J1插座空;2JP0JP4接至RAM端,JP5接至AEDK端;3K10插上短路套,K11、K12拨至RAM侧;4在J5上插上外接电源电缆,电源开关K13拨至左端,用外接电源供电四、 掌握以下各个命令的使用:1ER命令:功能 :显示/修改寄存器的内容使用格式:在“-”状态下,按“ER”出现“.”提示符,按寄存器名(AX、BX、):显示器上显示名称和寄存器的值举例 :2 EB/EW命令: 功能 :显示/修改内存单元的内容使用格式:-EB .8000:0300,01,d8,f4举例 :3ST命令:功能 :单步执行(CS:IP=8000:0300 )使用格式:-ST 0300 01,举例 :4“”命令:功能 :结束命令的执行,返回到操作系统状态5 “,”命令:功能 :开始执行命令,使用格式:举例 :五、实验内容一:1利用ER命令将14H、35H分别写入AX和BX寄存器中2利用EB命令将“ADD AX,BX”指令的操作码的十六进制表示“01D8H”写入8000:300H开始的连续的内存单元中3利用ST命令单步运行“ADD AX,BX”指令4查看AX的内容是否正确?(49H)六、实验内容二:在单扳机上运行下段程序,并查看结果是否正确:mov ax,20hmov bx,12hsub bx,axadd bx,1234h使用DEBUG反汇编七、实验内容三:1利用导线连接PA0孔与DL1孔、连接PA1孔与DL2孔、连接PA7孔与DL8孔,连接0218H021FH孔与8255CS孔。2在单板机上单步运行下段程序(使用DEBUG反汇编),并观察实验现象:Mov al,80h;指令1Mov dx,021bh;指令2 Out dx,al ;指令3 Mov al,feh;指令4 Mov dx,0218h;指令5Ll:out dx,al;指令6 Rol al,1;指令7 Jmp ll;指令8 要求:1)当执行完指令3,记录L1L8的亮灭情况,结论?2)每当执行完指令6,记录并分析L1L8的亮灭情况?3 在JMP LL指令之前增加以下两条指令,然后全速运行程序,并观察解释试验现象:MOV CX,0FFHLOOP $(注:全速的步骤-设置程序的起始地址(cs:ip)运行命令:GO.)4 填写实验报告实验四 LED实验一、实验要求编写程序,以8255作为输出接口,控制8个单色LED灯二、实验目的5 学习在PC系统中扩展简单I/O接口的方法6 学习编制数据输出程序的设计方法五、 验电路六、 实验说明8255工作于方式0、此时PA、PB、PC均为独立输出的并行口。8255各个寄存器对应的口地址为:PA口:218H PB口:219H PC口:21AH 控制口:21BH七、 实验程序框图实验五 开关量输入实验一、 验要求编写程序,通过8255的PC口读取开关的状态,并在PC机屏幕上显示出来。二、 实验目的进一步掌握8255并行口芯片的编程方法及通过8255读取开关量的方法。三、 实验电路四、实验程序框图实验六 8255扫描键盘实验一、 验要求1 编写程序,用扫描法读入实验机上按键,并在PC机显示读到的按键值。2 编写程序,用反转法读入实验机上按键,并在PC机显示读到的按键值。二、 实验目的1 学习在PC机系统中扩展简单I/O接口的方法2 学习扫描读取键盘的编程方法及硬件的结构。三、 实验电路RL7、Y0Y1。拔掉K10上的所有短路套。四、 实验说明:键盘值的读取一般有两种方法:一种是扫描法,另一种是反转法。扫描法是对键盘上的某一行送低电平,其他为高电平,然后读取列值,若列值中有某一位为低,表明该行与低电平对应列的键被按下。否则扫描下一行。反转法是先所有行扫描线输出低电平,读列值,若列值有一位是低电平表明有键按下;接着所有列扫描线输出低电平,再读行值。根据读到的值的组合可以查表得到键码。YYYY置8255方式0B口输入、A口输出开始A口出0、B口入有键按下延时消抖有键按下首列扫描字-R2,列号送R4扫描字送PAPB.0=0PB.1=0列号+1扫描字左移一位行首键号为00行首键号为08求键号为08等待键释放为08显示对应键号为08返回DOSN8列扫描完NN五、实验程序框图(扫描法)Y开始设置数据段显示提示信息调键盘扫描字程序按键为“F”返回DOSNNNN8列扫描完实验七 8259中断实验一、 实验要求中断请求通过ISA总线的IRQ2端输入,中断源可以是实验机上的8253定时器输出的脉冲,也可以是其他脉冲信号。本实验用的是从单脉冲电路产生的脉冲信号作为中断源。编写程序,要求每次PC机响应外部中断时,显示的字符是“8259A IRQ5中断中断!”,中断十次后程序退出。二、 实验目的掌握8259A中断控制器的工作原理,熟悉实验中涉及到的中断屏蔽寄存器IMR和中断服务寄存器ISR等各寄存器的使用方法和中断处理程序的编写。三、 实验电路及连线四、 实验程序框图实验八 RAM读写实验一、实验要求1 利用62256扩充RAM空间为D0000D7777H,对齐进行读写。2 编制程序,将字符0z循环写入62256中,再将62256中的内容读出来并显示在PC机屏幕上。二、 实验目的1 掌握PC机内存扩充方法和外围接口方法,了解PC机内存分布2 通过硬件电路的分析,掌握地址译码的方法,了解总线的时序。三、 实验电路及连线短路套JP0、JP1、JP3、JP4套到RAM侧,K11、K12拨到RAM侧。四、实验程序框图(略)实验九DMA传输实验一、实验要求编写程序,将PC机为60000H61FFFH的内容用DMA读方式送到实验机的62256上,然后在利用DMA写方式写回到7000071FFFH内存区域中。二、 实验目的1 学习DMA工作原理及DMA控制器8237A-5的使用。2 掌握PC机环境下的通过编程实现DMA数据传输。了解DMA工作时序。三、 实验电路短路套JP0、JP1、JP2、JP3、JP4套到DMA侧,K11、K12拨到DMA侧,HALT键兼做DMA按键使用。四、实验说明1 本实验利用的DMA控制器是PC机自身带有的,实验机上没有设计DMA控制器。在利用PC机内DMA控制器是,必须遵循PC机的某些限制条件:首先,DMA控制器8237A-5在PC机系统内部,寻址范围为000FH,4个DMA通道中,通道0用于动态RAM刷新,通道1为用户保留,通道2用作软盘数据传输,通道3用于硬盘数据传输。通道1对应的页面地址是83H。在PC机BIOS初始化过程中,控制寄存器被设置为00H,即设置DACK低有效,DREQ高有效,规定优先级,普通时序及不扩展写方式。四个通道共同遵循此约定。故建议程序不必再设定控制寄存器的内容,以免破坏机器正常运行。最后,通道0的RAM刷新请求信号有系统中的8253计数器通道1产生,每隔15.13微秒产生一次。2 在使用时,应注意以下两点:第一, 保证通道0的RAM刷新请求及时得到满足,否则将出现死机现象。所以,对DMA的三种传输模式,PC机环境下只支持一种:单字节传输方式。其他两种都因占用总线时间过长,使RAM得不到既是刷新而导致死机。另外,系统设置在固定优先级方式,为的也是保证动态RAM的刷新。另外,PC机系统不支持内存到内存的DMA方式。第二, 软件请求方式与块传输方式像对应的。为保证不影响RAM的刷新,建议用字节传输方式。这样,在传输多字节时,实际要用一个循环来实现。N开始化显示提示信息设置通道1屏蔽字清除先后触发器设置方式字为单字节方式设置传送地址为60000:0传送字节数为0FFFH去通道1屏蔽字测试DMA结束否设置通道1屏蔽字清除先后触发器设置传送方式为单字节目的地址为7000:0设置传输字节数为0FFFH清除通道1屏蔽标志DMA结束结束N四、 程序流程实验十 8253计时器/定时器实验一、实验要求编程将8253的定时定时器0设置为方式3(方波),定时器1设置为方式2(分频),定时器0输出的脉冲作为定时器1的时钟输入。定时器2(分频)。用示波器观察各引脚之间的对应关系。二、 验目的了解8253定时器的硬件连接方法及时序关系。掌握8253的各种模式的编程及原理,用示波器观察各信号之间的时序关系。三、 验电路8253中GATE0、GATE1、GATE2接+5V。CLK0接波特率开关边的F插孔,CLK1接OUT0、CLK2接OUT1。CS接200207孔。四、实验说明8253的工作频率是02MHZ,所以输入的CLK频率必须在2MHZ以下。实验板上的晶振是4.7456MHZ,因此必须经过8284和393分频后再作为8253的CLK输入(一般可以将波特率开关拨至9600,然后从开关边上的F插孔引出)五、实验程序框图开始关中断置定时器0为方式3送初值为200H置定时器1为方式2送初值为0AH置定时器2为方式2送初值为0AH结束实验十一 8279键盘显示实验一、实验要求利用8279键盘显示接口及板上提供的键盘和八位LED数码管,编写程序,在数码管上显示“AEDK86888”字样,按下实验机上任意键后,将键值显示在数码管上。按下结束键则返回DOS操作系统。二、 验目的1 熟悉并掌握系统中扩展8279键盘显示接口的方法。2 掌握8279工作原理和编程方法。三、 实验电路及连线8279的片选连至210217,K10插上短路套。四、 实验说明编程使8279工作在这样的状态:左边输入、八位显示,键盘外部译码,双键互锁。8279操作命令字较多,需灵活应用。五、 实验程序框图YNY开始初始化设定按键显示模式及扫描频率在数码管上显示AEDK8688置空FIFO RAM读入键值是否是结束键查表并将键值显示到数码管上清FIFO RAM清FIFO RAM并返回到DOSN是否有键按下是否有键按下是否结束实验十二 8255中断实验一、 实验要求编写程序,使8255工作于方式1,同时输入单脉冲,使8255发出中断请求信号。每产生一次中断请求,通过8255控制8个LED的亮灭状态发生一次改变,同时在PC机屏幕上显示已中断的次数。二、实验目的1 学习8255不同工作方式的编程;2 掌握8255与8259的综合应用。三、实验电路及连线五、 实验说明:键盘值的读取一般有两种方法:一种是扫描法,另一种是反转法。CS55接21821F孔,+PULSE接8255的PC6,8255的PC3接总线扩展槽的IRQ5,PA0PA7接DL1DL8。四、实验说明 当8255工作于方式1时,8255的PC口作为A口或B口的选通、应答及中断申请线。其中PC3作为INTR信号。PC6作为INTEA。五、实验程序框图置8255的工作方式开始写中断向量关中断允许IRQ5中断允许A口中断设10次中断开中断等待硬件中断中断入口显示中断信息改变LED的亮灭状态发中断结束命令到10次否中断返回返回DOSNY- 17 -附录:Win32汇编的环境和基础一.32位环境简介 在Dos下编汇编程序,我们可以管理系统的所有资源,我们可以改动系统中所有的内存,如自己改动内存控制块来分配内存,自己修改中断向量表来截获中断等,对其他操作也是如此,如我们对键盘端口直接操作就可以把键盘屏蔽掉,可以这样来描述Dos系统:系统只有一个特权级别,在编程上讲,任何程序和操作系统都是同级的,所以在Dos下,一个编得不好的程序会影响其他所有的程序,如一个程序把键盘口中断关掉了,所有程序就都不能从键盘获得键入的数据,直到任何一个程序重新打开键盘为止,一个程序陷入死循环,也没有其他程序可以把它终止掉。Dos下的编程思路是“单任务”的,你只要认为你的程序会按照你的流程一步步的执行下去,不必考虑先后问题(当然程序可能会被中断打断,但你可以认为它们会把环境恢复,如果中断程序没有把环境恢复,那是他们的错)。在内存管理方式上,Dos汇编和Win32汇编也有很多的不同:Dos工作在实模式下,我们可以寻址1M的内存,寻址时通过段寄存器来制定段的初始地址,每个段的大小为64K,超过1M的部分,就只能把他作为XMS使用,也就是说,只能用作数据存放使用而无法在其中执行程序。而Windows在保护模式下执行,这里所有的资源对应用程序来说都是被“保护”的:程序在执行中有级别之分,只有操作系统工作在最高级-0级中,所有应用程序都工作在3级中(Ring3), 在Ring3中,你无法直接访问IO端口,无法访问其他程序运行的内存,连向程序自己的代码段写入数据都是非法的,会在Windows的屏幕上冒出一个熟悉的蓝屏幕来。只有对Ring0的程序来说,系统才是全开放的。在内存方面,Windows使用了处理器的分页机制,使得对应用程序来说,所有的内存都是“平坦”的,你不必用一个段寄存器去指定段的地址,因为在保护模式下,段寄存器的含义是不同的(可以参见教材2.2节中的相关内容),你可以直接指定一个32位的地址来寻址4GB的内存。在程序结构方面,Windows程序也有很大的不同,它是“基于消息”的,你可以想象这样一个常见的Windows窗口,上面有几个按钮,如果你用Dos编程的思路去考虑,你会发现实现它很困难:鼠标移动到窗口边缘时拖动会改变窗口大小,鼠标点击按钮时再做要做的事,你会发现,你的程序自开始执行后就在等待,你不知道鼠标先会点什么地方,实际上你是在等待所有可能的事情的发生。而在Dos下,你可以只顾自己先执行,需要用户输入时,再停下来,你不输入我就不再执行,而且,我让你输入数据A你就不能输入数据B。二.Win32ASM编译器 Win32ASM的编译器最常用的有两种:Borland公司的Tasm5.0和Microsoft的Masm6.11以上版本,两种编译器各有自己的优缺点,Tasm带了一个不大不小的Import库,而Masm没有带,但Masm在代码的优化上面好象比Tasm做得好,但它却不带Import库。看来使用哪一种编译器还是比较难选择的,但Steve Hutchesson给了我们一个答案,他为Masm建立了一个很全的Import库,基本上包括了Windows绝大部分的Api函数,这些库、include文件和其他工具还有Masm6.14版本一起做成了一个 Masm32编译器 - Masm32V8。这样一来,我们用汇编编程就象用C一样方便。三.Masm32的环境设置 在Win32编程中,由于Windows有很多的数据结构和定义,这些都放在include文件中,还有连接时要用到Import库(通俗的讲就是Windows提供的DLL文件中的函数列表,也就是告诉程序到哪里去调用API函数),这些都放在include 和lib目录中。我们在编译时要指定以下的系统环境: set include=Masm32Includeset lib=Masm32libset path=Masm32Bin 这样编译器就会到正确的路径中去找 include 文件和 lib 文件。你可以自己在 autoexec.bat 文件中加上以上语句,为了产生Windows的PE格式的执行文件,在编译和连接中要指定相应的参数: 编译: Ml /c /coff 文件名.asm连接: Link /SUBSYSTEM:WINDOWS OBJ文件名.obj 资源文件名.res 为了不在每次编译时都要打这么多的参数,我们可以用 nmake 文件来代为执行,nmake 是代码维护程序,他会检查 .asm .obj .exe .res 等文件的时间,如果你更新了源程序,他会自动执行编译程序或连接程序产生相应的文件。你可以在文件名为 makefile 的文件中指定使用的编译器和连接程序以及相应的参数,下面是一个 makefile 文件的例子: NAME = ClockOBJS = $(NAME).objRES = $(NAME).res$(NAME).exe: $(OBJS) $(RES)Link /DEBUG /SUBSYSTEM:WINDOWS $(OBJS) $(RES) $(RES): $(NAME).rc Rc $(NAME).rc .asm.obj:Ml /c /coff $(NAME).asm 文件告诉 nmake程序,程序名为 clock,产生 clock.exe 文件需要 clock.obj和 clock.res 文件,而产生 clock.res 文件需要 clock.rc 文件,产生 clock.obj 文件要用到 clock.asm 文件,至于是否需要执行 ml, link 和 rc,程序会根据文件的时间自动判断。四、Win32ASM程序的结构和语法让我们先来看看一个最简单的Win32汇编程序:.386.model flat, stdcalloption casemap :none ; case sensitiveincludewindows.incincludekernel32.incincludelibkernel32.lib.dataszCaptiondbWin32汇编例子,0szTextdbWin32汇编,Simple and powerful!,0.codestart:invokeMessageBox,NULL,addr szText,addr szCaption,MB_OKinvokeExitProcess,NULLendstart这就是一个能执行的最简单的Win32汇编程序,下面我简单地介绍一下各部分的作用:.386这条语句和Dos下汇编是一样的,是告诉编译器我们要用到80386的指令集,因为32位汇编程序要用到32位的寄存器如eax,ebx等,所以这一句是必须的,当然,你也可以用.486,.586等,当用到特权指令时,还可以用 .386p,.486p等等。.model flat,stdcall.model告诉编译器程序的模式,编过Dos汇编的人可能知道在Dos程序的模式有tiny,small,.huge 等,它指定了程序内存寻址模式,在huge等模式下,内存寻址和子程序调用将用Far的格式,但在Win32汇编中,你只能使用一个模式即 flat 模式,因为对Win32程序来说,内存是连续的一个4GB的段,无所谓小或大的模式。而stdcall 告诉编译器参数的传递方式,在调用子程序时,参数是通过堆栈传递的,参数的传递方式有三种,stdcall,c 和 pascal,stdcall 指定了参数是从右到左压入堆栈的,比如说对一个Windows API 如 MessageBox,在手册中是如此定义的:int MessageBox( HWND hWnd, / handle of owner window LPCTSTR lpText,/ address of text in message box LPCTSTR lpCaption, / address of title of message box UINT uType / style of message box );那么在汇编中我们就可以这样调用它:pushuTypepushlpCaptionpushlpTextpushhWndcallMessageBox大家要注意最前面的参数是最后一个进堆栈的,当然,我们不必这样麻烦的调用一个 API,因为Masm中的一个宏语句不但帮助我们完成了所有的压栈操作,还帮我们检查参数的个数是否正确,那就是 invoke 语句,我们可以把上面的语句换成 invoke MessageBox,hWnd,lpText,lpCaption,uType 就行了。如本程序中代入实际参数就成了 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK。include 语句include 语句包含了一些系统的定义和API函说明,其中所有的Windows 数据结构定义和常量定义包含在 windows.inc 中,而其他 API函数的说明包含在 xxx.inc 中, 如查 Microsoft Win32 Programmers Reference 知道 ExitProcess包含在kernel32.dll 中,那么我们就要在程序中包括 include kernel32.inc 和 includelib kernel32.lib语句,否则在编译时会出现 API 函数未定义的错误。而 MessageBox 在 user32.dll 中,那么我们就要在程序中包括 include user32.inc 和 includelib user32.lib语句.data 或 .data?指明了接下来是数据段,.data 定义了预定义的变量,.data?定义了未初始化的变量,两者的不同之处是 .data? 定义的变量并不占用 .exe 文件的大小,而是在程序执行时动态分配,所以开始是不指定初始值的数据可以放在 .data? 段中,如一个1K大小的缓冲区,放在 .data?中,程序将不会增加一个字节。.code指明了接下来是代码段,我们的所有代码都放在这里。最后的一句 start 语句指定了程序开始执行的语句。程序中的 ExitProcess 是一个标准的 Win32 API,对应 Dos汇编中的 int 20h 或 mov ah,4ch/int 21h,也就是程序退出。而 MessageBox 也是一个标准的 API,功能是在屏幕上显示一个消息框,具体的参数上面已经解释过了还有要注意的是 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK 语句中, MB_OK 和 NULL 已经预定义在 Windows.inc 中。五、一个简单的对话框 - 资源文件的使用1、Windows 的资源文件不管在Dos下编程还是在Windows下编程,我们总是要用到除了可执行文件外的很多其他数据,如声音数据,图形数据,文本等等,在Dos下编程,我们可以自己定义这些文件的格式,但这样一来就造成了很多资源共享的问题,大家可能还记的Dos下的很多游戏,它们的图形都是按自己的格式存放的,你无法用标准的看图软件来看。也无法把它另存为其他格式。虽然在Win32编程中,我们仍然可以这样做,但Win32编程给了我们一个方案 - 就是格式统一的资源文件,把字符串、图形、对话框包括上面的按钮,文本等定义到一个资源文件中,就可以方便的在不同的文件中使用它,最重要的是,如果我们用自己的文件格式,使用时就要涉及到这些文件的读写操作,比较复杂,但使用资源文件时,Windows提供了一系列的API来装入资源。非常方便。现在,让我们来看一个很简单的资源文件的源文件,它的扩展名是 .rc,当它用资源编译器编译以后产生 .res 文件就可以在 link的时候连入.exe 文件中:#include#defineDLG_MAIN1DLG_MAINDIALOGEX 0, 0, 236, 185STYLEDS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENUCAPTION对话框模板FONT9, 宋体BEGINDEFPUSHBUTTON退出,IDOK,177,163,50,14CONTROL,-1,Static,SS_ETCHEDHORZ,7,155,222,1END现在我简单解释一下 .rc文件的语法:#include - resource.h文件包括资源文件的一些常量定义,如下面的 WS_POPUP,WS_VISIBLE 等窗口的风格等等#define DLG_MAIN 1 - 类似于 .asm 文件的 equ 语句,和汇编源程序一样,这些定义是为了程序的可读性。DLG_MAIN DIALOGEX 0,0,236,185Windows的.rc文件可以定义 BITMAP(位图),CURSOR(光标),ICON(图标),ACCELERATORS(加速键),DIALOG(对话框),MENU(菜单),STRINGTABLE(字符串表),RCDATA(自定义资源)等8种资源,详细的描述可以参考有关MFC的书籍,在Win32ASM中的资源编译器的语法中,一般格式是这些资源的定义方法是:位图定义: nameID BITMAP load-mem filename光标定义: nameID CURSOR load-mem filename 图标定义: nameID ICON load-mem filename 加速键定义:acctablename ACCELERATORS optional-statementsBEGIN event, idvalue, type options . .END 等等,具体的定义和参数可以参考 Masm32v5 中的 Rc.hlp 帮助文件。我们可以用资源编辑器来所见即所得地编辑资源,也可以在文本编辑器中用上面这些语句自己定义资源。2、在程序中使用资源在程序中,要使用资源之前必须先装如内存,Windows定义了一系列的API来装入资源,如 LoadMenu,LoadString,LoadBitmap 等等,如 LoadBitmap 的定义: HBITMAP LoadBitmap( HINSTANCE hInstance, / handle of application instance LPCTSTR lpBitmapName / address of bitmap resource name ); 这些Load函数的返回值是一个句柄,调用参数中一般至少为两项: hInstance 和 ResouceName,这个 ResouceName(如BitmapName,MenuName)就是在资源文件中的 #define 指定的值,如果你用 #define MY_ICON 10/ MY_ICON ICON Main.ico 定义了一个图标,那么在程序中要使用 Main.ico 图标就可以用 LoadIcon(hInstance,10) 来装入已经定义为10号的图标文件。另一个参数 hInstance 是执行文件的句柄,它对应资源所在的文件名,你可以在程序开始执行时用 invoke GetModuleHandle,NULL 获得 hInstance。另外一些资源并不是显式地装入的,如对话框资源,它是在建立对话框的函数中由Windows自己装入的,如下面例子中的 invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0 ,是在屏幕上显示一个资源文件中已经定义好了的对话框,就并不存在 LoadDialogBox 之类的API来先装入对话框。3、Win32ASM - 显示一个对话框介绍了这么多相关的东西,现在让我们来看看如何显示一个对话框,源程序如下: .386.model flat, stdcalloption casemap :none ; case sensitiveincludewindows.incincludeuser32.incincludekernel32.incincludecomctl32.incincludecomdlg32.incincludelibuser32.libincludelibkernel32.libincludelibcomctl32.libincludelibcomdlg32.libDLG_MAINequ1.data?hInstancedd?szBufferdb256 dup(?)_ProcDlgMainPROTO:DWORD,:DWORD,:DWORD,:DWORD.data.code;*_ProcDlgMainprocuses ebx edi esi, hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORDmoveax,wMsg.ifeax = WM_CLOSEinvokeEndDialog,hWnd,NULL.elseifeax = WM_INITDIALOG.elseifeax = WM_COMMANDmoveax,wParam.ifeax = IDOKinvokeEndDialog,hWnd,NULL.elseif eax = IDCANCELinvokeEndDialog,hWnd,NULL.endif.elsemoveax,FALSEret.endif moveax,TRUEret_ProcDlgMain endp;*start:InvokeInitCommonControlsinvokeGetModuleHandle,NULLmovhInstance,eaxinvokeDialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0invokeExitProcess,NULLendstart看了前面几篇文章以后,这儿的大部分语句应该是很熟悉了,我来讲解几句新的语句:_ProcDlgMain PROTO :DWORD,:DWORD,:DWORD,:DWORDPROTO 语句类似于C语言中的函数定义,在Win32汇编中,如果子程序的定义在引用以后,你就必须先定义,当然,这个定义是针对 invoke 语句和其他带参数的调用的,如果你的子程序没有参数,你就可以用 call 指令去调用它而不是用宏指令 invoke,这时候你就不必声明这个函数。_ProcDlgMain proc uses ebx edi esi, hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD这个定义 proc 的语句应该是不陌生的,要重复讲解一下的是 uses 和 下面的参数,uses 下的寄存器表示要编译器自动插入保存及恢复这些寄存器的指令, 是在 Masm32 中接下一行的符号,表示下一行是本行的继续内容,以避免一行中的内容过长。下面的 hWnd:DWORD 等语句定义了调用这个子程序的参数,如果有以下定义 MyProc proc dwPara1:DWORD,dwPara2:DWORD,dwPara3:DWORD,然后你用 invoke MyProc 1,2,3 来调用它,那么,1,2,3 将分别被赋值给 dwPara1,dwPara2,dwPara3,你可以在子程序中使用这些传递过来的参数。如果参数的类型是双字,那么:DWORD 可以省略。.if/.else/.elseif/.endif这些语句是宏指令,实际上不说你也知道它们的意思,有了这些宏指令,我们就可以把汇编编得象C一样结构清晰,而不必老是看到 jmp 指令了,当然,这只不过编译器帮你做了这些事情而已,如果你去反汇编一下,你开始会看到一大堆 jmp 指令,.if 的格式如下.if eax = 1 如果eax等于1.if eax != 1 如果eax不等于1.if eax != 1 & ebx != 2 如果eax不等于1且ebx不等于2.if eax = 1 | ebx = 2 如果eax等于1或者ebx等于2其他的宏指令还有 .while/.endw .break 等等,可以参考汇编教材。最后要讲到的就是 DialogBoxParam 这个API了,在Windows中,所有的窗口都要指定一个子程序,当Windows检测到鼠标、定时器等和这个窗口有关的动作时,它回调用这个子程序,这就是Windows基于消息的体系的最基本的概念,换句话说,在Dos下,我们通过INT指令调用系统,而在Windows 下,有很多时候是你指定子程序地址让Windows来调用你。 invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0中的 offset _ProcDlgMain 就指定了如果有消息发生,Windows就来执行这个子程序,参数中的 DLG_MAIN 就是在资源文件中定义的对话框模板编号。 hInstance 是对话框所在的资源文件的句柄。另外,在_ProcDlgMain 子程序中,Windows传给我们4个参数hWnd,wMsg,wParam,lParam,其中,hWnd是对话框的窗口句柄,wMsg表示现在发生的消息事件,如这个对话框初始化时Windows会以WM_INITDIALOG为消息调用,关闭时为WM_CLOSE,按下对话框上的按钮时为WM_COMMAND等,wParam和lParam是附加的参数,对应不同的消息对应不同定义,具体可以参考Win32 Programmers reference。六、定时器的应用概述Windows 的定时器是一种输入设备,它周期性地在指定的间隔时间通知应用程序。它可以用向指定窗口发送 WM_TIMER 消息或者调用指定的过程来执行用户的程序。定时器的应用主要包括下面一些地方: 1. 时钟程序 - 显然,这是定时器最直接的应用。 2. 多任务 - 如果程序有大量的数据处理,除了用多线程的办法,还可以用定时器,在每一个定时器消息中处理一小块内容。 3. 定时显示程序的状况 - 定时器就相当于 Dos 编程中的自己挂接在 int 1ch 上面的要定时处理的程序,它可以定时显示程序运行的情况,如发送了多少内容,接收了多到内容等等。 4. 在游戏程序中使用定时器可以消除在不同处理器下用延时来保持速度一致所造成的误差。 5. 用于数据流处理 - 在音频、视频的播放中,需要隔一段时间处理一段数据。 总的来说,在 Dos 下实现精确定时的唯一方法是在 int 1ch 时钟中断中处理程序,但你使用起来必须遵守很多的规范,而在 Windows 的定时器中,你可以用 SetTimer 函数分配不止一个的定时器,比如说,在你的文本编辑程序中,你可以使用一个间隔1秒的定时器来在状态栏中显示时钟,同时分配一个10分钟的定时器来实现定时存盘的功能。定时器实际上是 Windows 对时钟中断的一种扩展,它的本质还是基于时钟中断的,所以你实际上无法把定时器的间隔设置到55毫秒以下,另外,定时器的精度也是以55毫秒为倍数的,比如说,你设置了一个1秒的定时器,它实际上是在每989毫秒的时候发生的。和在 Dos 下使用时钟中断,windows 的定时器还有下面一些要点: 1. 在 Dos 中,你的程序随时可能被 int 1ch 打断,而在Windows 中,Windows 通过 WM_TIMER 消息把定时器消息放入正常的消息队列中,所以你不必担心你的程序在别的处理中被定时器打断。 2. 不可能有同时两条以上的 WM_TIMER 消息,如果在一个还在消息队列中,窗口再得到一条 WM_TIMER 消息,两条消息会被合并为一条,所以在程序比较忙的时候可能会丢失 WM_TIMER 消息。 3. WM_TIMER 消息的级别是很低的,程序只有在消息队列中没有其他消息的情况下,才会接收 WM_TIMER 消息,你可以通过以下方法验证:在一个设置了定时器的窗口上按住标题栏移动窗口,你会发现定时器停止了工作,当你松开鼠标后,在这个过程中丢失的 WM_TIMER 消息并没有被补上,4. 所以如果你设计一个时钟程序,你不能使用定时器消息来计数,而必须在消息中每次获取正确的系统时间。 讲了这么多定时器的特点,下面是定时器相关的API,你会发现除了在使用中要注意的这些特性,定时器的API真是又少又简单: 1. 建立定时器SetTimer( HWND hWnd, / handle of window for timer messages UINT nIDEvent, / timer identifier UINT uElapse, / time-out value TIMERPROC lpTim

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论