zoukankan      html  css  js  c++  java
  • 汇编语言-端口和外中断

    端口

    和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, 01001000b
    shl al, 1 ;将 al中数据左移一位
    执行后 (al) = 10010000b, CF=0

    shr是逻辑右移指令

    功能:

    1. 将一个寄存器或内存单元中的数据向右移位
    2. 将最后移出的移位写入CF中
    3. 最高位用0 补充
    mov al, 01001000b
    shr 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:code
    
    stack segment
        db 128 dup(0)
    stack ends
    
    data segment
        dw 0,0
    data ends
    
    code segment
    start:
        ;堆栈段
        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
        iret
    
    code ends
    end start

    知识点

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

    效果图

  • 相关阅读:
    后缀数组 (Suffix Array) 学习笔记
    Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
    [ USACO 2013 OPEN ] Photo
    清华集训2016做题记录
    「UNR#2」黎明前的巧克力
    「UNR#1」奇怪的线段树
    Atcoder Grand Contest 018 E
    「NOI2015」小园丁与老司机
    「集训队作业2018」三角形
    Codeforces 878 E. Numbers on the blackboard
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026854.html
Copyright © 2011-2022 走看看