实模式操作系统:INT 0x21调用无响应,直接调用中断向量表项正常
问题分析与解决方案
嘿,这问题我太熟了!你遇到的核心问题就是中断向量表的段地址设置错误,导致int 0x21指令跳转到了完全错误的内存位置,自然不会执行你的中断处理程序。
先给你拆解一下底层逻辑:
- 实模式下,中断向量表(IVT)里每个条目是4字节:前2字节是中断处理程序的偏移地址(IP),后2字节是段地址(CS)。CPU执行
int 0x21时,会从0x0000:0x0084(也就是21h*4的位置)取出这4个字节,把段地址加载到CS,偏移加载到IP,然后跳转到CS:IP执行。 - 你用
call [21h*4]能正常工作,是因为这个call指令是在当前CS段内直接跳转到[21h*4]里存的偏移地址——刚好你的当前CS是正确的代码段,所以能找到inthandler。但int 0x21会强制切换到你设置的错误段地址(0),而0段的对应偏移位置根本没有你的中断处理代码,当然就没反应了。
看你的代码:
mov word [21h*4],inthandler mov word [21h*4+2],CODE_SEG ;which is 0(incorrect)
你自己都标注了CODE_SEG是0是错误的,这就是关键!你需要把CODE_SEG改成你中断处理程序实际所在的段地址。
举个例子,如果你的代码是加载到0x07C0:0x0000(比如MBR场景),那CODE_SEG应该设为0x07C0;如果你的程序运行在CS=0x1000的段,那就要把CODE_SEG改成0x1000——总之,必须和inthandler所在的代码段的段地址完全一致。
修正后的代码大概是这样(假设你的代码段地址是0x07C0):
mov ax, 0x07C0 mov word [21h*4], inthandler mov word [21h*4+2], ax
再验证一下:当你执行int 0x21时,CPU会把CS设为0x07C0,IP设为inthandler的偏移,刚好跳转到你的中断处理程序,自然就能打印出'd'了。
内容的提问来源于stack exchange,提问作者Clement Poon
相关产品推荐
相关产品推荐

