汇编入门学习笔记 (十一)—— 内中段

疯狂的暑假学习之  汇编入门学习笔记 (十一)——  内中段

参考: 《汇编语言》 王爽 第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”

assume cs:code

code segment
start:
	mov ax,1000H
	mov bl,1
	div bl
code ends

end start

下面就修改0中断的中断程序,让产生div除法溢出时,在屏幕上显示“Welcome to masm!”

assume cs:code

code segment
start:
	mov ax,cs
	mov ds,ax
	mov si,offset do0
	mov ax,0
	mov es,ax
	mov di,200h
	mov cx,offset do0end - offset do0    ;计算写入大小
	cld
	rep movsb             ;把do0~do0end的代码写到0:200开始的内存空间中去

	mov ax,0
	mov es,ax
	mov word ptr es:[0*4],200h   ;改变0中断的中断向量表,是0中断指向我们要的中断处理程序的位置
	mov word ptr es:[0*4+2],0

	mov ax,4c00h
	int 21h

do0:
	jmp short do0start
	db 'Welcome to masm!'   ;保存要显示的信息

do0start:
	mov ax,cs
	mov ds,ax
	mov si,202h    ;设置要显示信息在代码中的位置

	mov ax,0b800h
	mov es,ax
	mov di,12*160+36*2    ;显示的位置
	mov cx,16
s:
	mov al,[si]
	mov es:[di],al
	inc si
	add di,1
	mov al,02h       ;显示的颜色等信息
	mov es:[di],al
	add di,1
	loop s

	mov ax,4c00h
	int 21h
do0end:
	nop
code ends

end start

先运行上面代码生成的程序,把中断程序拷贝到安全的内存中,改变中断向量表。然后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的命令要写在一起

如:

mov ax,1000h
mov ss,ax
mov sp,0
时间: 2024-11-05 17:33:08

汇编入门学习笔记 (十一)—— 内中段的相关文章

汇编入门学习笔记 (八)—— 转移指令

疯狂的暑假学习之  汇编入门学习笔记 (八)--  转移指令 參考: <汇编语言> 王爽 第9章 能够改动ip或者同一时候改动cs和ip的指令统称为转移指令. 8086CPU转移行为分为: 段内转移:仅仅改动ip 段间转移:同一时候改动cs和ip 段内转移按ip改动的范围可分为: 短转移:ip改动范围 -128~127 近转移:ip改动范围 -32768~32767 转移指令分为: 无条件转移指令.如 jmp 条件转移指令 循环指令.如 loop 过程. 中断. 1. offset,nop指令

汇编入门学习笔记 (十三)—— 外中断

疯狂的暑假学习之  汇编入门学习笔记 (十三)--  外中断 参考: <汇编语言> 王爽 第15章 1.外中断信息 外中断分为可屏蔽中断和不可屏蔽中断 可屏蔽中断 先看看内中断所引发的中断过程: (1)取中断类型吗n. (2)标志寄存器入栈,设置IF=0,TF=0. (3)CS.IP入栈 (4)(IP)=(n*4),(CS)=(n*4+2) 可屏蔽中断的中断过程于内中断所引发的中断过程不同的地方只是,第一步不同.可屏蔽中断的中断过程,CPU要先看IF的值,如果IF=0就不执行中断,如果IF=1

汇编入门学习笔记 (六)—— si、di,双重循环

疯狂的暑假学习之  汇编入门学习笔记 (六)-- si.di,双重循环 参考: <汇编语言> 王爽 第7章 1. and和or指令,与[bx+idata] and和or,就不多说了. [bx+idata] 这样写是可以的,某些情况下,比较方便. [bx+idata] 也可以写成 idata[bx] 直接见例子: 把'ABcde' 跟 'fGHig' 都改成大写(ASCII中大写字母与小写字母二进制中,只有第五位不同,大写字母是0,小写字母是1) assume cs:code,ds:data d

汇编入门学习笔记 (三) —— 第一个程序

疯狂的暑假学习之  汇编入门学习笔记 (三)-- 第一个程序 参考:<汇编语言> 王爽  第四章 1.一个源程序从写到执行的过程 第一步:编写汇编源程序 第二步:对源程序进行编译连接 第三步:在操作系统中执行 2.源程序 代码: assume cs:first first segment start: mov ax,2 add ax,ax add ax,ax mov ax,4C00H int 21H first ends end start 代码解释: assume .segment.ends

汇编入门学习笔记 (十四)—— 直接定址表

疯狂的暑假学习之  汇编入门学习笔记 (十四)-- 直接定址表 参考: <汇编语言> 王爽 第16章 1. 描述单元长度的标号 普通的标号:a,b assume cs:code code segment a:db 1,2,3,4,5,6,7,8 b:dw 0 start: mov si,offset a mov di,offset b mov ah,0 mov cx,8 s: mov al,cs:[si] add cs:[di],ax inc si loop s mov ax,4c00h in

汇编入门学习笔记 (四)—— [BX] 和 loop指令

疯狂的暑假学习之  汇编入门学习笔记 (四)-- [BX]  和 loop指令 参考:<汇编语言> 王爽 第5章 1.[BX] mov al,[1] 在debug中,会把bs:1 中数据赋给al,但在在masm中不会把bs:1 中数据赋给al,而是把 [1] 认为是 1 赋给al. 如果要实现在debug中的mov al,[1],在masm中就需要[bx] 如: mov bx,1 mov al,[bx] 还可以用 bs:[1] 的方式 如: mov al,bs:[1] 2.loop 循环 要使

汇编入门学习笔记 (七)—— dp,div,dup

疯狂的暑假学习之  汇编入门学习笔记 (七)--  dp,div,dup 参考: <汇编语言> 王爽 第8章 1. bx.si.di.和 bp 8086CPU只有4个寄存器可以用 "[...]" 中进行单元寻址. bp:除了默认的段地址是ss,其他与bx一样. 它们所有正确的组合 mov ax,[bx] mov ax,[si] mov ax,[di] mov ax,[dp] mov ax,[bx+si] mov ax,[bx+di] mov ax,[bp+si] mov a

汇编入门学习笔记 (十二)—— int指令、port

疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一个n号中断. 运行过程相当于: (1)取中断类型吗n. (2)标志寄存器入栈:设置IF=0,TF=0. (3)CS.IP入栈 (4)(IP)=(n*4),(CS)=(n*4+2) 样例1:编写.安装中断7ch.实现求一个word型数据的平方,用ax存放这个数据. assume cs:code code s

汇编入门学习笔记 (九)—— call和ret

疯狂的暑假学习之  汇编入门学习笔记 (九)--  call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据,改动IP内容,从而实现近转移 相当于: pop ip retf指令:用栈中的数据.改动CS和IP,从而实现远转移 相当于: pop ip pop cs 样例:ret assume cs:code,ss:stack stack segment db 16 dup(1) stack ends code segm