精华内容
下载资源
问答
  • 中断系统 1作业题 8051微控制器中有几个中断源几个中断优先级中断优先级是如何控制的在出现同级中断申请时CPU按什么顺序响应按由高级到低级的顺序写出各个中断源各个中断源的入口地址是多少 答8051微控制器中有五个...
  • Embedded System Development 嵌入式系统与应用 第 8 章 STM32F10x 的主要模块设计 3 外部中断 8.3 外部中断 8.3.1 GPIO 键盘设计实验 8.3.2 外部中断 EXTI 设计 8.3.1 GPIO 键盘设计实验 GPIO 端口如何进行键盘设计...
  • 通过该讲,读者可以掌握红外遥控器的编码原理以及如何通过单片机对遥控器进行解码。  二、原理简介  随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)...
  • 通过该讲,读者可以掌握红外遥控器的编码原理以及如何通过单片机对遥控器进行解码。  二、原理简介  随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)...
  • 15 外中断

    2018-09-23 13:05:48
    我们知道,CPU在计算机系统中,除了能够执行命令,进行计算意外,还应该能够对外部设备进行控制,接受他们的输入,向他们进行输出。也就是说,CPU除了有运算能力外,还要有I/O能力 要即使处理外设的输入,显然需要...

    1、以前我们讨论的都是CPU对指令的执行。我们知道,CPU在计算机系统中,除了能够执行命令,进行计算意外,还应该能够对外部设备进行控制,接受他们的输入,向他们进行输出。也就是说,CPU除了有运算能力外,还要有I/O能力

    要即使处理外设的输入,显然需要解决两个问题:

    外设的输入随时可能发生,CPU如何得知

    CPU从何处得到外设的输入

     

    2、接口芯片和端口

    第14章我们讲过,PC系统的接口卡和主板上,装有各种接口芯片。这些外设接口芯片的内部有若干寄存器,CPU将这些寄存器当作端口来访问

    外设的输入部直接送入内存和CPU。而是送入相关的接口芯片的端口中;CPU向外设的输出也不是直接送入外设,而是先送入端口中,再由相关的芯片送到外设。CPU还可以向外设输出控制米嗯令,而这些控制命令也是先送到相关芯片的端口中,然后再由相关的芯片根据命令对外设实施控制

    可见,CPU通过端口和外部设备进行联系

     

    3、外中断信息

    在PC系统中,外中断源一共有以下两类。

    (1)可屏蔽中断

    可屏蔽中断是CPU可以不响应的外中断,CPU是否响应可屏蔽中断,要看标志寄存器IF位的设置,当CPU检测到可屏蔽中断信息时,如果IF=1,则CPU在执行完当前指令后响应中断,引起中断过程;如果IF=0,则不响应可屏蔽中断

    现在我们可以解释中断过程中将IF置为0的原因了。将IF置0的原因就是,在进入中断处理程序后,禁止其他的可屏蔽中断

    当然,如果在中断处理程序中需要处理可屏蔽中断,可以用指令将IF置1.8086CPU提供的设置IF的指令如下:

    sti,设置IF=1

    cli,设置IF=0

    (2)不可屏蔽中断

    不可屏蔽中断时CPU必须响应的外中断。当CPU检测到不可屏蔽中断信息时,则在执行完当前指令后,立即响应,引发中断过程

    对于8086CPU,不可屏蔽中断的中断类型码固定为2,所以中断过程中,不需要取中断类型码

    几乎所有由外设引发的外中断,都是可屏蔽中断。当外设有需要处理的时间(比如说键盘输入)发生时,向关系篇向CPU发出可屏蔽的中断信息。不可屏蔽中断是在系统中有必须处理的紧急情况发生用来通知CPU的中断信息

     

    4、PC机键盘的处理过程

    键盘输入

    键盘上的每一个键相当于一个开关,键盘中有一个芯片对键盘上的每一个键的开关状态进行扫描

    按下一个键时,开关接通,该芯片救出女生一个扫描码,扫描码说明了按下的键在键盘上的位置,松开按键时产生的扫描码也被送入到60h端口中

    一般将按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。扫描码长度为1个字节,通码的第七位为0,断码的第七位为1,即:

    断码=通码+80h

    比如,g键的通码为22h,断码为a2h

    引发9号中断

    键盘的输入到达60h端口时,相关的芯片就会向CPU发出中断类型码为9的可屏蔽中断信息。CPU检测到该中断信息后,如果IF=1,则响应中断,引发中断过程,转去执行int 9中断例程

    执行嗯int 9中断例程

    BIOS提供了int 9中断例程,用来进行基本的键盘输入处理,主要的工作如下:

    (1)读取60h端口中的俄扫描码

    (2)如果是字符键的扫描码,将该扫描码和它所对应的字符码(即ASCII码)送入内存中的BIOS键盘缓冲区;如果是控制键(比如 ctrl)的扫描码,则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储状态字节的单元

    (3)对键盘系统进行相关的控制,比如说,向相关芯片发出应答信息

    BIOS键盘缓冲区是系统启动后,BIOS用于存放int 9中断例程所接收的键盘输入的内存区。该内存区可以存储15个键盘输入,因为int 9中断例程除了接收扫描码外,还要产生和扫描码对应的字符码,所以在BIOS键盘缓冲区中,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码

    0040:17单元存储键盘状态字节,盖孜节记录了控制键和切换键的状态。键盘状态字节各位记录的信息如下

    0 右shift
    1 左shift
    2 ctrl
    3 alt
    4 scrolllock指示灯亮
    5 numlock小键盘数字
    6 capslock输入大写字母
    7 insert处于删除态

     

    5、指令系统总结

    我们对8086CPU的指令系统进行一下总结

    (1)数据传送指令

    比如mov、push、pop、pushf、popf、xchg等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间单个数据的传送

    (2)算术运算指令

    比如,add、sub、adc、sbb、inc、dec、cmp、imul、idev、aaa等都是算术运算指令,这些指令实现寄存器和内存中的数据的算术运算,他们的执行结果影响标志寄存器的sf、zf、of、cf、pf、af

    (3)逻辑指令

    比如,and、or、not、xor、shl、shr、sal、sar、rol、ror、rcl、rcr等都是逻辑指令。除了not指令外,它们的执行结果都影响标志寄存器的相关标志位

    (4)转移指令

    可以修改IP,或同时修改CS和IP的指令统称为转移指令。转移指令分为以下几类。

    • 无条件转移指令,比如jmp;
    • 条件转移指令,比如jcxz、je、jb、ja、jnb、jna等
    • 循环指令,比如loop;
    • 过程,比如,call、ret、retf
    • 中断,比如,int、iret

     

    (5)处理机控制指令

    这些指令对标志寄存器或其他处理机状态进行设置,比如cld、std、cli、sti、nop、clc、cmc、stc、hlt、wait、esc、lock等都是处理机控制指令

    (6)串处理指令

    这些指令对内存中的批量数据进行处理,比如,movsb、movsw、cmps、scas、lods、stos等。若要使用这些指令方便的进行批量数据的处理,则需要和rep、repe、repne等前缀指令配合使用

    展开全文
  • 汇编第十五节-外中断

    2017-11-28 23:14:42
    第15节:外中断CPU在计算机系统中,除了能够执行指令运算外, 还应该对外部设备进行控制,接受它们的输入,向它们进行输出。 I/O需解决2个问题: 1.外设的输入随时可能发生,CPU如何得知? 2.CPU从何处得到外设的...

    第15节:外中断

    CPU在计算机系统中,除了能够执行指令运算外,
    还应该对外部设备进行控制,接受它们的输入,向它们进行输出。
    I/O需解决2个问题:
    1.外设的输入随时可能发生,CPU如何得知?
    2.CPU从何处得到外设的输入?

    1.接口芯片和端口:

    外设的输入不直接送入内存和CPU,而是送入相关的接口芯片和芯片的端口中。
    CPU向外设的输出也不是直接接入外设,而是先送入端口中,再由相关的芯片送到外设。
    CPU<–>端口<–>外设

    2.外中断信息:

    外设的输入随时可能发生,CPU如何得知并进行处理?—>中断机制
    外中断源分类:
    a.可屏蔽中断
    CPU可以不响应的外中断。CPU是否响应可屏蔽中断,要看标志寄存器IF位的设置。
    当CPU检测到可屏蔽中断信息时,如果IF=1,则CPU在执行完当前指令后响应中断,引发中断过程。
    IF=0,则不响应可屏蔽中断。

    1.标志寄存器入栈,IF=0,TF=02.CS,IP入栈
    3.(IP)=(n*4),(CS)=(n*4+2)

    将IF置0的原因就是,在进入中断处理程序后,禁止其他的可屏蔽中断。

    if在中断处理程序中需要处理可屏蔽中断,可以用指令将IF置1。8086CPU提供的指令是:
    sti,设置IF=1
    cli,设置IF=0

    b.不可屏蔽中断
    CPU必须响应的外中断。当CPU检测到不可屏蔽中断信息时,则在执行完当前指令后,立即响应,引发中断过程。
    8086中不可屏蔽中断类型码固定为2,所以中断过程,不需要取中断类型码

    1.标志寄存器入栈,IF=0,TF=0;
    2.CS,IP入栈
    3.(IP)=(8),(CS)=(0AH)

    (几乎所有由外设引发的外中断,都是可屏蔽中断。)

    3.PC机键盘的处理过程:

    a.键盘输入:
    键盘键(开关)——>按下键(通码)——>产生扫描码(松开的键在键盘的位置)——>松开(断码)——>产生的扫描码也送入60h端口中
    扫描码长度为1个字节,通码的第7位为0,断码的第7位为1
    断码=通码+80h
    eg:g键的通码为22h,断码为a2h
    b.引发9号中断:
    到达60h端口——>芯片向CPU发出中断类型码为9的可屏蔽中断信息——>IF=1,则响应中断——>转去执行int9中断例程
    c.执行int9中断例程:
    BIOS提供了int9中断例程,用来进行基本的键盘输入处理

    1.读出60h端口中的扫描码
    2.字符键扫描码——>扫描码和对应的ASCII送入BIOS键盘缓冲区
          控制键(ctrl..)和切换键(Capslock..)扫描码——>状态字节写入内存中存储状态字节单元
    3.对键盘系统进行相关的控制,eg向相关芯片发出应答信息

    BIOS键盘缓冲区是系统启动后,BIOS用于存放int 9中断例程所接收的键盘输入的内存区。
    该内存区可以存储15个键盘输入,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码。

    0040:17单元存储键盘状态字节,
    该字节记录了控制键和切换键的状态。键盘状态字节各位信息的如下:

    0: 右shift状态,置1表示按下右shift键;
    1: 左shift状态,置1表示按下左shift键;
    2: Ctrl状态,置1表示按下ctrl键;
    3: Alt状态,置1表示按下alt键;
    4: Scrollock状态,置1表示scroll指示灯亮;
    5: NumLock状态,置1表示小键盘输入的是数字;
    6: CapsLock状态,置1表示输入大写字母;
    7: Insert状态,置1表示处于删除状态;

    4.编写int 9中断例程:

    键盘输入的处理过程:

    a.键盘产生扫描码 
    b.扫描码送入60h端口
    c.引发9号中断 
    d.CPU执行int 9中断例程处理键盘输入

    a,b,c都是由硬件系统完成的。我们只能改变的只有int 9中断例程处理程序。

    编程:在屏幕中间依次显示‘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
    
            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]              ;将原来int 9中断例程的入口地址保存在ds:0,ds:2单元中
    
            mov word ptr es:[9*4],offset int9
            mov es:[9*4+2],cs   ;在中断向量表中设置新的int9中断例程的入口地址
    
            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
    
            mov ax,0
            mov es,ax
    
            push ds:[0]
            pop es:[9*4]
            push ds:[2]
            pop es:[9*4+2]      ;将中断向量表中int 9中断例程的入口恢复到原来的地址
    
            mov ax,4c00h
            int 21h
    
      delay:push ax
            push dx
            mov dx,1000h
            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
    ;-----------以下为新的int 9中断例程----------------
      int9: push ax
            push bx
            push es
    
            in al,60h
    
            pushf
            pushf
            pop bx
            add bh,11111100b
            push bx
            popf
            call dword ptr ds:[0]       ;对int指令进行模拟,调用原来的int 9中断例程
    
            cmp al,1
            jne int9ret
    
            mov ax,0b800h
            mov es,ax
            inc byte ptr es:[160*12+40*2+1]     ;将属性值加1,改变颜色
    
    int9ret:pop es
            pop bx
            pop ax
            iret
    
    code ends
    end start

    5.安装新的int 9中断例程:

    任务:安装一个新的int9中断例程
    功能:在dos下,按f1键后改变当前屏幕的显示颜色,其他的键照常处理
    1.改变屏幕的显示颜色:
    2.其他键照常处理
    3.原int9中断例程入口地址的保存
    4.新int9中断例程安装
    将int9中断例程安装在0:204处

    assume cs:code
    stack segment
        db 128 dup(0)
    stack ends
    code segment
     start: mov ax,stack
            mov ss,ax
            mov sp,128
    
            push cs
            pop ds
    
            mov ax,0
            mov es,ax
    
            mov si,offset int9
            mov di,204h
            mov cx,offset int9end-offset int9
            cld
            rep movsb
    
            push es:[9*4]
            pop es:[200h]
            push es:[9*4+2]
            pop es:[202h]
    
            cli
            mov word ptr es:[9*4],204h
            mov word ptr es:[9*4+2],0
            sti
    
            mov ax,4c00h
            int 21h
    
      int9: push ax
            push bx
            push cx
            push es
    
            in al,60h
    
            pushf
            call dword ptr cs:[200h]
    
            cmp al,3bh
            jne int9ret
    
            mov ax,0b800h
            mov es,ax
            mov bx,1
            mov cx,2000
        s: inc byte ptr es:[bx]
            add bx,2
            loop s
    int9ret:pop es
            pop cx
            pop bx
            pop ax
            iret
    int9end:nop
    
    code ends
    end start

    指令系统总结:

    1.数据传送指令
    mov push pop pushf popf xchg //实现寄存器和内存,寄存器和寄存器之间的单个数据传送
    2.算术运算指令
    add sub adc sbb inc dec cmp imul idiv aaa//实现寄存器和内存中数据的算数运算。
    执行结果影响标志寄存器sf,zf,of,cf,pf,af位
    3.逻辑指令
    and or not xor test shl shr sal rol ror rcl rcr //除了not指令外,执行结果都影响标志寄存器的相关标志位
    4.转移指令
    jmp jcxz je jb ja jnb jna loop call ret retf int iret 
    5.处理机控制指令
    cld std cli sti nop clc cmc stc hlt wait esc lock//指令对标志寄存器或其他处理机状态进行设置
    6.串处理指令
    movsb movsw cmps scas lods stos //对内存中批量数据进行处理,若要使用这些指令方便进行批量数据的处理,则需要和rep repe repne等前缀指令配合使用
    展开全文
  • 我们知道,CPU在计算机系统中,除了能够执行指令,进行运算以外,还应该能够对外部设备进行控制,接受它们的输入,向它们进行输出,也就是说,CPU除了有运算能力外,还要有I/O能力。 要及时处理外设的输入,显然...

    第15章 外中断

    以前我们讨论的都是CPU对指令的执行。我们知道,CPU在计算机系统中,除了能够执行指令,进行运算以外,还应该能够对外部设备进行控制,接受它们的输入,向它们进行输出,也就是说,CPU除了有运算能力外,还要有I/O能力。

    要及时处理外设的输入,显然需要解决两个问题:1.外设的输入随时可能方式,CPU如何得知?2.CPU从何处的到外设的输入?

    15.1 接口芯片和端口

    第14章我们讲过,PC系统的接口卡和主板上,装有各种接口芯片。这些外设接口芯片的内部有若干个寄存器,CPU将这些寄存器当作端口来对待。

    外设的输入不直接送入内存和CPU,而是先送入端口中;CPU向外设的输出也不是直接输入外设,而是先送入端口中,再由相关的芯片送到外设,CPU还可以向外设输出控制信息,而这些控制命令也是先送到相关芯片的端口中,然后再由相关的芯片根据命令对外设实施控制。

    可见,CPU通过端口和外部设备进行联系。

    15.2 外中断信息

    现在,我们知道了外设的输入被存放在端口中,可是外设的输入随时都有可能到达,CPU如何及时地知道,并进行处理呢?

    CPU提供中断机制来满足这种需要。前面讲过,当CPU的内部有需要处理的事情发生的时候,将产生中断信息,引发冲断过程。这种中断信息来自CPU内部。

    还有一种中断信息,来自于CPU外部,当CPU外部有需要处理的事情发生的时候,比如,外设的输入到达,相关芯片将向CPU发出相应的中断信息。CPU在执行完当前指令后,可以检测到发送过来的中断信息,引发中断过程,处理外设的输入。

    在PC系统中,外中断源一共有以下两类:

    1.可屏蔽中断

    可屏蔽中断是CPUCPU可以不相应的外中断。CPU是否相应可屏蔽中断,要看标志寄存器的IF位的设置。当CPU检测到可屏蔽中断信息时,如果IF=1,则CPU执行完当前指令后相应中断,引发中断过程。如果IF=0,则不响应可屏蔽中断。

    我们回忆一下引发内中断的一个步骤,IF,TF=0。这样,在引发中断进入中断处理后,不会再相应可以屏蔽的中断,这种设置其实是非常合理的。

    当然,我们可以通过指令来手动设置IF位。

    sti 设置IF=1,可相应可屏蔽中断
    cti 设置IF=0,不可相应可屏蔽中断。

    2.不可屏蔽中断

    不可屏蔽中断是CPU必须相应的外中断。当CPU检测到不可屏蔽中断信息时,则在执行完当前指令后,立即相应,引发中断过程。

    对于8086CPU,不可屏蔽中断的中断类型码固定为2,所以,在中断过程中,不需要取中断类型码,过程如下:

    1.标志寄存器入栈,IF=0,TF=0
    2.CS,IP入栈
    3.IP=8,CS=0AH

    几乎所有由外设引发的外中断,都是可屏蔽中断,当外设有需要处理的时间,相关芯片向CPU发出可屏蔽中断信息。不可屏蔽中断信息是在系统有必须要处理的紧急情况发生时用来通知CPU的中断信息。在我们现在,讨论的都是可屏蔽中断

    15.3 PC机键盘的处理过程

    1.键盘输入

    键盘上的每一个键都相当于一个开关,键盘中有一个芯片对键盘上的每一个键的开关状态进行扫描。
    按下一个键,开关接通,芯片就产生了一个扫描码,扫描码说明了按下的键在键盘上的位置。扫描码被送入主板上的相关接口芯片的寄存器中,该寄存器的端口地址为60h

    注意,端口地址可以直接使用纯数字表示,它不是内存,当用in out指令时计算机会自动识别相关数字为端口,这点不需要你费心,这种简单的道理是需要你明确的。

    松开按下的键时,也产生一个扫描码,扫描码说明了松开键的位置。也被送入60h。

    两种码分别被称为通码断码。扫描码长度为1个字节, 通码的第7位为0,断码的第7位为1 ,即
    断码=通码+80h

    比如,g键的通码为22h,断码为a2h。
    键盘的扫描码图片

    2.引发9号中断

    键盘的输入到达60h端口时,相关的芯片就会向CPU发出中断类型码为9的可屏蔽中断信息。CPU检测到该信息后,如果IF=1,则响应中断,否则就会屏蔽中断。

    3.执行 int 9 中断例程

    BIOS提供了int 9中断例程,用来进行基本的键盘输入处理,主要的工作如下:
    1. 读入60h端口中的扫描码;
    2. 如果是字符键的扫描码,将该扫描码和它所对应的字符码(即ASCII码)送入内存中的BIOS键盘缓冲区;如果是控制键(比如ctrl)和切换键(比如Capslock)的扫描码,则将其转变为状态字节(用二进制位记录控制键合切换状态的字节)写入内存中存储状态字节的单元;
    3. 对键盘系统进行相关的控制,比如说,向相关芯片发出应答信息。

    BIOS键盘缓冲区 它是系统启动后,BIOS用于存放int 9中断历程所接收的键盘输入的内存区。该内存区可以存储15个键盘输入,因为int 9中断例程除了接收扫描码外,还要产生对应的ASCII码,所以,在缓冲区中,一个键盘输入用一个字单元存放,高位扫描码,低位字符码。

    0040:17 单元存储键盘状态字节,该字节记录了控制键合切换键的状态,信息如下:

    0:右shift状态,置1表示按下右shift键;
    1:左shift状态,置1表示按下左shift键;
    ·······
    7:Insert状态,置1表示处于删除态。

    15.4 编写int 9 中断例程

    从上面的内容,我们看出键盘输入的处理过程:
    1. 键盘产生扫描码;
    2. 扫描码送入60h端口;
    3. 引发9号中断;
    4. CPU执行int9中断例程处理键盘输入。

    编程 在屏幕中间依次显示‘a’~‘z’,并让人看清。在显示过程中,按下ESC键后,改变显示的颜色。

    先看看显示字符,这应该轻车熟路了。

    assume cs:code
    code segment
    start: mov ax,0b800h
           mov es,ax
           mov ah,'a'
        s: mov es:[160*12+40*2],ah
           inc ah
           cmp ah,'z'
           jna s
    
           mov ax,4c00h
           int 21h

    但上面的程序执行过程中,我们无法看清屏幕上的显示,需要再加入一些延时程序。

        mov dx,10h
        mov ax,0
    s:  sub ax,1
        sbb dx,1
        cmp ax,0
        jne s
        cmp dx,0
        jne a

    你应该明确该程序的内涵,一共大小为100000h次循环,这是双判断条件,必须ax,和ax同时为0,即循环完成,才可以进行下去,即执行完结束,否则,会跳过循环,就是这个样子,很简单。

    现在,我们完整的写下程序代码:

    assmue cs:code
    
    stack segment
        db 128 dup(0)
    stack ends
    
    code segment
    
    start:  mov ax,stack
            mov ss,ax
            mov sp,128
    
            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
    
            mov ax,4c00h
            int 21h
    
    delay:  push ax
            push dx
            mov dx,1000h
            mov ax,0
        s1: sub ax,1
            sbb dx,0
            jne s1
            cmp dx,0
            jne s1
            pop dx
            pop ax
            ret
    code ends
    end start

    这样显示的‘a’~‘z’就可以让人看清,现在,我们来进行下一步。按下ESC键后,如何改变颜色呢?
    我们需要考虑下面的过程:

    1. 从60h端口读出键盘的输入;
    2. 调用BIOS的int 9中断例程,处理其他硬件细节;
    3. 判断是否为Esc扫描码,如果是,改变显示的颜色后返回;如果不是则直接返回,下面我们对这些内容来一一进行分析。

    1.从端口60h读出键盘的输入

    in al,60h

    2.调用BIOS的int 9中断例程

    有一点需要注意的是,我们写的中断处理程序要称为新的int 9中断例程,主程序必须要将中断向量表中的
    int 9中断例程的入口地址改为我们写的中断处理程序的入口地址。则在新的中断处理程序中调用原来的int 9 中断例程时,中断向量表中的int 9中断例程的入口地址却不是原来的int 9中断例程的程序。所有不能使用int 指令直接调用。

    要能在我们写的新中断例程中调用原来的中断例程,就必须在将中断向量表中的中断例程的入口地址改为新地址之前,将原来的入口地址保存起来。这样,在需要调用的时候,我们才能找到原来的中断例程的入口。

    对于我们现在的问题,假设将原来int 9 中断例程的偏移地址和段地址保存在ds:[0]和ds:[2]单元中。那么我们在需要调用原来的int 9中断例程的时候,就可以在ds:[0],ds:[2]单元中找到它的入口程序。

    那么,有了入口程序后,如何进行调用呢?

    当然不能使用指令 int 9来调用。我们可以用别的指令来对int指令进行一些模拟,从而实现对中断例程的调用。

    模拟以下几步:

    1. 标志寄存器入栈;
    2. IF=0,TF=0;
    3. CS,IP入栈
    4. (IP)=(DS)*16+0;(CS)=(DS)*16+2

    第3.4步可以合并一个双字操作,这样就三步了,则用程序表示的代码如下:

    pushf
    pop ax
    and ax,11111100b
    push ax
    popf
    call dword ptr ds:[0]

    当然这个代码可以精简为:

    pushf
    call dword ptr ds:[0]

    因为我们实在中断操作时使用这种程序的,不管是何种中断,CPU都会按照中断程序的步骤处理一遍。所以,IF,TF的值一定为0,所以,我们不必再调用了。
    但注意,在这个程序后还有个iret,所以,必须再多加一步 pushf,这样才能一一对应起来,看一遍源码,你就会明白了。

    3.如果是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
    
            mov ax,data
            mov ds,ax
    
            mov ax,0
            mov es,ax
    
            ;将原来的int 9 中断例程的入口地址保存在ds:0,ds:2 单元中。
            push es:[9*4]
            pop ds:[0]
            push es:[9*4+2]
            pop ds:[2]
    
            ;在中断向量表中设置新的int 9中断例程的入口地址
            mov word ptr es:[9*4],offset int9
            mov es:[9*4+2],cs
    
            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
    
            mov ax,0
            mov es,ax
    
            ;将中断向量表中的int 9中断例程的入口恢复为原来的地址
            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,1000h
            mov ax,0
        s1: sub ax,1
            sbb dx,0
            cmp ax,0
            jne s1
            cmp bx,0
            jne s1
            pop dx
            pop ax
            ret
    
    -----------新的int 9中断处理程序-----------------------------
    
    int9: push ax
          push bx
          push es
    
          in al,60h
          pushf
          call dowrd ptr ds:[0]
    
          ;对比键盘的扫描码,注意,在这程序运行时,除了esc外其他按键均没有反应,这种操作应该明确。
          cmp al,1
          jne int 9ret
    
          mov ax,0b800h
          mov es,ax
          inc byte ptr es:[160*12+40*2+1]
    
    int9ret:    pop es
                pop bc
                pop ax
                iret
    
    code ends
    end start

    注意,这本质还是一个中断处理程序,所以,CPU在执行完该程序后仍然会按照中断处理程序再来一遍iret,这个我们是无法操纵的,而我们这里的iret中的popf,对应的是上面的pushf,将标志寄存器入栈,否则出栈的值可能不正确的。

    15.5 安装新的int 9中断例程

    这个和前面的中断指令类似,都是复制在 0:200的内存区中,然后再修改中断向量表中的地址,就是这个操作,知道这个原理就好,之后再多回来看看,就是这个样子。

    展开全文
  • 统计资料显示,光纤通信系统中通信中断的主要原因是光缆线路障碍,它约占障碍的2/3以上。 在光传输系统故障处理中故障定位的一般思路为:先外部、后传输。也就是说在故障定位时,先排除外部的可能因素,如光纤...

    一、光传输系统故障分析

    随着光缆线路的大量敷设和使用,光纤通信系统的可靠性和安全性越来越受到人们的关注。统计资料显示,光纤通信系统中通信中断的主要原因是光缆线路障碍,它约占障碍的2/3以上。

    在光传输系统故障处理中故障定位的一般思路为:先外部、后传输。也就是说在故障定位时,先排除外部的可能因素,如光纤断裂、电源中断等,接着再考虑传输设备。因此如何精确的将障碍点定位就显得十分重要。

    1、首先分析光缆线路的常见障碍现象及原因。

    (1)线路全部中断:光板出现R-LOS告警,可能原因有光缆受外力影响被挖断、炸断或拉断等;

    (2)个别系统通信质量下降:出现误码告警,线路可能的原因有光缆在敷设和接续过程中,造成光纤的损伤使线路损耗时小时大。

    2、在确定线路障碍后,利用OTDR对线路测试,以确定障碍的性质和部位。

    当遇到自然灾害或外界施工等外力影响造成光缆线路阻断时,查修人员根据测试人员提供的位置,一般比较容易找到,但如不是上述情况,就不容易从路由上的异常现象找到障碍地点。这时,必须根据OTDR测出的障碍点到测试点的距离,与原始测试资料进行核对,查出障碍点处于个哪个区段,再通过必要的换算后,再精确丈量其间的地面距离,直至找到障碍点的具体位置。但是往往事不如意,障碍点与测量计算的位置相差很大,这样既浪费人力物力、而由于光缆线路障碍造成的影响或损失会更大。

    二、利用OTDR判断故障位置

    如何才能更精确的判断障碍点的准确位置呢?首先要分析影响光缆线路障碍点准确定位的主要因素。

    1、OTDR测试仪表存在的固有偏差

    由OTDR的测试原理可知,它是按一定的周期向被测光纤发送光脉冲,再按一定的速率将来自光纤的背向散射信号抽样、量化、编码后,存储并显示出来。这样OTDR仪表本身由于抽样间隔而存在误差,这种固有偏差主要反映在距离分辨率上,OTDR的距离分辨率正比于抽样频率。

    2、测试仪表操作不当产生的误差

    在光缆故障定位测试时,OTDR仪表使用的正确性与障碍测试的准确性直接相关。仪表参数设定和准确性、仪表量程范围的选择不当或光标设置不准等都将导致测试结果的误差。

    (1)设定仪表的折射率偏差产生的误差

    不同厂家、不同类型的光纤其光纤折射率是不同的。因此使用OTDR测试光纤长度时,必须先进行仪表参数设定。折射率的设定就是其中一。当几段光缆的折射率不同时可采用分段设置的方法,以减少因折射率设置误差而造成的测试误差。

    (2)量程范围选择不当

    OTDR仪表测试距离分辨率为1米时,它是指图形放大到水平刻度为25米/格时才能实现。仪表设计是以光标每移动25步为1满格,在这种情况下,光标每移动一步,即表示移动1米的距离,所以读出分辨率为1米。如果水平刻度选择2公里/格,则光标每移动一步,距离就会偏移80米(即2000/25米)。由此可见,测试时选择的量程范围越大,测试结果的偏差就越大。

    (3)脉冲宽度选择不当

    在脉冲幅度相同的条件下,脉冲宽度越大,脉冲能量就越大,此时OTDR的动态范围也越大,相应盲区也就大。

    (4)平均化处理时间选择不当

    OTDR测试曲线是将每次输出脉冲后的反射信号采样,并把多次采样做平均处理以消除一些随机事件,平均化时间越长,噪声电平越接近最小值,动态范围就越大。平均化时间越长,测试精度越高,但达到一定程度时精度不再提高,为了提高测试速度,缩短整体测试时间。

    (5)光标位置放置不当

    光纤活动连接器、机械接头和光纤中的断裂都会引起损耗和反射,光纤未端的破裂端面由于未端端面的不规则性会产生各种菲涅尔反射峰或者不产生菲涅尔反射。如果光标设置不够准确,也会产生一定误差。

    三、提高光缆线路故障定位准确性的方法

    1、正确掌握仪表的使用方法

    (1)正确设置OTDR的参数

    使用OTDR测试时,必须先进行仪表参数设定,其中最主要是设定测试光纤的折射率和测试波长,只有准确地设置了测试仪表的基本参数,才能为准确的测试创造条件。

    (2)选择适当的测试范围档

    对于不同的测试范围档,OTDR测试的距离分辨率是不同的,在测量光纤障碍点时,应选择大于被测距离而又最近的测试范围档,这样才能充分利用仪表的本身精度。

    (3)应用仪表的放大功能

    应用OTDR的放大功能就可将光标准确置定在相应的拐点上,使用放大功能键可将图形放大到25米/格,这样便可得到分辨率小于1米的比较准确的测试结果。

    2、建立准确、完整的原始资料

    准确、完整的光缆线路资料是障碍测量、定位的基本依据。因此,必须重视线路资料的收集、整理、核对工作,建立起真实、可信、完整的线路资料。在光缆接续监测时,记录测试端至每个接头点位置的光纤累计长度及中继段光纤总衰减值,同时也将测试仪表型号、测试时折射率的设定值进行登记。准确记录各种光缆余留。详细记录每个接头坑、特殊地段、S形敷设、进室等处光缆盘留长度及接头盒、终端盒、ODF架等部位光纤盘留长度,以便在换算故障点路由长度时予以扣除。

    3、保持测试条件的一致性

    障碍测试时应尽量保证测试仪表型号、操作方法及仪表参数设置等的一致性,使得测试结果有可比性。因此,每次测试仪表的型号、测试参数的设置都要做详细记录,以便于以后利用。

    4、灵活测试、综合分析

    障碍点的测试要求操作人员一定要有清晰的思路和灵活的处理问题的方法。一般情况下,可在光缆线路两端进行双向故障测试,并结合原始资料,计算出故障点的位置,再将两个方向的测试和计算结果进行综合分析、比较,以使故障点的具体位置的判断更加准确。当故障点附近路由上没有明显特征、具体障碍点现场无法确定时,可采用在就近接头处测量等方法,可在初步测试的障碍点处开挖,端站测试仪表处于实时状态。

    展开全文
  • 1、按下Win+R,输入cmd。有些电脑有问题,可能按不出来,那就在系统图标输入cmd或者cmd.exe 2、ping百度 ping www.baidu.com -t 让DOS命令执行一段时间,看看ping命令中手否有中断情况?如果没有,说明目前的...
  • 处理器模式可以通过软件控制进行切换(直接设置CPSR寄存器的后五位就可以在6种特权模式之间互相切换),也可以通过外部中断或异常处理过程进行切换(例如,在USR模式下,发生中断后切换到IRQ模式)。 2、ARM各个模式...
  •  CPU在计算机系统中,除了能够执行指令,进行运算外,还应该能够对外部设备进行控制,接收它们的输入,向它们进行输出。也就是说,CPU除了有运算能力外,还要有I/O能力。2. 要及时处理外设的输入,显然需要解决两...
  • 1、ARM处理器各个模式之间是如何切换的? 答:除用户模式外的其他6种模式...处理器模式可以通过软件控制进行切换(直接设置CPSR寄存器的后五位就可以在6种特权模式之间互相切换),也可以通过外部中断或异常处理过程...
  • 除对操作系统常识性的了解(比如知道中断、进程等概念)之外,本书不假定读者具备其他任何经验。 如果你学习过操作系统的理论课程,你会发现本书是对于理论的吻合和补充。它是从实践的角度为你展现一幅操作系统画面...
  • 解析如何设计RTC电路

    2020-07-14 00:18:07
    通常把集成于芯片内部的RTC称为片内RTC,在芯片外扩展的RTC称为外部RTC,PCF8563是一款低功耗的CMOS实时时钟/日历外部芯片,支持可编程时钟输出、中断输出、低压检测等,与处理器通过I2C串行总线进行通信,最大总线...
  • 统计资料显示,光纤通信系统中通信中断的主要原因是光缆线路障碍,它约占障碍的2/3以上。  在光传输系统故障处理中故障定位的一般思路为:先外部、后传输。也就是说在故障定位时,先排除外部的可能因素,如光纤...
  • 如何设计一个标准的PicoBlaze处理器已经在前面详细介绍,本节将对标准的PicoBlaze处理器进行简化,即减少不用的指令。采用尽可能少的CPLD逻辑资源来实现CoolBlaze处理器,用于控制一个小型的8位LED显示系统,其系统...
  • 1.结构化编程 1.1 采用统一编程方法的目的 1.2 创建结构化机器人程序的辅助工具 1.3 如何创建程序流程图 2 SUBMIT 解释器 2.1 使用 SUBMIT 解释器 3 KRL 工作空间 3.1 使用工作空间 3.2 练习: 工作空间监控 ...
  • stm32的时钟不是很复杂,在CUBEMX里是可以直接图形化配置的,而且在启动文件的复位中断进行了初始化 先讲一下时钟树 认识STM32的时钟管理方式后就要对其时钟树系统有一个大体的掌握,时钟树系统的结构如下,从图中...
  • JavaScript事件驱动机制&定时器机制

    千次阅读 2015-07-03 11:37:46
    在浏览器中,事件作为一个极为重要的机制,...操作系统处理键盘等硬件输入就是通过中断进行的,这个方式的好处是即使没有多线程,我们也可以放心地执行我们的代码,CPU收到中断信号之后自动地转去执行相应的中断处理
  • 1.外部放置四个键盘,用于设置不同的投喂时间间隔 2.时间达到设定值,发光二极管以及蜂鸣器工作。 3.距离下次投喂的时间以倒数形式展示在数码管 具体思路 为了实现时间计算的精准,这里通过t0。 其次,为了实现倒...
  • 1、科普的观点 操作系统是计算机系统的管理和控制中心,它依照设计者制定的各种调度策略组织和管理计算机系统资源,使之能高效地运行。 2、功能的观点 操作系统是一个计算机资源管理系统,它负责计算机系统的全部...
  • 中断响应就是允许其中断 CPU______运行,转去对该请求进行预处理,包括保存好 ______,调出有关处理该中断服务程序,准备运行。 19.设多体单字低位交叉的存贮器,单体容量为 I 的 m 个分体,其 Mj 的编址模式为 m×i...
  • 除对操作系统常识性的了解(比如知道中断、进程等概念)之外,本书不假定读者具备其他任何经验。 如果你学习过操作系统的理论课程,你会发现本书是对于理论的吻合和补充。它是从实践的角度为你展现一幅操作系统画面...
  • 它可在无任何外部数据存储器的单片80C51系统上运行,并且是可移植的。全书分两部分。第一部分为基础篇,介绍Small RTOS51和一些基本概念,并详细分析Small RTOS51的工作原理。第二部分为应用篇,给出部分常用硬件在...
  • 汇编语言学习(九)

    2018-07-31 21:43:07
    本部分为王爽《汇编语言》第15、16、17章的内容。 主要为:外中断、直接定址法、BIOS对键盘的读和写。...CPU通过端口与外部设备进行联系。 在PC系统中,外中断源一共有两类: (1)可屏蔽中断 CPU可以不...
  • 如何将参数从一个传动单元复制到其它传动单元 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 如何调整显示屏的亮度. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
  • 答:80386把中断分为外部中断和内部中断两大类,外部中断经NMI和INTR引线输入请求信号。内部中断也叫内部异常中断,分为陷阱中断、内部故障异常中断、异常终止中断。 32.80386在保护方式下中断描述符表与8086的中断...
  • TCP_IP详解卷1

    热门讨论 2010-12-29 10:53:54
    描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作...

空空如也

空空如也

1 2 3 4
收藏数 73
精华内容 29
关键字:

中断系统外部中断1如何进行