微机原理与接口技术-第七章输入输出接口

news2024/10/3 18:24:59

文章目录

  • I/O接口概述
      • I/O接口的典型结构
      • 基本功能
    • I/O端口的编址
      • 独立编址
      • 统一编址
    • 输入输出指令
      • I/O寻址方式
      • I/O数据传输量
      • I/O保护
    • 16位DOS应用程序
      • DOS平台的源程序框架
      • DOS功能调用
  • 无条件传送和查询传送
    • 无条件传送
      • 三态缓冲器
      • 锁存器
      • 接口电路
    • 查询传送
      • 查询输入端口
      • 查询输出端口
  • 中断控制系统
    • 中断传送
    • 中断源识别
    • 中断优先权排队
    • 中断嵌套
    • IA-32的中断系统
      • 内部中断
      • 外部中断
      • 中断和异常的响应过程
      • 中断描述符和中断向量表
    • 内部中断服务程序
      • 特点
    • 中断控制器
      • 8259A的寄存器
      • 8259A的工作方式
    • 外部中断服务程序

I/O接口概述

I/O接口的典型结构

  • 内部结构
    I/O接口电路实际是比较复杂的,但从应用角度,我们可以简化为3类可编程的寄存器,分别对应3类信号。
  1. 数据寄存器:保存处理器和外设之间交换的数据,可以分为数据输入寄存器和数据输出寄存器
  2. 状态寄存器:保存外设或其接口电路当前的工作状态信息
  3. 控制寄存器:保存处理器控制接口电路和外设操作的有关信息
  • 外部特性
    接口电路位于处理器和外设之间,起着桥梁作用
  1. 面向处理器一侧的信号与处理器总线或系统总线类似,有数据信号、地址信号、控制信号,以方便与处理器连接
  2. 面向外设一侧的信号与外设有关,以便与外设连接,由于外设种类太多,面向外设的一侧也各不相同。

基本功能

  1. 数据缓冲
  2. 信号变换

I/O端口的编址

独立编址

独立编址是将I/O端口单独编排地址,独立于存储器地址。

  • 优点
    1. 不占用存储器空间
    2. 专门的I/O指令比较清晰
  • 缺点:I/O指令功能简单,寻址方式没有存储器丰富
    80x86采用独立编址方式,只使用最低16位地址信号,对应64K个8位I/O端口,这64K地址空间补需要分段管理,只能使用指令输入指令IN,和输出指令OUT访问

统一编址

统一编址是将I/O端口和存储器地址统一编排,共享一个地址空间。

  • 优点
    1. 不需要设计专门的I/O指令和引脚
    2. 具有和存储器寻址一样丰富的寻址方式
  • 缺点
    1. 占用存储地址空间
    2. 通过指令不易辨认是I/O操作

输入输出指令

  • 输入指令IN AL/AX/EAX, i8/DX
  • 输出指令OUT i8/DX, AL/AX/EAX

I/O寻址方式

IA-32处理器的I/O寻址方式只有两种,直接寻址和通过DX间接寻址

  • 直接寻址:由I/O指令直接提供8位I/O地址,只能寻址最低256个I/O地址(00-FFH)
  • 间接寻址:用DX寄存器保存访问的I/O地址,能访问的地址(0000-FFFFH)

I/O数据传输量

IN/OUT指令只允许通过累加寄存器EAX与外设交换数据。8位I/O指令使用AL,16位I/O指令使用AX,32位I/O指令使用EAX

  • IN指令:外设数据进入处理器的AL/AX/EAX
  • OUT指令:处理器数据通过AL/AX/EAX送出
in al, 21h ;从地址为21H的I/O端口读一个字节数据到AL
mov dx, 300h ;DX指向300H端口
out dx, al ;将AL中的字节数据送到地址为300H(DX)的I/O端口

I/O保护

对于输入输出指令INOUTINSOUTS,还有中断标志设置指令CLISTI的执行涉及I/O端口,称之为I/O敏感指令。
标志寄存器EFLAGS有一个IOPL字段,表示程序具有的I/O特权级,只有程序的当前特权级低于或等于I/O特权级,I/O敏感指令才可以执行

