汇编条记_第十二章_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

title: 汇编条记_第十二章
date: 2019-01-01 18:49:05
tags:

  • 条记
    categories:
  • 汇编语言

内里缀

中缀的发作

中缀
中缀分为 软件中缀硬件中缀,前者又称为内里缀后者又称为外部中缀;

软件中缀: 由CPU内部的某些事宜激发的,不受中缀许可标记IF的掌握。包孕:

  • 由终端指令 int n 激发,n指出中缀范例
  • 由CPU的某些毛病激发,除法错中缀(范例号0)、溢出中缀(范例号4)
  • 为调试顺序Debug设置的中缀,单步中缀(范例号1)、断点中缀(范例号3)

硬件中缀: 由输入输出外设发作的中缀请求激发的中缀。
8086体系的硬件中缀可分为 可屏障中缀弗成屏障中缀。一切的中缀请求都有对应的中缀处置惩罚子顺序与之对应;

增补:

  • 内里缀中,int n和into指令发作的中缀和动身错中缀都不克不及被制止,而且比任何外部中缀的优先级都高;
  • 8086体系的硬件中缀都是经由历程CPU的引脚引入中缀请求型号,弗成屏障中缀请求旌旗灯号接到CPU的NMI引脚上,当发作电源毛病,奇偶磨练错,io通道校验错等紧急情况时有体系自动发作,NMI弗成屏障中缀的范例号为2;
  • 可屏障中缀是键盘、显现器、打印机、磁盘、串口、并口等外设发出的。由于可屏障中缀品种较多,体系特地有8259A中缀掌握器来治理这些中缀。可屏障中缀指这些外设能够用软件设置许可或制止器发出中缀请求。8086可屏障中缀的中缀范例号为08H~0FH;
  • 优先级由高到低:内部中缀-非屏障中缀-可屏障中缀-单步中缀;
  • 硬件中缀时,CPU实行完一条指令后都邑读取INTR引脚旌旗灯号;
  • 软件中缀时,若为0-4号中缀,CPU按相应的体式格局处置惩罚,若是是int n指令,则由n猎取中缀向量转而实行中缀处置惩罚顺序;
  • 单步中缀是int 1(TF=1);

中缀处置惩罚顺序

CPU的设计者必需在中缀信息和其处置惩罚顺序的进口地点之间竖立某种联络,使得CPU能够依据中缀信息能够找到哟啊实行的处置惩罚顺序;

中缀范例和中缀向量表

8086供应了256个中缀范例,范例号为0~FFH;

CPU用8位的中缀范例码经由历程中缀向量表找到相应的中缀处置惩罚顺序的入后地点;

用中缀范例码找到中缀向量,并用它设置CS和IP,这个事情是由CPU的硬件自动完成的,这个历程称为 中缀历程

8086中特地竖立了一张中缀向量表用于生存一切的中缀向量。表位于内存最低地点区0最先的1KB单位。每一个中缀向量占用4个字节,高位放段地点,低位放偏移地点;

中缀向量表的地点为:00000H~003FCH;

个中,

  • 5个专用中缀:范例0中缀(动身失足)00000H~00003H,生存ip和cs内容、范例1中缀(单步中缀)00004H~00007H、范例2中缀(NMI)00008H~0000BH、范例3中缀(断点中缀)0000CH~0000FH、范例4中缀(溢出中缀)00010H~00013H;
  • 27个体系保存中缀:范例5中缀~范例31中缀00014H~0007FH;
  • 224个用户自定义中缀: 范例32中缀~范例255中缀00080H~003FCH;

中缀历程

8086CPU的中缀历程:

1、获得中缀范例码

2、标记寄存器的指入栈

3、设置标记寄存器的第8位TF和第9位IF的值0

4、CS的内容入栈

5、IP的内容入栈

6、从内存地点位中缀范例码*4和中缀范例码*4 2的两个字的单位中读取中缀处置惩罚顺序的进口地点设置IP和CS

  • 在运用call指令挪用子顺序时有一样的题目,子顺序实行后还要返回到本来的实行点继承实行,以是,call指令先生存以后CS和IP值,然后设置CS和IP跳转;

中缀处置惩罚顺序和iret指令

CPU要随时都能够实行中缀顺序,以是中缀处置惩罚顺序必需一直在内存的某段空间中;同时,中缀顺序的进口地点,即中缀向量必需贮存在对应的中缀向量表表项中;

