第一步、准备溢出程序
我们要准备溢出程序,用于后面的测试:
assume cs:codesegcodeseg segment_start:mov ax, 1000Hmov bl, 1div blmov ax, 4c00Hint 21H codeseg endsend _start
第二步、编写 0 号中断的处理程序
assume cs:codesegcodeseg segment;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 编写程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; do0:jmp short _do0_startdb "divide error!" ; 13_do0_start:mov ax, cs ; 设置数据地址mov ds, axmov si, 0202Hmov ax, 0B800H ; 设置显存地址mov es, ax mov di, 12*160 + 33*2mov cx, 13 ; 将字符串写入显存s: mov al, ds:[si]mov ah, 2 mov es:[di], axinc siadd di, 2loop smov ax, 4c00H ; 结束程序,不需要使用 iret 返回int 21H _do0_end:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 复制程序(安装);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; start:mov ax, codeseg ; 原始地址mov ds, axmov si, offset do0 mov ax, 0 ; 目的地址mov es, axmov di, 200Hmov cx, offset _do0_end - offset do0 ; 复制长度cld ; 复制方向rep movsb ; 执行复制;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 设置中断向量表;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断程序,段地址:0000H,偏移地址:0200H; 中断程序的 段地址 写入 => 0000:6-7; 中断程序的 偏移地址 写入 => 0000:4-5mov ax, 0mov es, axmov word ptr es:[0], 0200Hmov word ptr es:[2], 0000Hmov ax, 4c00Hint 21Hcodeseg endsend start
参考文献
K4NZ / 参考答案:实验 12 编写 0 号中断的处理程序
CSDN/汇编语言王爽第三版答案
百度文库/汇编语言实验答案 (王爽)