本帖最后由 jackz007 于 2022-12-20 11:44 编辑 assume cs:code , ds:code
code segment para public 'CODE'
msg db 'divide error!' , 00h
lx dw 0ABCDh
foo proc far
push cs
pop ds
lea si,msg
mov ax,0b800h
mov es,ax
mov di,160*12
mov bx,80
sub bx,offset lx
inc bx
and bx,0fffeh
add di,bx
cld
foo1: lodsb
or al,al
jz foo2
stosb
inc di
jmp short foo1
foo2: mov ax,4c00h
int 21h
foo endp
main proc far
mov ax,3500h ; 获取 0 号中断处理程序入口地址
int 21h
cmp word ptr es:[bx-2],0abcdh ; 判断是否已经驻留,避免重复驻留
jz main01 ; 是,跳走
push cs
pop ds
mov dx,offset foo
mov ax,2500h ; 设置 0 号中断向量地址为 ds:dx (cs:ip)
int 21h
mov dx,offset main
add dx,10fh ; 驻留空间包括 PSP 的 100h 字节
mov cl,4
shr dx,cl ; dx = 需要保留的驻留空间小节(10h)数
mov ax,3100h ; 驻留退出,al = 00 是退出状态码
int 21h
main01: mov ax,4c00h ; 正常退出
int 21h
main endp
code ends
end main
x 爽所谓的教程把世界都搞乱了,居然教别人把中断处理程序的代码覆盖到中断向量表的空间内,而不是让程序自然驻留退出,操作系统设置的功能难道是摆设?如果同时需要编写多个中断处理程序又该怎么办?还有,堆栈只定义十几或几十个字节空间,吝啬程度令人发指,代码开始一定要设置 SS 和 SP 等等,这些统统都是误人子弟!就这么一本蹩脚的教材,居然也能风靡?看来真的是没有人了! |