Suave 发表于 2022-12-17 13:39:14

中断处理程序

本帖最后由 Suave 于 2022-12-17 13:42 编辑

编写0号中断的处理程序,使得在除法溢出发生时,在屏幕中间显示字符串:“divide error!”然后返回操作系统


DOS环境下

KeyError 发表于 2022-12-19 09:43:05

{:5_94:}

zhangjinxuan 发表于 2022-12-19 09:47:40

DOS环境下{:10_277:}

人造人 发表于 2022-12-19 14:06:03

先自己写,写到哪里不会了再提问

jackz007 发表于 2022-12-19 16:46:26

本帖最后由 jackz007 于 2022-12-20 11:44 编辑

assume cs:code , ds:code
code segment para public 'CODE'
    msg db 'divide error!' , 00h
    lxdw 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:,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 等等,这些统统都是误人子弟!就这么一本蹩脚的教材,居然也能风靡?看来真的是没有人了!
页: [1]
查看完整版本: 中断处理程序