16位DOS应用程序

DOS平台的源程序框架

; eg0700.asm in DOS
	include io16.inc	;包含16位输入输出文件
	.data 	;定义数据段代填
	...
	.code	;定义代码段
start:
	mov ax, @data
	mov ds, ax
	.....
	exit 0	;程序正常执行结束
	.....
	end start	;汇编结束

eg:输出Hello World

	include io16.inc
	.data
msg	byte 'Hello, Assembly!', 13, 10, 0	;定义要显示的字符串
	.code
start:
	mov ax,@data
	mov ds,ax
	mov eax, offset msg
	call dispmsg
	exit 0
	end start

DOS功能调用

DOS利用软件中断方式提供系统功能。IA-32处理器支持256个中断,每个中断用一个中断编号区别,即中断0~中断255号,中断调用指令是INT N,其中N表示调用的中断号。
DOS系统调用一般有如下四个步骤:

  1. 在AH寄存器中设置系统功能调用号
  2. 在指定寄存器中设置入口参数
  3. 用中断调用指令(INT N)执行功能调用
  4. 根据出口参数分析功能调用的执行情况
    1、3这两个步骤是一定需要的,2、4只是某些指令会用到
    DOS功能调用的终端号主要是21H,利用AH寄存器区别各种子功能
    image
    dispmsg子程序
dispmsg	proc
		push eax
		push ebx
		push edx
		mov ebx, eax
dispm1:	mov al, [ebx] ;取一个字符
		test al, al	;判断是否结尾(0)
		jz	dispmsg2
		mov ah, 2	;AH=2,显示一个字符的DOS功能
		mov dl, al	;设置入口参数
		int	21h		;调用DOS(INT 21H)系统功能
		inc ebx
		jmp	dispm1
dispm2: pop edx
		pop ebx
		pop eax
		ret
dispmsg	endp

无条件传送和查询传送

I/O接口的主要功能之一就是实现外设和主机的数据传送。数据传送可以通过处理器执行I/O指令完成,分为无条件传送、查询传送、中断传送。外设数据传送还可以以硬件为主加快传输速度,如直接存储器存取(DMA)、使用专门的I/O处理器

无条件传送

有些设备状态很少变化,可以认为总是处于就绪状态,随时可以进行数据传送,这就是无条件传送,有时也称为立即传送或同步传送
用于无条件传送的I/O接口电路十分简单,接口中只考虑数据缓冲,不考虑信号联络

三态缓冲器

三态指的是01高阻值
image

锁存器

在输出接口电路中,一般会安排一个锁存环节(锁存器),以便将数据总线的数据暂时锁存,使较慢的设备有足够的时间进行处理,此时处理器可以利用系统总线完成其他工作。

接口电路

  • 74LS244:为输入端口
  • 74LS273:为输出端口
  • D0~D7:数据总线
  • A0~A15:地址线
  • 74LS06反相驱动器:相当于8个非门

image

mov dx, 8000h ;dx向输入端口
in al, ax 	;从输入端口读取开关状态
not al		;将开关取反
out dx, al	;送入输出端口
call delay	;调用子程序Dalay进行延时

查询传送

查询传送也称为异步传送。当处理器需要与外设交换数据时,首先查询外设的工作状态,只有在外设准备就绪的情况下才进行数据传送。
image

查询输入端口

image

		mov dx, 5001h	;dx指向状态端口
status:	in al, dx		;读取端口的状态
		test al, 01		;查询状态是否九旬
		jz status		;D0=0状态未就绪继续查询
		dec dx			;D0=1状态已就绪,dx指向5000h
		in al, dx		;从数据端口读数据

查询输出端口

image

  • 8位锁存器:构成数据输出寄存器(数据端口),一侧连接系统的输出总线,一侧连接输出设备
  • 1位三态缓冲器和1位锁存器构成状态寄存器(状态端口):I/O译码地址位5001H

