int指令
格式:int n
:n是中断向量码,引发一个中断
作用:等价于下面的代码【中断流程】
1. 取中断向量码N
2. pushf
3. IF=0,TF=0
4. push CS , push IP
5. (IP)=(N*4) ; (CS)=(N*4+2)
iret指令
格式: iret
从中断例程中返回
作用:等价于下面的代码
pop IP
pop CS
popf
call | 调用子程序 | push cs; push ip; jmp |
---|---|---|
ret | 子程序返回 | pop ip ; pop cs |
int | 调用中断例程 | pushf ; push cs ; push ip ; jmp |
iret | 中断例程返回 | pop ip ; pop cs ; popf |
编写可供应用程序调用的中断例程
我们要完成三步工作:
- 编写实现求平方功能的程序
- 安装程序,将其安装在0:200处
- 设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程
assume cs:code
code segment
start:mov ax,csmov ds,axmov si,offset sqrmov ax,0mov es,axmov di,200hmov cx,offset sqrend-offset sqrcld rep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hsqr: mul axiret
sqr:nopcode ends
end start
对int、iret和栈的深入理解:中断实现loop、jmp
loop的流程
- 查看cx,为0则继续执行
- 不为0,则跳转
对于cx条件跳转,可以用 jcxz
,如果不跳转则不干预,跳转则需要ip的相对于目标地址的偏移,这需要参数提供
;中断例程
lp:push bpmov bp,spdec cxjcxz lpretadd [bp+2],bx
lpret:pop bpiret
- 为什么需要使用bp,因为sp寄存器不能作为索引,只有bx,si,di,bp可以,我们之前说过,bp一般用于栈的寻址,就是用在这里
- 为什么是bp+2
push bp后的栈结构
检测点13,1
;应用举例
assume cs:code
data segment db 'conversation',0
data endscode segment
start:mov ax,datamov ds,axmov si,0mov ax,0b800hmov es,axmov di,12*160s:cmp byte ptr [bx], 0je okmov al,[si]mov byte ptr es:[di],alinc siadd di,2mov bx,offset s-offset okint 7ch
ok:mov ax,4c00hint 21hcode ends
end start
;编写的7ch中断例程
jmnp:push bpmov bp,spadd [bp+2],bxpop bpiret
BIOS和DOS所提供的中断例程
前面的课程汇总,我们都是自己编写中断例程,将他们放到安装程序中,然后运行安装程序,才把他们安装到指定的内存区中,并登记中断向量表。
而BIOS和DOS提供的中断例程是如何安装到内存中的呢?
(1). 错误。此处的程序是固化在ROM中的,可读不可写。
(2). 错误。int 19h执行前,os(此处指DOS)还没有开始引导。
BIOS中断例程应用
举个例子体会一下
int 10h
中断例程,由BIOS提供,包含了 多个 和屏幕相关的子程序。
一般来说,一个供程序员调用的中断例程往往包含多个子程序,中断例程内部通过传入的参数来判断执行的是哪个子程序。
BIOS和DOS提供的中断例程,都用 ah
来传递内部子程序的编号
[关于显存的相关知识]
mov ah,2 ;置光标
mov bh,0 ;第0页
mov dh,5 ;dh中放行号
mov dl,12;dl中放列号
int 10h
- (ah)=2 表示调用第10h号中断的2号子程序,功能为设置光标。提供三个参数
- (bh)=0,(dh)=5,(dl)=12,设置光标到第0页,第5行,第12列
mov ah,9 ;在光标的位置显示字符
mov al,'a' ;字符
mov bl,7 ;颜色属性(0000 0111)黑底白字
mov bh,0 ;第0页
mov cx,3 ;字符重复次数
int 10h
编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的’a’
assume cs:codecode segment
start:mov ah,2mov bh,0mov dh,5mov dl,12int 10hmov ah,9mov al,'a'mov bl,11001010bmov bh,0mov cx,1int 10hmov ax,4c00hint 21hcode ends
end start
;在光标的位置显示字符串,字符串地址为ds:dx,以"$"结尾
mov ax,data
mov ds,ax
mov dx,0
mov ah,9
int 21h
编程:用DOS中断例程在平面5行12列显示字符串”Welcome to masm!”
assume cs:code
data segmentdb 'Welcome to masm!','$'
data endscode segment
start:mov ah,2mov bh,0mov dh,5mov dl,12int 10hmov ax,datamov ds,axmov dx,0mov ah,9int 21hmov ax,4c00hint 21hcode ends
end start