汇编语言-端口和外中断
来源:互联网 发布:淘宝客优惠券怎么推广 编辑:程序博客网 时间:2024/05/16 16:17
端口
和CPU通过总线相连的芯片除了各种存储器外,还有一些其他的芯片,例如网卡显卡等。从CPU的角度,将这些寄存器都当作端口,对它们进行统一编址,从而建立了一个统一的端口地址空间,每一个端口的地址空间都有一个地址。
端口的读写
在访问端口的时候,CPU通过端口地址来定位端口。因为端口所在的芯片和CPU通过总线相连,所以,端口地址和内存地址是一样的,都是通过地址总线相连传输数据的。
介绍in指令
in al,60h ;从60h号端口读入一个字节到内存
执行时与总线相关操作
- cpu通过地址线将地址信息60h发出
- cpu通过控制线发出端口读命令,选中存储芯片,并通知它,将要从中读取数据
- 端口所在的芯片将60h端口中的数据通过数据线送入cpu中
介绍out指令
out 60h,al从内存读出一个字节到60h号端口
执行时与总线相关操作和in指令相似
在in 和out 指令中, 只能使用al或ax来存放从端口中读入的数据或要发送到端口中的数据
shl和shr指令
shl和shr是逻辑移位指令
shl是逻辑左移指令
功能:
- 将一个寄存器或内存单元中的数据向左移位
- 将最后移出的移位写入CF中
- 最低位用0 补充
mov al, 01001000bshl al, 1 ;将 al中数据左移一位执行后 (al) = 10010000b, CF=0
shr是逻辑右移指令
功能:
- 将一个寄存器或内存单元中的数据向右移位
- 将最后移出的移位写入CF中
- 最高位用0 补充
mov al, 01001000bshr al, 1 ;将 al中数据右移一位执行后 (al) = 00100100b, CF=0
外中断
cpu除了有运算能力外,还要有I/O(Input/Output)功能
外设的输入不直接送入内存和cpu中,而是送入相关的接口芯片的端口中;cpu向外设的输出也不是直接送入外设,而是先送入端口中,再由相关芯片送到外设。cpu还可以向外设输出控制命令,而这些控制命令也是先送到相关芯片的端口中,然后由芯片送到外设实施控制。所以cpu是通过端口和外部设备进行联系。
外中断信息
外设随时都可能发生需要cpu即使处理的事情,cpu是如何即使得知并进行处理的呢?
cpu提供中断机制来满足这样需要。当cpu内部有需要处理的事情发生的时候,将产生中断信息,引发中断过程。这种中断信息来源cpu内部当cpu外部有需要处理的事情发生的时候,如外设的输入到达,相关芯片将想cpu发出响应的中断信息。cpu在执行完当前指令后,可以检测到发送过来的中断信息,引发中断过程,处理外设的输入。
中断介绍:
中断分为两种:可屏蔽中断和不可屏蔽中断
可屏蔽中断
可屏蔽中断是cpu可以不响应的外中断。cpu是否响应可屏蔽中断,要看标志寄存器IF位的设置
当cpu检测到可屏蔽中断信息时如果IF = 1,则cpu 执行完当前指令后响应中断,引发中断过程;如果IF = 0,则cpu 不响应可屏蔽中断
不可屏蔽中断
不可屏蔽中断是cpu必须响应的外中断。当cpu 检测到不可屏蔽中断时,在执行完当前指令后,立即响应,引发中断过程。
几乎所有的由外设引发的外中断,都是可屏蔽中断,当外设有需要处理的事件发生时,相关芯片向cpu发出可屏蔽中断。
不可屏蔽中断是在系统中必须处理的紧急情况发生时,用来通知cpu 的中断信息。
外中断程序介绍
下面代码作用:在屏幕中间依次显示「a」~「z」,并停留一段时间。在显示过程中,按下esc按键之后,可以改变显示的颜色。
assume cs:codestack segment db 128 dup(0)stack endsdata segment dw 0,0data endscode segmentstart: ;堆栈段 mov ax,stack mov ss,ax mov sp,128 ;保存系统int9中断例程,cs和ip位置 mov ax,data mov ds,ax mov ax,0 mov es,ax push es:[9*4] pop ds:[0] push es:[9*4+2] pop ds:[2] ;重写系统int9中断例程 mov word ptr es:[9*4],offset int9 mov es:[9*4+2],cs ;将IF设置为1 pushf pop bx and bh,11111111B push bx popf ;循环写入a~z字符 mov ax,0b800H mov es,ax mov ah,'a's: mov es:[160*12+40*2],ah call delay;设置空循环,让字符可以在屏幕上保留一段时间 inc ah cmp ah,'z' jna s ;恢复系统int9中断例程 mov ax,0 mov es,ax push ds:[0] pop es:[9*4] push ds:[2] pop es:[9*4+2] ;结束,退出程序 mov ax,4c00H int 21H;设置空循环,让字符可以在屏幕上保留一段时间delay: push ax push dx mov dx,10H mov ax,0 s1: sub ax,1 sbb dx,0 cmp ax,0 jne s1 cmp dx,0 jne s1 pop dx pop ax ret;新的int9中断程序int9: push ax push bx push es in al,60H;通过端口,获取键盘中键入的按键 ;执行系统int9中断例程 pushf call dword ptr ds:[0] ;判断是否为esc按键 cmp al,1 jne int9ret ;是esc按键,改变显示字符的颜色 mov ax,0b800H mov es,ax inc byte ptr es:[160*12+40*2+1]int9ret: pop es pop bx pop ax iretcode endsend start
知识点
- 当我们按下键盘中按键时,系统会发出一个外中断,此外中断会调用int9中断例程。我们可以直接编写int9中断例程达到想要的效果
- 通过in 和 out指令,可以获取端口中的信息。例如:
in al,60H
,就可以获得键盘中键入的按键的信息
效果图
- 汇编语言-端口和外中断
- 读王爽老师汇编语言笔记---int指令、端口、外中断以及键盘的输入
- 汇编语言学习笔记(十五)外中断
- [汇编语言学习笔记][第十五章 外中断]
- 《汇编语言》学习(十五)外中断
- 王爽 《汇编语言》 读书笔记 十五 外中断
- STM8L中断线和中断端口使用方法
- IBM-PC汇编语言BIOS和DOS中断调用程序设计
- 经典汇编语言教程:第8章 输入输出和中断
- 读王爽老师汇编语言笔记---标志寄存器和内中断
- 汇编语言 — 中断
- 汇编语言中断类型
- 汇编语言21号中断
- 汇编语言-内中断
- 汇编语言----中断指令
- 汇编语言笔记14-端口
- 汇编语言中的外中断——键盘事件
- 王爽汇编语言,外中断例题,照抄都出错
- PowerShell Function之获取service信息
- python爬虫工具及最佳实践
- 使用Chrome Profiles排查Web App的JS内存泄露小结
- c语言 文件读写
- iOS开发-正则表达式
- 汇编语言-端口和外中断
- Struts2 URL参数 s:if 判断运用
- 链接创建按钮
- MySQL的命令行预备
- jsp学习笔记
- ios开发-XMPP功能的实现
- hdoj5240Exam
- C#酒店管理系统(内部)业务逻辑
- ios开发-AVPlayer 音乐播放自定义经典例题