我正在尝试创建自定义中断...对于int 40h,int 42h,int 45h.i创建了向量设计但是在IRET指令调用之后它显示错误指令尚未定义...如何解决这个问题 . ..
我试图使用我迄今为止尝试的中断添加,减法,除法和乘法:
code segment
assume cs:code,ds:code
org 1000h
mov ax,0000h
mov ds,ax
mov bx,40h*4
mov ax,offset add
mov word ptr [bx],ax
mov dx,0
mov word ptr[bx+2],dx
mov bx,42*4
mov ax,offset sub
mov word ptr [bx],ax
mov dx,0
mov word ptr[bx+2],dx
mov bx,45*4
mov ax,offset div
mov word ptr [bx],ax
mov dx,0
mov word ptr[bx+2],dx
mov bx,48*4
mov ax,offset mul
mov word ptr [bx],ax
mov dx,0
mov word ptr[bx+2],dx
mov cx, 01h;
cmp cx, 01h
jz 40hh
cmp cx, 02h
jz 42hhh
cmp cx, 03h
jz 45hhh
cmp cx, 04h
jz 48hhh
40hh:
int 40h
42hhh:
int 42h
45hhh:
int 45h
48hhh:
int 48h
add:
mov dl,40h
mov dh,30h
add dh,dl
iret
sub:
mov dl,40h
mov dh,30h
sub dl,dh
iret
mul:
mov al,4h
mov bh,3h
mul bh
iret
div:
mov ax,40h
mov cx,05h
div cx
iret
e: ret
int 21h
1 回答
首先,PSP长度为256(100h)字节,而不是4KiB(1000h) .
所以用
ORG 100h
替换ORG 1000h
.其次,你不能假设你的程序将被加载到一段内存中 .
实际上你可以制作一个:它肯定会在0段加载,因为该段有一个已经拥挤的开始1 .
然而,你这样做
这将IVT条目中远指针的段部分设置为零,从而假设
add
,sub
,mul
和div
将进入段零 .将
mov dx,0
替换为mov dx, cs
.最后你的代码在最后运行,传递所有对中断的调用和第一个ISR本身!
您可以使用Int 21/AH=4Ch来终止程序 .
在退出之前,你 should 恢复原始的ISR .
Note ,有一些代码味道 .
您将
DS
设置为指向零段以便写入IVT条目,但是,除非您永远不会执行任何非段覆盖的内存访问,否则将其指向另一个段通常是个坏主意 ."switch"缺少"breaks" . 程序流的每个分支合并到下一个分支(即跳转到
40hhh
也将执行42hh
中的代码) .div
ISR在div
之前未设置dx
.ISR本身非常随意,它们破坏了寄存器,除非这只是一个原型,它们将成为任何真实程序中使用的噩梦 .
1如您所知,因为您正在编写位于段0开头的IVT .