ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:200.79KB ,
资源ID:24558778      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24558778.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第六章 输入输出和WIN32编程.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第六章 输入输出和WIN32编程.docx

1、第六章 输入输出和WIN32编程第六章 输入/输出和中断和WIN32编程前面已经讲过有关输入/输出的问题,主要是用DOS中断调用INT 21H来完成键盘输入以及屏幕显示。对于计算机来说,仅有这种输入/输出还不够,因为DOS的中断调用无法实现对其它外设的控制。关于如何用汇编程序实现主机与外设之间的信息交换,将是本章的主要内容。包括:输入输出指令的使用格式及功能;主机与外部设备之间传送数据的方式;中断的概念及中断处理程序设计;WIN32程序设计基本方法与技术。I/O设备与数据传送方式主机与外设之间数据的传送方式计算机与外设之间传送数据有如下4中方式:1. 无条件传送方式:适合于CPU与外设同步的情

2、况。直接传送,高速外设与主机之间数据传送。2. 查询传送方式:适合于低速外设与主机之间数据传送。3. 中断传送方式:适合于低速外设与主机之间数据传送。4. 直接存贮器(又称DMA)传送方式:适合于高速外存与主机的数据传送。其中:无条件传送和查询传送,直接在端口上利用IN和OUT指令传送数据。中断传送:在DOS及BIOS层上通过系统功能调用的中断指令实现。直接存贮方式:在端口上,采用通道技术实现。在计算机准备好接收,外设准备好传送数据时,外设向CPU发一个请求DMA传送信号,此时CPU让出总线控制权,使外设与主存在短时间内成批传送数据。外设与主机传送的接口与信息1. 端口与接口计算机的外设都是通

3、过接口连接到系统上,每个接口由一组寄存器组成,寄存器都有一个称为I/O端口的地址编码。也就是,每一台外设都通过硬件接口与主机端口相连,并交换信息。接口的组成:设备状态寄存器、设备控制寄存器、数据寄存器。上述寄存器在I/O空间中都有固定编码。I/O端口的地址空间:允许设置64K个8位端口或32K个16位端口。对I/O空间的访问用IN或OUT两个指令。I/O端口地址分配,可以查手册。如:40H43H时钟/定时器,60H63H为8255通讯芯片的接口。2. 外设与主机的信息交换传送的信息分为三类:1 控制信息:CPU把控制信息从端口输出到对应外设接口的控制寄存器中,告诉外设应做什么。2 状态信息:把

4、外设的状态寄存器中的内容送到对应的端口中,以便CPU了解外设状态。3 数据信息:需要交换的数据(8位、16位)。程序直接控制I/O方式直接I/O方式有两种:1 无条件传送方式:不查询外设状态寄存器的状态,直接用IN或OUT指令实现CPU与外设信息传送。该方式的特点是:CPU与外设必须同步工作。2 查询传送方式:查询外设状态和控制寄存器中的内容,确定是否传送。特点:CPU与外设不同步。IN和OUT指令通过前面的学习,我们已经知道,外设与主机传送信息,必须用IN和OUT指令。1. 输入指令IN功能:从外设寄存器取信息送入AX或AL。4种形式:IN AL, PORT 功能:(PORT)ALIN AX

5、, PORT 功能:(PORT+1,PORT)AXIN AL, DX 功能:(DX)ALIN AX, DX 功能:(DX)AX由AL或AX决定取几个端口的内容。2. 输出指令OUT功能:将AX或AL内容送到外设寄存器中。4种形式:OUT PORT, AL 功能:(AL)PORTOUT PORT, AX 功能:(AX)PORT(2个8位口)OUT DX, AL 功能:(AL)DXOUT DX, AX 功能:(AX)DX同样,由AL或AX决定送到几个端口。如:IN AL, 40HOUT 80H, ALMOV DX, 379HIN AL, DX注意:端口地址255,就放到DX中。程序直接控制传送方式

6、1. 无条件传送方式特点:不查询外设状态,直接用IN和OUT指令传送信息。采用这种方式,必须保证外设与CPU在传送数据的过程中,具有相同速度(同步)。例:扬声器发声程序。已知扬声器的控制寄存器的端口地址为61H,硬件结构如下:程序通过I/O指令,使设备控制寄存器的b1位为0或1(交替为0或1),与门的输入为0和1交替的电信号,输出为一个脉冲电流,经放大后,送扬声器使之发声。STACK SEGMENT STACK DB 200 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE, SS:STACKBEGIN: MOV DX, 100; 开关次数100 IN AL

