「汇编语言 第 3 版 王爽」- 参考答案:实验 12 编写 0 号中断的处理程序

更新日期:2020年06月12日

第一步、准备溢出程序

我们要准备溢出程序,用于后面的测试:

assume cs:codeseg

codeseg segment
	_start:
	mov ax, 1000H
	mov bl, 1
	div bl
	mov ax, 4c00H
	int 21H
codeseg ends

end _start

第二步、编写 0 号中断的处理程序

assume cs:codeseg

codeseg segment
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;; 编写程序
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
do0:
	jmp short _do0_start
	db "divide error!" ; 13
	_do0_start:
	mov ax, cs						; 设置数据地址
	mov ds, ax
	mov si, 0202H
	mov ax, 0B800H					; 设置显存地址
	mov es, ax					
	mov di, 12*160 + 33*2
	mov cx, 13						; 将字符串写入显存
	s:	mov al, ds:[si]
		mov ah, 2					
		mov es:[di], ax
		inc si
		add di, 2
		loop s
	mov ax, 4c00H					; 结束程序,不需要使用 iret 返回
	int 21H
_do0_end:
	
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;; 复制程序(安装)
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start:
	mov ax, codeseg							; 原始地址
	mov ds, ax
	mov si, offset do0				
	mov ax, 0								; 目的地址
	mov es, ax
	mov di, 200H
	mov cx, offset _do0_end - offset do0	; 复制长度
	cld										; 复制方向
	rep movsb								; 执行复制
	
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;; 设置中断向量表
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	; 中断程序,段地址:0000H,偏移地址:0200H
	; 中断程序的   段地址 写入 => 0000:6-7
	; 中断程序的 偏移地址 写入 => 0000:4-5
	mov ax, 0
	mov es, ax
	mov word ptr es:[0], 0200H
	mov word ptr es:[2], 0000H
	
	mov ax, 4c00H
	int 21H

codeseg ends

end start

参考文献

CSDN/汇编语言王爽第三版答案
百度文库/汇编语言实验答案 (王爽)


ToC

第一步、准备溢出程序

第二步、编写 0 号中断的处理程序

参考文献