zoukankan      html  css  js  c++  java
  • 第十二章 内中断

    1、中断是CPU处理外部突发事件的一个重要技术。引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断。外部中断是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。外部中断是可以屏蔽的中断,也就是说利用中断控制器可以屏蔽这些外部设备中断请求。内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算溢出、单步中断等)所引起的中断。内部中断是不可屏蔽的中断。软件中断其实并不是真正的中断,他们只是可被调用执行的一般程序以及DOS的系统调用功能(int 21h)等都是软件中断。CPU为了处理并发的中断请求,规定了中断的优先权,中断优先权由高到低的顺序是:1.除法错、溢出中断、软件中断;2.不可屏蔽中断;3.可屏蔽中断;4.单步中断。

    2、中断为windows多任务奠定基础,任务之间不断切换

    3、中断信息中包含有标识中断源的类型码,它是用来定位中断处理程序的。

    4、如何根据8位的中断类型码(8086中断类型码为一个字节)得到中断处理程序的段地址和偏移地址呢?这就要引入“中断向量表”了。中断向量表就是中断向量的列表,CPU用8位的中断类型码通过中断向量表找到相应的中断程序的入口地址

    5、对于8086PC机,中断向量表指定放在内存地址0处,从内存0000:0000到0000:03ff的1024个单元中存放着中断向量表(一个中断数据4个字节)。这包含0:200——0:2FF的安全地址,是因为不是所有的中断都用的到

    6、存储n号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为:n*4,存储段地址的内存单元地址为n*4+2。

    7、中断过程:1.(从中断信息中)取得中断类型码;2.标志内存器的值入栈(保护标志位);3.设置标志寄存器的第8位TF和第9位IF的值为0;4.CS内容入栈;5.IP内容入栈(跟call很像,保存返回地址);6.从内存地址的中断类型码中读取入口地址设置CS和IP。

    8、中断处理程序:由于CPU随时都可能检测到中断信息,也就是说,CPU随时都可能执行中断处理程序,所以中断处理程序必须一直存储在内存中

    9、iret指令返回中断。Iret通常和硬件自动完成的中断过程配合使用的。描述为pop ip,pop cs,popf。

    10、除法错误的中断的处理(0号中断):可以修改中断处理程序(要返回DOS),用rep movsb将代码送入0:200处。

    11、编译器可以处理表达式,例如mov ax (5+3)*3/10

    12、单步中断:debug的t命令实现效果跟这个有关的。CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。提供单步中断的原因:为单步跟踪提供了实现机制。

    13、响应中断的特殊情况:例如:在执行完向ss寄存器传送数据指令后,即便检测到中断信号,CPU也不会响应,这样做的主要原意是,SS:sp联合指向栈顶,而对它们的设置应该连续完成。因此我们应该ss和sp设置紧挨着

     

    View Code
     1 assume cs:code
    2
    3 data segment
    4 db "Welcome to Fish.com!" ;字符串也该放在一个安全的内存空间
    5 ;因为程序执行完内存会被释放
    6 data ends

    7
    8 code segment
    9
    10 start:mov ax,cs
    11 mov ds,ax
    12 mov si,offset do0 ;源数据地址ds:si
    13 mov es,ax

    14 mov di,200h ;目标数据地址es:di
    15

    16 mov cx,offset doend - offset do0 ;do0代码长度
    17 cld ;设置传输方向为正
    18 rep movsb

    19
    20 mov ax,0 ;设置中断向量表
    21 mov es,ax

    22 mov word ptr es:[0*4],200h
    23 mov word ptr es:[0*4+2],0
    24
    25 mov ax,4c00h
    26 int 21h
    27
    28 do0: jmp short do0start ;改进后
    29 db "Welcome to Fishc.com!" ;在代码段存储数据
    30

    31 do0start: ;显示字符串
    32 mov ax,data

    33 mov ds,ax
    34 mov si,202h ;jmp short do0start占两个字节,所以数据从202开始
    35

    36 mov ax,0b800h
    37 mov es,ax
    38 mov di,12*160+36*2 ;设置es:di指向显存空间的中间位置
    39

    40 mov cx,21 ;设置字符串长度
    41 s:mov al,[si]

    42 mov es:[di],al
    43 inc si
    44 add di,2
    45
    46 mov al,02h ;设置颜色
    47 mov es:[di],al

    48 add di,1
    49 loop s
    50
    51 mov ax,4c00h
    52 int 21h
    53 do0end:nop
    54
    55 code ends
    56 end start

     

  • 相关阅读:
    exFAT移动硬盘写保护怎么去掉
    ORACLE:一列的多行数据拼成字符串
    cxgrid中,如何根据列名或字段名取得footer值
    Delphi天气预报查询
    Delphi ListView基本用法大全
    datasnap的初步
    Delphi ListView基本用法大全
    Delphi实现树型结构
    获取身份证号码信息
    让Delphi XE5跟其他版本的Delphi共存
  • 原文地址:https://www.cnblogs.com/quantumplan/p/2404294.html
Copyright © 2011-2022 走看看