7、, 61H AND AL, 1111 1100B; 最低2位变为0S1: XOR AL, 2; 第1次b1为0,第2次b1为1 OUT 61H, AL MOV CX, 140H; 延时一段时间(声音频率)WAIT1: LOOP WAIT1 DEC DX JNE S1 MOV AH, 4CH INT 21HCODE ENDS END BEGIN2. 查询传送方式特点:查询外设状态,条件满足时传送。适合于低速外设与CPU传送信息。1 输入输入之前,查询数据是否准备好,若准备好则输入,否则等待。流程:例:串行通讯I/O。串行通讯端口:采用8250芯片,数据寄存器端口地址为3F8H,状态寄存器端口地址

8、为3FDH,其中b0位是输入数据数据准备位,b5位是输出数据准备位。串行口输入程序:C_IN PROC FAR PUSH DX MOV DX, 3FDHC1: IN AL, DX; 读入状态 TEST AL, 01H; 测试b0位,b0=1,数据准备好 JZ C1 MOV DX, 3F8H IN AL, DX; 接收一个字符 POP DX RETC_IN ENDP2 输出输出之前,要查询外设是否“忙”,若“忙”则等待,否则输出数据。流程:例:串行口输出子程序。C_OUT PROC FAR PUSH DX PUSH AX MOV DX, 3FDHC2: IN AL, DX; 读入状态 TEST

9、AL, 20H; 测试b5位,b5=1,准备好接收 JZ C2 POP AX MOV DX,3F8H OUT DX, AL; 输出一个字符 POP DX RETC_OUT ENDP查询方式的缺点:CPU反复等待状态位,浪费大量CPU资源。中断传送方式为了解决查询方式下,CPU等待外设,浪费大量CPU资源的问题,提出了中断传送方式。引入中断之后,有如下优点:1 提高CPU效率2 可以处理突发事件3 提高了计算机工作的灵活性在中断方式下,程序设计的主要任务:设置中断向量、编制中断处理程序。中断的概念中断是一种使CPU中止正在执行的程序,而转去处理特殊事件的操作,处理结束之后,又返回到断点处继续往下

10、执行。中断的处理过程:中断请求、中断响应、中断处理、中断返回。中断系统:实现中断的软硬件设施。其中,硬件有:8259A、中断源、中断请求等。软件有:中断向量表、中断处理程序。中断源(内中断/外中断) 内中断来自CPU内部事件:1 程序中使用的INT指令产生的中断;2 CPU的某些错误结果产生的中断(除法、溢出、单步)。内中断的处理特点:1 中断类型号一般在指令中;2 不受中断允许标志位IF的影响。 外中断由外设控制器、协处理器等CPU以外的事件引起的中断,称为外中断。外中断的处理特点:1 中断类型号由8259A提供,或由自制电路来提供;2 受中断允许标志位IF的影响(IF=1,响应中断)。80

11、86/8088中断源:不可屏蔽中断请求由硬件故障引起:掉电、存贮器错、总线奇偶校验错等。8086系统中断优先级:其中,“INT n”可处理256种中断,n的范围:BIOS中断:10H1FHDOS中断:20H3FH自由中断:40HFFH中断向量表1. 中断向量表的结构中断向量表就是各种中断类型的处理程序的入口地址表。内存中从00000H003FFH用于存放中断向量表。中断类型:0FFH,每个类型的中断占4个字节。如:INT 4AH中断向量地址 = 4AH*4 = 128H2. 中断类型号的获取(1) 除法错、单步中断、不可屏蔽中断NMI、断点中断、溢出中断(中断号04)。中断类型号由CPU芯片内

12、的部件自动提供。(2) 软中断INT n,执行时从指令流中读出类型号。(3) 外中断1 标准外设,利用8259A提供的类型号;2 非标准外设,自制电路通过接口提供给总线,获得类型号。3. 设置或取出中断向量指令(1) 设置中断向量指令功能:把由AL指定的中断类型的中断向量DS:DX放入中断向量表中。(AH)=25H(AL)=中断类型号DS:DX=中断向量INT 21H(2) 取出中断向量指令功能:把AL中指定的中断类型的中断向量从中断向量表中取出送到ES:DX中。(AH)=35H(AL)=中断类型号INT 21H4. 保护方式下的中断向量表在保护方式下,中断矢量表称作中断描述符表(IDT),按

