int
1. 中断回顾
(1)取得中断类型码N;
(2)pushf
(3)TF=0, IF=0
(4)push CS
(5)push IP
(6)(IP)=(N*4), (CS)=(N*4+2)
iret
pop ip
pop cs
popf
2. 在屏幕中间显示 80 个"!", 以中断程序的方式完成 loop 指令循环
assume cs:code,ss:stack,ds:data
data segment
db 128 dup (0)
data ends
stack segment stack
db 128 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
call cpy_new_init0
call set_new_init0
int 0 ; 会执行 new_init0
mov ax,4C00H
int 21H
; -------------------------------------
set_new_init0:
mov bx,0
mov es,bx
cli ; 清除标志位IF, 即设置为0(DI), 禁止中断发生
mov word ptr es:[0*4],7E00H
mov word ptr es:[0*4+2],0
sti ; 设置标志位IF, 即设置为1(EI), 允许中断发生
ret
; -r
; AX=0E2C BX=0000 CX=0000 DX=0000 SP=0080 BP=0000 SI=0049 DI=7E1E
; DS=0E34 ES=0000 SS=0E2C CS=0E34 IP=000E NV UP EI PL NZ NA PO NC
; 0E34:000E CD00 INT 00
; -u cs:2b
; 0E34:002B 53 PUSH BX
; 0E34:002C 51 PUSH CX
; 0E34:002D 52 PUSH DX
; 0E34:002E 06 PUSH ES
; 0E34:002F BB00B8 MOV BX,B800
; 0E34:0032 8EC3 MOV ES,BX
; 0E34:0034 BB0000 MOV BX,0000
; 0E34:0037 B9D007 MOV CX,07D0
; 0E34:003A B221 MOV DL,21
; ...
; -d cs:2b 2F
; 0E34:0020 53 51 52 06 BB SQR..
; 0E34:0030 00 B8 8E C3 BB 00 00 B9-D0 07 B2 21 26 88 17 83 ...........!&...
; -d es:7E00 F
; 0000:7E00 53 51 52 06 BB 00 B8 8E-C3 BB 00 00 B9 D0 07 B2 SQR.............
; -d 0:0 F
; 0000:0000 00 7E 00 00 BB 13 21 08-F4 00 70 00 B1 13 21 08 .~....!...p...!.
; -------------------------------------
new_init0:
; 先用这些测试
; mov ax,1000H
; mov ax,1000H
; mov ax,1000H
; mov ax,1000H
push bx
push cx
push dx
push es
mov bx,0B800H
mov es,bx
mov bx,0
mov cx,2000
mov dl, '!'
show_asc:
mov es:[bx],dl
add bx,2
loop show_asc
pop es
pop dx
pop cx
pop bx
iret
; -------------------------------------
new_init0_end:
nop
; -------------------------------------
cpy_new_init0:
mov bx,cs
mov ds,bx
mov si,OFFSET new_init0
mov bx,0
mov es,bx
mov di,7E00H
mov cx,OFFSET new_init0_end - new_init0
cld ; si++ di++ ds[si] => es[di]
rep movsb
ret
code ends
end start
3. 编写、安装中断 7ch 的中断例程
功能:求一 word 型数据的平方 参数:(ax)= 要计算的数据 返回值:dx、ax 中存放结果的高 16 位和低 16 位 应用举例:求 2*3456^2
assume cs:code
code segment
start:
call copy_new_int7ch ; 复制到 0:200
call set_new_int7ch
mov ax,3456
int 7ch
; AX=0D80 BX=0000 CX=0000 DX=0000 SP=0000 BP=0000 SI=0013 DI=0203
; DS=0E24 ES=0000 SS=0E23 CS=0E24 IP=0009 NV UP EI PL NZ NA PO NC
; 0E24:0009 CD7C INT 7C
; -t
; AX=0D80 BX=0000 CX=0000 DX=0000 SP=FFFA BP=0000 SI=0013 DI=0203
; DS=0E24 ES=0000 SS=0E23 CS=0000 IP=0200 NV UP DI PL NZ NA PO NC
; 0000:0200 F7E0 MUL AX
; -t
; AX=4000 BX=0000 CX=0000 DX=00B6 SP=FFFA BP=0000 SI=0013 DI=0203
; DS=0E24 ES=0000 SS=0E23 CS=0000 IP=0202 OV UP DI PL NZ NA PE CY
; 0000:0202 CF IRET
; -t
; AX=4000 BX=0000 CX=0000 DX=00B6 SP=0000 BP=0000 SI=0013 DI=0203
; DS=0E24 ES=0000 SS=0E23 CS=0E24 IP=000B NV UP EI PL NZ NA PO NC
; 0E24:000B B8004C MOV AX,4C00
mov ax,4c00h
int 21h
sqr:
mul ax
iret
sqr_end:
nop
set_new_int7ch:
mov ax,0
mov es,ax
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0
; -d es:1F0
; 0000:01F0 00 02 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
ret
copy_new_int7ch:
mov ax,cs
mov ds,ax
mov si,offset sqr ; 设置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ; 设置es:di指向目的地址
mov cx,offset sqr_end - sqr ; 设置cx为传输长度
cld ; 设置传输方向为正
rep movsb
; -u es:200
; 0000:0200 F7E0 MUL AX
; 0000:0202 CF IRET
; -d es:200
; 0000:0200 F7 E0 CF 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
ret
code ends
end start
4. 编写、安装中断 7ch 的中断例程
功能:将一个全是字母,以 0 结尾的字符串,转化为大写 参数:ds:si 指向字符串的首地址 应用举例:将 data 段中的字符串转化为大写
assume cs:code
data segment
db 'conversation',0
data ends
code segment
start:
call copy_new_int7ch ; 安装程序
call set_new_int7ch ; 设置程序入口
mov ax,data
mov ds,ax
mov si,0
int 7ch ; 测试
mov ax,4c00h
int 21h
set_new_int7ch:
mov ax,0
mov es,ax
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0
ret
copy_new_int7ch:
mov ax,cs
mov ds,ax
mov si,offset capital ; 设置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ; 设置es:di指向目的地址
mov cx,offset capital_end - capital ; 设置cx为传输长度
cld ; 设置传输方向为正
rep movsb
ret
capital:
push cx
push si
change:
mov cl,[si]
mov ch,0
jcxz ok
and byte ptr [si],11011111b
inc si
jmp short change
ok:
pop si
pop cx
iret
capital_end:
nop
code ends
end start