汇编语言-端口和外中断

来源:互联网 发布:淘宝客优惠券怎么推广 编辑:程序博客网 时间:2024/05/16 16:17

端口

和CPU通过总线相连的芯片除了各种存储器外,还有一些其他的芯片,例如网卡显卡等。从CPU的角度,将这些寄存器都当作端口,对它们进行统一编址,从而建立了一个统一的端口地址空间,每一个端口的地址空间都有一个地址。

端口的读写

在访问端口的时候,CPU通过端口地址来定位端口。因为端口所在的芯片和CPU通过总线相连,所以,端口地址和内存地址是一样的,都是通过地址总线相连传输数据的。

介绍in指令

in al,60h ;从60h号端口读入一个字节到内存

执行时与总线相关操作

  1. cpu通过地址线将地址信息60h发出
  2. cpu通过控制线发出端口读命令,选中存储芯片,并通知它,将要从中读取数据
  3. 端口所在的芯片将60h端口中的数据通过数据线送入cpu中

介绍out指令

out 60h,al从内存读出一个字节到60h号端口

执行时与总线相关操作和in指令相似

在in 和out 指令中, 只能使用al或ax来存放从端口中读入的数据或要发送到端口中的数据

shl和shr指令

shl和shr是逻辑移位指令

shl是逻辑左移指令

功能:

  1. 将一个寄存器或内存单元中的数据向左移位
  2. 将最后移出的移位写入CF中
  3. 最低位用0 补充
mov al, 01001000bshl al, 1 ;将 al中数据左移一位执行后 (al) = 10010000b, CF=0

shr是逻辑右移指令

功能:

  1. 将一个寄存器或内存单元中的数据向右移位
  2. 将最后移出的移位写入CF中
  3. 最高位用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

知识点

  1. 当我们按下键盘中按键时,系统会发出一个外中断,此外中断会调用int9中断例程。我们可以直接编写int9中断例程达到想要的效果
  2. 通过in 和 out指令,可以获取端口中的信息。例如:in al,60H,就可以获得键盘中键入的按键的信息

效果图

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子说话不流利怎么办 儿童最近不吃饭怎么办 不爱吃饭偏瘦怎么办 一岁半小宝宝不爱吃饭怎么办 家养的小鸡打架怎么办 小鸡关在一起打架怎么办 小孩感冒出汗多怎么办 宝宝感冒出汗了怎么办 出汗多怎么办%3f 孩子睡觉出汗多怎么办 三年级孩子成绩下滑怎么办 幼儿数学不开窍怎么办 孩子一年级学习跟不上怎么办 孩子学习不认真怎么办 孩子平时不细心怎么办? 脖子出现黑圈怎么办 简历留白太多怎么办 excel数字外面加个圈怎么办 电脑输入法数字数不上怎么办 大班教案迷路了怎么办 迷路了怎么办活动反思 头突然眩晕是怎么办 孩子学习拖拉懒惰怎么办 头发晕想睡觉怎么办 五年级错别字多怎么办 入党志愿书写错字怎么办 高中不会写作文怎么办 考试不会写作文怎么办 高考不会写作文怎么办 孩子总是写错字怎么办 小孩总是写错字怎么办 孩子马虎不认真怎么办 小孩计算老出错怎么办 小学生计算总出错怎么办 高中考试总粗心怎么办 孩子考试总是粗心怎么办 一年级孩子考试粗心怎么办 老师说孩子粗心怎么办 计算题总出错怎么办 计算题总是出错怎么办 数学老是计算错误怎么办?