我正在尝试创建自定义中断...对于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
答案 0 :(得分:1)
首先,PSP长度为256(100h)字节,而不是4KiB(1000h)。
因此,请将ORG 1000h
替换为ORG 100h
。
其次,你不能假设你的程序将被加载到一段内存中
实际上你可以制作一个:不会肯定会加载到0段,因为该段已经拥挤了起点 1 。
然而,你这样做
mov dx,0
mov word ptr[bx+2],dx
将IVT条目中远指针的段部分设置为零,从而假设add
,sub
,mul
和div
将进入零段。
将mov dx,0
替换为mov dx, cs
。
最后你的代码在最后运行,传递所有对中断的调用和第一个ISR本身!
您可以使用Int 21/AH=4Ch来终止程序
在退出之前,您应该恢复原始ISR。
注意,有一些代码味道。
您设置DS
指向段零以编写IVT条目,但是,除非您永远不会执行任何非段覆盖的内存访问,否则它指向另一个段通常是馊主意。
“开关”缺少“休息”。程序流的每个分支合并为下一个分支(即跳转到40hhh
也将执行42hh
的代码。)
div
ISR未在dx
之前设置div
。
ISR本身非常随意,它们破坏了寄存器,除非这只是一个原型,它们将成为在任何真实程序中使用的噩梦。
1 如您所知,因为您正在编写位于第0段开头的IVT。