中缀处置惩罚顺序的编写要领:

  • 1、生存用到的寄存器
  • 2、处置惩罚中缀
  • 3、规复用到的寄存器
  • 4、用 iret 指令返回

iret指令的功用用汇编语法形貌为:

pop IP
pop CS
popf

iret一般和硬件自动完成的中缀顺序合营运用;

入栈的顺序时标记寄存器、CS、IP,和iret的出栈相反;

编写处置惩罚0号中缀

当发作动身溢出时,CPU将举行以下事情:

  • 1、获得中缀范例码0
  • 2、标记寄存器入栈,TF、IF设置为0
  • 3、CS、IP入栈
  • 4、(IP)=(0*4),(CS)=(0*4 2)

中缀处置惩罚顺序do0,只需显现"overflow!"

  • 1、相干处置惩罚
  • 2、向显现缓冲区送入字符串"overflow!"
  • 3、返回dos

由于除法溢出随时能够发作,CPU随时能够将cs:ip指向do0的进口,实行顺序,以是为了简朴能够将中缀处置惩罚顺序do0放到中缀向量表的0000:0200处;

以是末了的处置惩罚是;

  • 1、编写能够显现"overflow!"的中缀顺序do0;
  • 2、将do0送到内存0000:0200处
  • 3、将do0的进口地点0000:0200存储在中缀向量表0号表项中

大抵的框架:

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-
assume cs:code
code segment
start:
    do0装置顺序
    设置中缀向量表
    mov ax,4c00h
    int 21h

do0:
    显现字符串:"overflow!"
    mov ax,4c00h
    int 21h
;do0顺序在这段顺序中其实不实行,只是作为数据传送到中缀向量表中,即装置顺序
code ends
end start

装置

中缀顺序的装置能够运用 rep movsb 来将do0的代码送入到0000:0200处;

大抵框架:

assume cs:code
code segment
start:
    设置es:di指向目标地点
    设置ds:si指向源地点
    设置cx的长度
    设置传送偏向为正
    rep movsb

    设置中缀向量表

    mov ax,4c00h
    int 21h

do0:
    显现字符串:"overflow!"
    mov ax,4c00h
    int 21h

code ends
end start

运用 rep movsb 要肯定的信息:

  • 目标地点:0000:0200
  • 源地点:code:offset do0
  • 传送的长度cx: do0的代码的长度
  • 传送偏向为正: cld

由于do0的长度依据分歧的序求需求会转变,没有必要每一次都盘算,能够在末了加一个 do0end:nop,如许 mov cx,offset do0end-offset do0便可,"-"是编译器识其余运算标记,编译器能够用它来举行两个 常数 的减法,同时,也能够处置惩罚表达式;

末了的装置顺序:

assume cs:code
code segment
start:
    mov ax,0
    mov es,ax
    mov di,0200h        ;目标地点
    mov ax,cs
    mov ds,ax
    mov si,offset do0   ;源地点
    mov cx,offset do0end-offset do0
    cld
    rep movsb

    设置中缀向量表

    mov ax,4c00h
    int 21h

do0:
    显现字符串:"overflow!"
    mov ax,4c00h
    int 21h
do0end:nop

code ends
end start

do0

do0的义务是显现字符串,大抵的框架:

do0:
    设置ds:si指向字符串
    mov ax,0b800h
    mov es,ax
    mov di,12*160 36*2
    ;设置es:di指向显存空间中央地位

    mov cx,9    ;设置cx为字符串长度
  s:
    mov al,[si]
    mov es:[di],al
    inc si
    add di,2
    loop s

    mov ax,4c00h
    int 21h

do0end:nop

这里的字符串的寄存不克不及像之前的顺序那样放在总顺序的数据段中,由于当总顺序运转完后数据段也就开释,不克不及包管中缀顺序所显现的字符串照样"overflow!";

以是要将字符串放在do0中,将其以通送到中缀向量表的0000:0200处;

如许在发作除法溢出时,cs中寄存的是do0的段地点,同时也是字符串的段地点,而由于顺序要跳过字符串,不把他看成代码实行,以是在字符串之前要有一个jmp指令跳过字符串到现实的代码处,以是字符串的偏移地点就为0000:0200加2即0000:0202处(jmp占两个字节)

末了的顺序:

do0:
    jmp short do0start
    db "overflow!"

