第十三章 int指令
由int引起的另一种内中断。
格式:int n (n为中断类型码),用于引发中断过程。
int 与 iret 指令搭配使用,用于实现标志寄存器、CS、IP的入栈及出栈。与call 和 ret 搭配的思路相似。
iret功能为:
pop IP
pop CS
popf
检测点13.1
- 65535(FFFFH)
- (我不会做TT)
jnp: push bp
mov bp, sp
add [bp+2], bx
pop bp
iret
BIOS和DOS中都提供了许多中断例程,供程序员使用int指令调用。
中断例程安装到内存的过程如下:
检测点13.2
- 错误,FFFF:0处单元无法被更改
- 错误,DOS此时未启动
BIOS和DOS提供的中断例程,都用ah来传递子程序编号。
我们一直使用的是int 21h中断例程中的4ch号功能,即程序返回功能。
实验13
assume cs:code
code segment
start: mov ax, cs
mov ds, ax
mov si, offset print
mov ax, 0
mov es, ax
mov di, 200h
mov cx, offset printend - offset print
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
print:
push es
push ax
push cx
push dx
push si
push di
mov ax, 0b800h
mov es, ax
mov al, 160
mov ah, 0
mul dh
mov di, ax
add dl, dl
mov dh, 0
add di, dx
mov al, cl
printstart:
mov ch, 0
mov cl, [si]
jcxz zero
mov ch, al
mov es:[di], cx
add di, 2
inc si
jmp printstart
zero:
pop di
pop si
pop dx
pop cx
pop ax
pop es
iret
printend:
nop
code ends
end start
assume cs:code
code segment
start: mov ax, cs
mov ds, ax
mov si, offset lp
mov ax, 0
mov es, ax
mov di, 200h
mov cx, offset lpend - offset lp
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
lp: push bp
mov bp, sp
dec cx
jcxz lpret
add [bp + 2], bx
lpret: pop bp
iret
lpend: nop
code ends
end start
[si]
[bx]
add bx, 2
inc si