张狂的暑假学习之 汇编入门学习笔记 (十一)—— 内中段
参阅: 《汇编语言》 王爽 第12章
中止是指CPU在履行完当时指令后收到某种信息(中止信息),就不在接向下履行,而去对接收到的信息进行处理。中止信息能够来自CPU内部和外部,分内中止,外中止。
1. 内中止的发生
下面4中状况会发生内中止:
(1)除法过错。如:div除法溢出
(2)单步履行。如debug中的单步调试
(3)履行into指令。
(4)履行int指令
2. 处理中止信息
中止信息中包括8位的中止类型吗,用来表明要履行的中止程序。可是,一个程序进口要cs和ip,8位不行。这样,体系中就有一个中止向量表保存中止程序的cs和ip,8位中止类型吗表明是中止向量表中的第几个。而且中止向量表存放在 0000:0000到0000:03ff的1024个单元中。
3. 中止进程
例如:div除法溢出 的中止类型是0,发生div除法溢出后,cpu知道中止类型位0,cpu先保存标志位,cs、ip,设置TF=0、IF=0,然后去到中止向量表取出对应中止处理程序的cs和ip(ip=(0*4),cs=(0*4+2)) 然后履行中止程序。
即:
(1)获得中止类型吗N
(2)pushf
(3)TF=0,IF=0
(4)push cs
(5)push ip
(6)(ip)=(N*4),(cs)=(N*4+2)
4. 中止处理程序和iret指令
iret指令相当于:
pop ip
pop cs
pop f
一般中止处理程序的进程:
(1)保存到寄存器
(2)处理中止
(3)康复到寄存器
(4)iret
5. 写一个中止处理程序
0中止是div除法溢出例如下面程序debug中就会发生overflow过错,在屏幕上显现“Divide overflow”
- assumecs:code
- codesegment
- start:
- movax,1000H
- movbl,1
- divbl
- codeends
- endstart
下面就修正0中止的中止程序,让发生div除法溢出时,在屏幕上显现“Welcome to masm!”
- assumecs:code
- codesegment
- start:
- movax,cs
- movds,ax
- movsi,offsetdo0
- movax,0
- moves,ax
- movdi,200h
- movcx,offsetdo0end-offsetdo0;核算写入巨细
- cld
- repmovsb;把do0~do0end的代码写到0:200开端的内存空间中去
- movax,0
- moves,ax
- movwordptres:[0*4],200h;改动0中止的中止向量表,是0中止指向咱们要的中止处理程序的方位
- movwordptres:[0*4+2],0
- movax,4c00h
- int21h
- do0:
- jmpshortdo0start
- dbWelcometomasm!;保存要显现的信息
- do0start:
- movax,cs
- movds,ax
- movsi,202h;设置要显现信息在代码中的方位
- movax,0b800h
- moves,ax
- movdi,12*160+36*2;显现的方位
- movcx,16
- s:
- moval,[si]
- moves:[di],al
- incsi
- adddi,1
- moval,02h;显现的色彩等信息
- moves:[di],al
- adddi,1
- loops
- movax,4c00h
- int21h
- do0end:
- nop
- codeends
- endstart
先运转上面代码生成的程序,把中止程序拷贝到安全的内存中,改动中止向量表。然后debug会发生div除法溢出的程序,就会看到屏幕中心显现绿色 的“Welcome to masm!”。
6. 单步中止
CPU每履行完一条指令后,假如检测到标志寄存器的TF为1,则会发生单步中止,引发中止进程。单步中止的中止类型吗位1。
进程:
(1)获得中止类型吗1。
(2)标志寄存器入栈,TF,IF设置为0
(3)CS,IP入栈
(4)(IP)=(1*4),(CS)=(1*4+2)
7. 呼应中止的特殊状况
一般状况,假如CPU检测到中止信息,就会呼应中止。但有特殊状况。
当在履行完向ss寄存器传送的指令后,假如发现中止,CPU不会呼应。由于假如ss改动,sp没有改动,ss:sp就不是指向正确的栈顶了。
所以改动ss于改动sp的指令要写在一起
如:
- movax,1000h
- movss,ax
- movsp,0