当处理器想要输出数据到外设时,首先应该查询状态端口,图上电路设计D7=0时0,表示外设已经准备就绪可以接收数据。此时处理器可以将数据写入数据端口,写入信号也作为D触发器的控制信号将D触发器置位为1,以便通知外设接收数据。当外设取走数据后~ACK会将D触发器重新置位为0,这时外设就又处于可以接收数据的状态了

		mov dx, 5001h
status:
		in al, dx
		test al, 80h
		inz status
		dec dx
		mov al, buf
		out dx, al

中断控制系统

中断传送

image

  • 中断请求:中断请求是外设向处理器提出的,对处理器来说它是随机发生的,但处理器的响应只会在每条指令的最后一个时钟周期区采样中断请求的输入引脚,所以外设提出的中断请求必须维持到得到响应
  • 中断响应:中断响应是有一定条件的
    1. 处理器只在每条指令执行完时才会去检测中断输入引脚,才可能响应
    2. 对可屏蔽中断,处理器应处在允许可屏蔽中断响应的状态
    3. 在中断请求时,处理器优先响应优先级更高的中断
    4. 中断请求应保持到响应他为止
    5. 如果遇到处理器正在执行中断返回、开中断等指令,则它必须在执行完现行指令后再接着执行一条其他指令,然后才能响应新的中断。这么做的目的是隔离两个中断
  • 关中断:处理器在响应中断后会关闭中断即不在响应其他中断,如果允许中断服务程序也被中断(中断嵌套),需要用户编程再次打开中断
  • 断点保护:保护断点地址和标志寄存器
  • 中断源识别:微机系统可能有多个发生中断的原因,处理器首先识别出是哪个中断源提出请求
  • 保护现场:一般是保护寄存器
  • 中断服务:处理器执行响应的中断服务程序
  • 恢复现场:恢复原来的工作环境
  • 开中断:处理器响应中断后,一般都会自动关闭中断。如果用户不将它打开,在整个中断过程中处理器不会再响应其他新的中断,至少在中断返回前将中断打开
  • 中断返回IRET指令,相较于RET指令会进行更多的恢复工作,如恢复标志寄存器

中断源识别

中断源识别主要采用中断向量

中断优先权排队

中断优先权排队是系统设计者事先为每个中断源确定优先处理顺序

中断嵌套

当处理器正在为某个中断进行服务时,又有新的中断处理原则:

  1. 新的中断请求优先权低于或等于当前正在服务的中断,则不予处理或待当前中断完成后再处理
  2. 新的中断请求优先权高于或等于当前正在服务的中断,处理器暂停当前工作,先服务级别更高的中断

IA-32的中断系统

IA-32的中断系统采用向量中断机制,能处理255个中断,用中断向量号0~255,其中可屏蔽中断还需要借助外部中断控制器实现优先权管理

内部中断

内部中断是由于处理器内部的执行程序出现异常引起的程序中断,也称异常,例如执行除法指令出现的除法错误异常(向量号0),用于程序调试的异常(向量号1)和断点异常(向量号3)等

  1. 除法错异常
    在执行指令DIV或IDIV时,若除数为0或商超过了寄存器所能表达的范围,则产生一个向量号为0的内部终端,称为除法错异常
; ata
msg	byte 0dh, 0ah,'No divide overflow!',0
; .code
	call readuiw
	mov bl, 1
	div bl
	mov eax, offset msg ;没有除法错误显示信息
	call dipmsg
  1. 溢出异常
    在执行溢出中断指令INTO时,若溢出标志OF为1,则产生一个向量号为4的内部中断,称为溢出中断
; .ata
msg byte 0dh, 0ah, 'NO overflow !', 0
; .code
	call readuib	;输入一个无符号整数
	all al, 100		
	jno noflow		;没有产生溢出,则输出未产生溢出信息
	into			;有溢出产生溢出中断
	jmp done		
noflow:
	mov eax, offset msg
	call dispmsg
