DOS汇编练习(6)——中断向量(DEBUG调试实例超详细~)

本文介绍了32位微机中断向量表的原理,每个中断向量由4字节组成,中断类型号乘以4即可得到其在中断向量表中的地址。通过示例代码展示了如何使用汇编语言获取和设置中断向量,并通过SHL指令进行计算。同时,还提供了一种使用字符串操作MOVSB来设置中断向量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CPU要通过中断类型号来找到中断向量,所以要在内存中建立一张中断向量表。(在32位保护模式下)32位微机中有256个中断向量,每个中断向量大小为4Byte(如1234:5678H),所以整张表大小为1KB。因为中断向量按照中断号从0地址开始顺序排列,所以任意一个中断类型号为N的中断向量的地址为中断类型号N*4。

例题:

  1. 中断向量为:编程将中断向量类型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

运行结果:

在这里插入图片描述

  1. 中断向量为 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
  1. 假设中断向量为: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窗口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayne_Fine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值