汇编语言[王爽]-13 int指令【中断实现loop、jmp】

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

Untitled

编写可供应用程序调用的中断例程

Untitled

我们要完成三步工作:

  1. 编写实现求平方功能的程序
  2. 安装程序,将其安装在0:200处
  3. 设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程
assume cs:code
code segment
start:
	mov ax,cs
	mov ds,ax
	mov si,offset sqr
	mov ax,0
	mov es,ax
	mov di,200h
	mov cx,offset sqrend-offset sqr
	cld 
	rep movsb

	mov ax,0
	mov es,ax
	mov word ptr es:[7ch*4],200h
	mov word ptr es:[7ch*4+2],0

	mov ax,4c00h
	int 21h

sqr: mul ax
	iret
sqr:nop

code ends
end start

对int、iret和栈的深入理解:中断实现loop、jmp

loop的流程

  1. 查看cx,为0则继续执行
  2. 不为0,则跳转

对于cx条件跳转,可以用 jcxz ,如果不跳转则不干预,跳转则需要ip的相对于目标地址的偏移,这需要参数提供

;中断例程
lp:
	push bp
	mov bp,sp
	dec cx
	jcxz lpret
	add [bp+2],bx
lpret:
	pop bp
	iret
  • 为什么需要使用bp,因为sp寄存器不能作为索引,只有bx,si,di,bp可以,我们之前说过,bp一般用于栈的寻址,就是用在这里
  • 为什么是bp+2

push bp后的栈结构

push bp后的栈结构

检测点13,1

Untitled

;应用举例
assume cs:code
data segment 
	db 'conversation',0
data ends

code segment
start:
	mov ax,data
	mov ds,ax
	mov si,0
	mov ax,0b800h
	mov es,ax
	mov di,12*160

s:
	cmp byte ptr [bx], 0
	je ok
	mov al,[si]
	mov byte ptr es:[di],al
	inc si
	add di,2
	mov bx,offset s-offset ok
	int 7ch
ok:
	mov ax,4c00h
	int 21h

code ends
end start
;编写的7ch中断例程
jmnp:
	push bp
	mov bp,sp
	add [bp+2],bx
	pop bp
	iret

BIOS和DOS所提供的中断例程

前面的课程汇总,我们都是自己编写中断例程,将他们放到安装程序中,然后运行安装程序,才把他们安装到指定的内存区中,并登记中断向量表。

而BIOS和DOS提供的中断例程是如何安装到内存中的呢?

Untitled

Untitled

(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

Untitled

编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的’a’

assume cs:code

code segment
start:
	mov ah,2
	mov bh,0
	mov dh,5
	mov dl,12
	int 10h

	mov ah,9
	mov al,'a'
	mov bl,11001010b
	mov bh,0
	mov cx,1
	int 10h

	mov ax,4c00h
	int 21h

code ends
end start

Untitled

;在光标的位置显示字符串,字符串地址为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 segment
	db 'Welcome to masm!','$'
data ends

code segment
start:
	mov ah,2
	mov bh,0
	mov dh,5
	mov dl,12
	int 10h

	mov ax,data
	mov ds,ax
	mov dx,0
	mov ah,9
	int 21h

	mov ax,4c00h
	int 21h

code ends
end start
posted @ 2025-09-15 16:06  Miaops  阅读(3)  评论(0)    收藏  举报