done:

外部中断

外部中断时由于处理器外部提出中断请求引起的程序中断。相对于处理器来说,外部中断时随机产生的,索引这里外部中断才是真正意义上的中断。外部中断分为两种,一种是可屏蔽中断,另一种是不可屏蔽中断

  • 不屏蔽中断:
    外部通过不可屏蔽中断(NMI)请求信号向处理器提出中断请求,处理器在当前指令执行结束就予以响应,这个终端就是不可屏蔽中断,IA-处理器给不可屏蔽中断分配的向量号是2,主要用于处理系统的意外或故障,如电源掉电、存储器读写错误
  • 可屏蔽中断
    对来自外部可屏蔽中断请求信号,在当前指令结束执行后予以响应,同时输出可屏蔽中断响应信号~INTA
    除了要求当前指令执行结束外,对可屏蔽中断请求,处理器是否响应还取决于中断标志的状态。在IA-处理器中,若IF=1,则处理器是开中断的,可以响应,若IF=0,则处理器是关中断的,不能响应。

中断和异常的响应过程

image

中断描述符和中断向量表

  • 中断描述符保护方式下,每个中断服务程序由一个中断描述符指向,中断描述符中保存着中断服务程序的16位段选择器、32位偏移地址和中断特权层,中断描述符保存在系统的中断描述符表中,由中断描述符表地址寄存器IDTR给出其地址。系统最多有256个中断,每个中断描述符包含8个字节,所以中断描述符表最大2KB(256*8),以中断描述符表所在的地址为基础,中断向量号乘以8就对用其中断描述符

  • 中断向量表实地址方式下使用中断向量表直接保存中断服务程序的入口地址。中断服务程序的地址含有16位段基地址CS(高字部分)和16位偏移地址IP(低字部分),共4个字节,按照低对低、高对高的小端存储方式保存在中断向量表中。中断向量表被处理器固定地安排在以物理地址最低端00000H开始,从中断向量号0依次安排在每个中断服务程序地址,256个中断占用1KB区域,向量号为N的中断服务程序地址要从物理地址=N*4取得
    image

内部中断服务程序

特点

  1. 与编写子程序类似,都是利用过程定义伪指令PROC和ENDP
  2. 进入中断服务程序后通常要执行STI指令开放可屏蔽中断
  3. 最后执行IRET指令返回
  4. 内部中断服务程序通常采用寄存器传递参数

eg:编写80H号中断服务程序,使其具有显示以0结尾字符串的功能。字符串缓冲区首地址为入口参数,利用DS和DX传递其段地址和偏移地址

;.data
intoff	word	?
intseg	word	?
intmsg	byte	'A Instruction Interrupt!',13,10,0
;.code
		mov ax,3580h	;获取系统的原80H中断向量表项
		int 21h			
		mov intoff,bx	;保存偏移地址
		mov intseg,es	;保存段基地址
		push ds
		mov dx,offset new80h
		mov ax,seg new80h
		mov ds,ax
		mov ax,2580h	;设置本程序的80H中断向量表项
		int 21h
		pop ds
		;
		mov dx, offset intmsg	;设置入口参数DS和DX
		int 80h			;调用80H中断服务程序,显示字符串
		;
		mov dx,intoff
		mov ax,intseg
		mov ds,ax
		mov ax,2580h
		int 21h
		
		;80H内部中断服务程序:显示字符串(以0结尾);DS:DX=缓冲区首地址
new80h	proc		;过程定义
		sti			;开中断
		push ax		;保护寄存器
		push bx
		push si
		mov si,dx
new1:	mov al,[si]		;获取想要显示的字符
		cmp al,0		;为0结束
		jz new2
		mov bx,0
		mov ah,0eh
		int 10h
		inc si
		jmp new1
new2:	pop si
		pop bx
		pop	ax
		iret		;中断返回
new80h	endp		;中断服务程序结束
	

image

中断控制器

8259A的寄存器