do0start:
    mov ax,cs
    mov ds,ax
    mov si,0202h
    ;设置ds:si指向字符串

    mov ax,0b800h
    mov es,ax
    mov di,12*160 36*2
    
    mov cx,9

  s:
    mov al,[si]
    mov es:[di],al
    inc si
    add di,2
    loop s

    mov ax,4c00h
    int 21h

do0end:nop

设置中缀向量

设置中缀向量即为将do0的入后地点0000:0200写入到中缀向量表的0号表项中,使do0成为0号中缀的中缀处置惩罚顺序;

0号表项的地点为0:0,个中0:0字单位寄存偏移地点(ip),0:2字单位寄存段地点(cs),

mov ax,0
mov es,ax
mov word ptr es:[0*4],0200h
mov word ptr es:[0*4 2],0

综上,末了的顺序以下:

assume cs:code
code segment
start:
    mov ax,0
    mov es,ax
    mov di,0200h
    mov ax,cs
    mov ds,ax
    mov si,offset do0
    mov cx,offset do0end-offset do0
    cld
    rep movsb
    
    mov ax,0
    mov es,ax
    mov word ptr es:[0*4],0200h
    mov word ptr es:[0*4 2],0
    
    mov ax,1000h
    mov bh,1
    div bh
    
    mov ax,4c00h
    int 21h
    
do0:
    jmp short do0start
    db "overflow!"
do0start:
    mov ax,cs
    mov ds,ax
    mov si,202h
    
    mov ax,0b800h
    mov es,ax
    mov di,12*160 36*2
    
    mov cx,9
    
  s:
    mov al,[si]
    mov es:[di],al
    inc si
    add di,2
    loop s
    
    mov ax,4c00h
    int 21h
    
do0end:nop

code ends
end start

单步中缀

CPU在实行完一条指令后,若是检测到标记寄存器的TF位为1,则发作单步中缀,单步中缀的中缀范例码为1;

他激发的中缀范例以下:

  • 1、获得中缀范例码1
  • 标记寄存器入栈,TF、IF置0
  • CS,IP入栈
  • (IP)=(14),(CS)=(14 2)

运用t敕令时,debug将TF设置为1,使得cpu实行完这条指令后激发单步中缀;

实行单步中缀的中缀顺序,一切寄存器的内容显现,守候输入;

中缀处置惩罚顺序也是由一条条指令构成的,若是在实行中缀处置惩罚顺序之前,TF=1,则CPU在实行完中缀处置惩罚顺序的第一条指令后,又要发作单步中缀,则又要转去实行单步中缀的中缀处置惩罚顺序…… ?

解决要领是在进入中缀顺序之前设置TF=0,也就是在前面说的中缀历程当中的第二步标记寄存器入栈后设置TF=0的缘由;

CPU供应单步中缀功用的缘由就是,为单步跟踪的实行历程,供应了完成机制。

相应中缀的特殊情况

有些情况下,CPU在实行完以后指令后,纵然发作中缀,也不相应,比方:在实行完向ss寄存器传送数据的指令后,发作中缀时,CPU也不会相应,由于,ss:sp团结指向栈顶,对他们的设置应当一连完成;

若是在实行完设置ss的指令后,CPU相应中缀,激发中缀历程,要在栈中压入标记寄存器、CS和IP的值。
而ss转变,sp并未转变,ss:sp指向的不是准确的栈顶,将激发毛病。

以是CPU在实行完设置ss的指令后,不相应中缀。
这给一连设置 ss和sp,指向准确的栈顶供应了一个机遇。
即,我们应当应用这个特征,将设置ss和sp的指令一连寄存,使得设置sp的指令紧接着设置ss的指令实行,而在此之间,CPU不会激发中缀历程

诠释了试验2中的(3)

Debug 应用单步中缀来完成T敕令的功用,
也就是说,用T敕令实行一条指令后,CPU相应单步中缀,实行Debug设置好的处置惩罚顺序,才能在屏幕上显现寄存器的状况,并守候敕令的输入。

而在mov ss,ax指令实行后,CPU基础就不相应任何中缀,个中也包孕单步中缀,

以是Debug设置好的用来显现寄存器状况和守候输入敕令的中缀处置惩罚顺序基础没有获得实行,以是我们看不到预期的效果。

CPU接着向下实行背面的指令mov sp,10h,然后相应单步中缀,我们才看到一般的效果

(以上援用来自汇编先生的课件,转载请说明地点)
https://www.cnblogs.com/31415926535x/p/10206507.html
(end)

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。