CPU要通过中断类型号来找到中断向量,所以要在内存中建立一张中断向量表。(在32位保护模式下)32位微机中有256个中断向量,每个中断向量大小为4Byte(如1234:5678H),所以整张表大小为1KB。因为中断向量按照中断号从0地址开始顺序排列,所以任意一个中断类型号为N的中断向量的地址为中断类型号N*4。
例题:
- 中断向量为:编程将中断向量类型21H所对应的中断向量从中断向量表中取出来分别放在 SI 和 BP中。(直接用 MOV 指令即可)
已知:中断向量即中断服务程序的入口地址;
中断向量=中断向量类型号×4;
21H所对应中断向量:
核心语句:SHL BX,CL
;左移两位,等价于×4,即可得到中断向量入口地址。
CODE SEGMENT
ASSUME CS:CODE
START:
XOR AX,AX ;常规操作,AX清空
MOV DS,AX ;注意DS不可直接 MOV 立即数,通常需要借助 AX 寄存器
MOV BX,21H
MOV CL,2 ;注意当移位数>1时,一定要放入CL中
;因为8086规定移位指令的第二个操作数只能是1或CL
SHL BX,CL ;将BX中的21H(0010 0001)左移两位(相当于21H×4),最高位移入CF,最低位补0
;得到对应的中断向量(1000 0001,即132D,84H)
MOV SI,WORD PTR [BX] ;中断向量共有4个字节,先取两个字节放入SI
MOV BP,WORD PTR [BX+2] ;再取两个字节放入BP
MOV AH,4CH ;系统中断返回
INT 21H
CODE ENDS
End Start
运行结果:
- 中断向量为 1234H:5678H,编程将此数据设置成为类型号0对应的中断向量。
code segment
assume cs:code,ds:code
start:
xor ax,ax
mov ds,ax
mov bx,0
mov cl,2
shl bx,cl
mov word ptr[bx],5678h ;存入一个字的长度
mov word ptr[bx+2],1234h
mov ah,4ch
int 21h
code ends
end start
- 假设中断向量为:1234:5678H,编程将此数据设置成为60H对应的中断向量。
code segment
assume cs:code,ds:code
start:xor ax,ax
mov ds,ax
mov bx,60h
mov cl,2
shl bx,cl
mov word ptr[bx], 5678h
mov word ptr[bx+2],1234h
mov ah,4ch
int 21h
code ends
end start
也可以通过字符串操作MOVSB
DATA SEGMENT
BUFFER DB 78H,56H,34H,12H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
CLD ;DF清0
MOV AX,DATA
MOV DS,AX
LEA SI,BUFFER
MOV AX,0
MOV ES,AX
MOV DI,60H
SHL DI,1 ;将一个寄存器或内存单元中的数据向左移位
SHL DI,1 ;将最后移出的一位写入CF中,最低位用0补充
MOV CX,4 ;计数4次
REP MOVSB
MOV AH,4CH
INT 21H
CODE ENDS
END START
其中MOVSB等价于:
NEXT:
MOV AL,[SI]
MOV ES:[DI],AL
INC SI
INC DI
LOOP NEXT
运行结果:
先计算出60H对应中断向量:
执行完程序后,d命令查看中断类型号60H对应的中断向量,结果正确:
分享链接:如何放大DOSBOX窗口