8259A主要为用户提供了3个8位可读可写的寄存器

  • 中断请求寄存器:保存8个外界中断请求信号IR0~IR7的请求状态。Di位为1表示IRi引脚有中断请求;Di位为0表示IRi引脚无请求
  • 中断服务寄存器:保存正在被8259A服务的中断状态。Di位为1表示IRi中断正在服务中,Di位为0表示IRi中断没有被服务
  • 中断屏蔽寄存器:保存对中断请求信号IR的屏蔽状态。Di位为1表示IRi中断被屏蔽(禁止),Di位为0表示允许IRi中断。IMR对各个中断的屏蔽是相互独立的,对较高优先权的中断请求实现屏蔽,并不影响较低优先权的中断请求

8259A的工作方式

外部中断服务程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1125233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux系统编程】命令模式2

目录 一,Linux下的初阶认识 1,管道 2,时间戳 二,Liunx系统命令操作 1,date时间指令 2,cal日历指令 3,which和find查找指令 3-1,which指令: 3-2,find…

c语言一维数组和二维指针

c语言一维数组和二维指针&#xff1a;测试目的&#xff0c;了解二维指针赋值。 #include <stdio.h> //c语言一维数组和二维指针 int main(int argc,char *argv[]) { int MyArray[2]; int *p1; int **p2; //int **p2&p1;//在声明变量时&#xff0c;可以这么赋值 …

如何保养维护实验室超声波清洗机

实验室是用于各个行业产品的研发以及检验的场所&#xff0c;所以对其中所使用的各种物品都有着极高的要求&#xff0c;因此只有品类齐全的实验室超声波清洗机能够满足实验室对于清洁以及其他方面的一些需求&#xff0c;但是要想实验室超声波清洗机设备的性能能够始终如一&#…

后 Cookie 时代如何实现精准的用户运营与管理?

Cookie 时代的营销&#xff1a;用隐私换取个性化服务方式帮助他们找到回家的路。而在数字世界中&#xff0c;网站运营者可以通过这些“碎饼干屑 &#xff08;Cookie&#xff09;”追踪用户行为。 用户隐私和个性化服务之间的平衡一直是一个备受争议的话题。随着技术的发展&…

二叉排序树(BST)