13、照统一的描述符风格定义其中的表项;每个表项(称作门描述符)存放中断处理程序的入口地址以及类别、权限等信息,占8个字节,共占用2KB的主存空间。IDTR决定IDT的起始PA。软中断及中断的有关指令1. 软中断形式:INT n功能:1 (FLAGS)(SP) 同时0IF、TF2 (CS)(SP) (4*n+2)CS3 (IP)(SP) (4*n)IP2. 中断返回形式:IRET。功能:1 (SP)IP2 (SP)CS3 (SP)FLAGS举例用空闲的中断类型号45H,做新增的软中断类型号,实现功能:将AX中的内容以十六进制形式在屏幕上输出。 实现步骤:(1) 按指定功能编制中断处理子程序(2) 在

14、中断向量表中,找出一个空闲的中断号N(3) 将新编制的中断处理子程序的入口地址送入中断向量表4*N 4*N + 3这四个字节中(4) 调用“INT N”调用N号中断,执行新增的中断处理子程序.386STATCK SEGMENT USE16 STACKDB 200 DUP(0)STACK ENDSDATA SEGMENT USE16DATA ENDSCODE SEGMENT USE16 ASSUME CS: CODE, SS: STACK, DS: DATASTART: MOV AX, 0 MOV DS, 0 CLI MOV WORD PTR DS: 45H * 4, OFFSET INTR45

15、 MOV WORD PTR DS: 45H * 4 + 2, CS STI MOV AX, DATA MOV DS, AX LEA SI, BUF MOV CX, NL1: MOV AX, SI INT 45H MOV AH, 2 MOV DL, 20H INT 21H ADD SI, 2 LOOP L1 MOV AH, 4CH INT 21HINTR45 PROC FAR PUSHA ; 16进制输出AX中的内容 POPA IRETINTR45 ENDPCODE ENDS END START注意:(1) 在中断处理子程序中,必须保护和恢复现场(2) 设置中断向量前CLI,设置中断向量后CLI

16、(3) 利用IRET实现中断返回WIN32编程WIN32编程基础1. 段的简化定义(1) 使用简化的段定义后,16位程序结构如下:.MODEL SMALL.386.STACK 200.DATA.CODESTART: MOV AX, DATA MOV DS, AX MOV AH, 4CH INT 21H END START(2) 使用简化的段定义,32位程序结构如下:.386.MODEL FLAT STDCALLOPTION CASEMAP: NONEINCLUDE KENEL32.INCINCLUDE USER32.INCINCLUDE GDI32.INCINCLUDE KERNEL32.LI

17、BINCLUDE USER32.LIBINCLUDE GDI32.LIB.STACK.DATA.CODESTART:INVOKE ExitProcess, 0END START2. 控制伪指令32位汇编提供了类似高级语言的分支控制伪指令和循环控制伪指令(1)分支控制伪指令格式:.IF 条件表达式语句序列.ELSEIF 条件表达式语句序列 .ELSE 语句序列 .ENDIF功能:实现条件控制注意:条件表达式中的关系操作符包括:=, !=, , =, , =, &, |, !(和C语言中的类似)(2) 循环控制伪指令格式:.WHILE 条件表达式 循环体 .ENDW格式:.REPEAT 循环体 .

18、UNTIL 条件表达式功能:实现循环结构格式:.BREAK功能:退出当前循环格式:.CONTINUE功能:终止本次循环,开始下一次循环3. 函数的定义、调用与说明32位汇编提供了函数的定义、调用与说明伪指令(1)函数定义伪指令:格式:函数名 PROC 函数类型语言类型USES寄存器表参数名: 参数类型(2) 函数调用伪指令:格式:INVOKE 函数名, 参数 例:RADIX_S PROC NEAR STDCALL USES EBX, EDX, SI,lpResult: WORD, Radix: DWORD, Num: DWORDLOCAL Count: WORDRETRADIX_S ENPIN

19、VOKE RADIX_S, SI, 10, EAX(3) 函数说明伪指令格式: 函数名 PROTO 函数类型语言类型USES寄存器表参数名: 参数类型功能:说明本模块中要调用的函数,类似于EXTRN外模块中的WIN32函数,例如WIN32 API DLL中的函数,需要用PROTO说明后,才能用INVOKE调用。WIN32 API函数的说明,一般放在.INC头文件中,也可以单个地在主程序中说明。4. WIN32编程环境、库和头文件(1) WIN32编程环境 使用MASM32工具包; 目录介绍MASM32BIN:可执行目录MASM32INCLUDE:头文件目录MASM32LIB:导入库文件目录 汇