二叉排序树 基本介绍 二叉排序树创建和遍历 class Node:"""创建 Node 节点"""value: int 0left Noneright Nonedef __init__(self, value: int):self.value valuedef add(self, node):"""添加节点node 表示要添加的节点&quo…

Your password has expired. To log in you must change it using a client that

早上打开本地mysql链接报错了&#xff0c;提示密码过期 PS:是密码过期&#xff0c;不是密码错误 开始 先看下mysql安装位置 windowsD 打开运行窗口 输入 services.msc 打开服务界面 找到mysql 查看安装路径 windowsD 打开运行窗口 cmd 进入mysql bin 目录 1、cd 你的目…

React 中 keys 的作用是什么?

目录 前言&#xff1a;React 中的 Keys 的重要性 为什么 Keys 重要&#xff1f; 详解&#xff1a;key 属性的基本概念 用法&#xff1a;key 属性的示例 解析&#xff1a;key 属性的优势和局限性 优势&#xff1a; 局限性&#xff1a; key 属性的最佳实践 稳定的唯一标…

ZYNQ linux调试LCD7789

一,硬件管脚 1,参数解释和实物 LVGL是一个开源的图形库,主要用于MCU上屏幕UI的部署,功能完善,封装合理,可裁切性强,也可以实现Linux上fbx的部署。LVGL官网LVGL - Light and Versatile Embedded Graphics Library 每根线的作用

[Linux 基础] make、Makefile自动化构建代码工具

文章目录 1、make与Makefile是什么2、为什么要有make与Makefile3、怎么实现一个Makefile文件3.1 如何编写Makefile文件3.1.1 依赖关系3.1.2 依赖方法 3.2 如何清理项目3.2.1 如何编写3.2.2 clean详解 3.3 make的使用3.4 原理3.4.1 查看文件修改时间 1、make与Makefile是什么 m…

0基础学习VR全景平台篇第110篇:源图像导入和镜头预设 - PTGui Pro教程

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 本节教程&#xff0c;我们讲述拼接软件 PTGui Pro 操作的第一步&#xff1a;导入源图像和预设镜头&画幅参数。 我们此次课堂有两个重点&#xff1a; 第一点是 培养摄影后期…

拼团小程序制作技巧大揭秘:零基础也能轻松掌握

随着拼团模式的日益流行&#xff0c;越来越多的商家和消费者开始关注拼团小程序的制作。对于没有技术背景的普通人来说&#xff0c;制作一个拼团小程序似乎是一项艰巨的任务。但实际上&#xff0c;选择一个简单易用的第三方平台或工具&#xff0c;可以轻松完成拼团小程序的制作…

024-第三代软件开发-TabView

第三代软件开发-TabView 文章目录 第三代软件开发-TabView项目介绍TabView官方示例 项目实际使用 关键字&#xff1a; Qt、 Qml、 TabView、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Langu…

开发趋势 Java Lambda 表达式 第一篇

开发趋势 Java Lambda 表达式 一&#xff0c;介绍 Java Lambda 表达式是自 Java 8以后引入的一种新的编程特性&#xff0c;它使得 Java 也能使用函数式编程的部分特性。Lambda 表达式提供了一种清晰且简洁的方式来代表一个方法接口&#xff08;single method interface&#x…

【Unity3D日常开发】Unity3D的Color Space(颜色空间)【全解析】

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 Edit→Player Settings→Other Settings→Rendering→Color Sp…

app拉新渠道整合 一手地推、网推拉新平台整理

1.聚量推客 聚量推客自己本身是服务商&#xff0c;自己直营的平台&#xff0c;相对来说数据更好&#xff0c;我们也拿到了平台首码&#xff1a;000000 填这个就行&#xff0c;属于官方渠道 2.蓝猫推客 蓝猫推客我认为是比较又潜力的平台&#xff0c;经过几天测试数据和结算都…

【23级红细胞招新模拟训练(部分题解 不包含最后三题】

前言 提前说明 &#xff1a; 本人是蒟蒻 题解基本没考虑过优化 只求通过 写这篇题解仅仅是分享一下我的做法 使用的语言&#xff1a;cpp 6-1 题目 请编写函数&#xff0c;对三个整数按升序排序。 函数原型 void IntSortAsc3(int *x, int *y, int *z); 说明&#xff1a;参数 …

【鸿蒙软件开发】文本输入(TextInput/TextArea)

文章目录 前言一、输入框1.1 创建输入框单行输入框多行输入框单行和多行输入框的区别 1.2 设置输入框的类型有哪些类型基本输入模式&#xff08;默认类型&#xff09;密码输入模式 1.3 自定义样式设置无输入时的提示文本设置输入框当前的文本内容。添加backgroundColor改变输入…

基于减法平均优化的BP神经网络(分类应用) - 附代码

基于减法平均优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于减法平均优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.减法平均优化BP神经网络3.1 BP神经网络参数设置3.2 减法平均算法应用 4.测试结果…

二叉树的各类实现判断

如何判断一颗二叉树是否是搜索二叉树&#xff1f; 搜索二叉树 每个子树头节点的左孩子比它小&#xff0c;右孩子比它大 经典的搜索二叉树没有重复的数 判断 将二叉树按照中序遍历&#xff0c;判断是否为升序 1、先将整棵树中序遍历再判断是否升序 //中序遍历public stat…

【STL】priority_queue(优先级队列)详解及仿函数使用(附完整源码)

目录 1. priority_queue介绍和使用1.1 priority_queue介绍1.2 priority_queue使用 2. 仿函数介绍3. priority_queue模拟实现 1. priority_queue介绍和使用 1.1 priority_queue介绍 优先级队列也是在<queue>里&#xff1a; 因此和queue一样&#xff0c;priority_queue也…