20、编过程:生成源程序文件:A.ASM生成资源脚本文件:A.RC生成目标程序:“ML /c /coff A.ASM”,得到A.OBJ生成资源文件:“RC A.RC”,得到A.RES生成可执行程序:“LINK /subsystem: windows A.OBJ A.RES”,得到A.EXE(2) 库和头文件WIN32编程不再使用DOS系统功能调用,而使用WIN32 API函数。这些WIN32函数在Windows提供的动态链接库中。WIN32编程环境提供了:动态链接库.DLL 函数实体相应的导入库.LIBlink时的接口函数说明.INC函数说明基本的WIN32函数库包括:内核函数库KERNEL32.D

21、LLKERNEL32.LIBKERNEL32.INC处理内存管理和进程调度用户界面函数库USER32.DLLUSER32.LIBUSER32.INC处理窗口、基本用户界面及特性图形函数库GDI32.DLLGDI32.LIBGDI32.INC处理画图操作WINDOW.INC常用杂项WIN32程序的结构Windows是一个多任务的操作系统,允许多个程序同时运行。其关键是:应用程序以窗口作输入/输出界面;以消息驱动;程序内部有一个消息循环。1. 无消息循环的WIN32程序.386.MODEL FLAT STDCALLOPTION CASEMAP: NONEINCLUDE WINDOWS.INCINC

22、LUDE KENEL32.INCINCLUDE USER32.INCINCLUDE GDI32.INCINCLUDE KERNEL32.LIBINCLUDE USER32.LIBINCLUDE GDI32.LIB.STACK.DATA;-Msg1 DB title test, 0Msg2 DB hello world!, 0;-.CODESTART:;-INVOKE MessageBoxA, 0, ADDR Msg2, ADDR Msg1, MB_OK;-INVOKE ExitProcess, 0END START2. 有消息循环的WIN32程序完整的Windows程序依靠消息来驱动。每个程序

23、中有一个“死循环”消息循环。程序不断等待可能输入的消息,然后对消息作判断,然后再做适当的处理。(1) 消息驱动机制(2) 框架.386.MODEL FLAT STDCALLOPTION CASEMAP: NONEINCLUDE WINDOWS.INCINCLUDE KENEL32.INCINCLUDE USER32.INCINCLUDE GDI32.INCINCLUDE KERNEL32.LIBINCLUDE USER32.LIBINCLUDE GDI32.LIB.STACK.DATA.CODESTART:;-invoke WinMain, hInstance, NULL, CommandLi

24、ne, SW_SHOWDEFAULTinvoke ExitProcess, 0;-WinMain PROC hInst: dword, hPrevInst: dword, CmdLine: dword, CmdShow: dwordmov wc.lpfnWndProc, offset WndProcinvoke RegisterClassEx, addr wcinvoke CreateWindowEx, WS_EX_ACCEPTFILES + WS_EX_APPWINDOW, addr szClassName, StartLoop: invoke GetMessage, addr msg, N

25、ULL, 0, 0 cmp eax, 0 je ExitLoop invoke TranslateMessage, addr msg invoke DispatchMessage, addr msg jmp StartLoopExitLoop: mov eax, msg.wParam retWinMain endpWndProc proc hWin: dword, uMsg: dword, wParam: dword, lParam: dword.if uMsg = WM_COMMAND .if wParam = 1000 invoke FileOpen, addr szOpenFileNam

26、e .elseif wParam = 1100 invoke MessageBox, hWin, addr TheText, addr szDisplayName, MB_YESNO .endif mov eax, 0 retWndProc endpFileOpen proc lpszFileName: dword invoke CreateFile, lpszFileName, invoke ReadFile, hFile, addr Buf, retFileOpen endp end start说明:(1) GetMessage()从应用程序的消息队列中取一个消息(2) DispatchMessage()分发消息,触发WndProc()函数(3) WndProc()是一个回调函数(类似于中断处理子程序),一般不直接调用,而是在分发一个消息后,Windows系统根据分发的消息调用(被OS调用,触发)(4) WndProc()根据不同的消息,调用不同的处理函数第四次上机1. 将实验3中的求n个数的平均值、最大值、最小值用软中断实现。2. 将实验3用windows程序实现。实验报告内容包括:1. 题目2. 源码3. 注释

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1