第一步、准备溢出程序
我们要准备溢出程序,用于后面的测试:
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
相关文章
「汇编语言 第 3 版 王爽」- 参考答案:实验 7 寻址方式在结构化数据访问中的应用
「汇编语言 第 3 版 王爽」- 参考答案:实验 16 编写包含多个功能子程序的中断例程
「汇编语言 第 3 版 王爽」- 参考答案:实验 14 访问 CMOS RAM
「汇编语言 第 3 版 王爽」- 参考答案:实验 15 安装新的 int 9 中断例程
「汇编语言 第 3 版 王爽」- 参考答案:检测点 11.2
「汇编语言 第 3 版 王爽」- 参考答案:检测点 13.1
「汇编语言 第 3 版 王爽」- 参考答案:检测点 16.2
「汇编语言 第 3 版 王爽」- 参考答案:实验 13 编写、应用中断例程
「汇编语言 第 3 版 王爽」- 参考答案:检测点 11.3
「汇编语言 第 3 版 王爽」- 参考答案:实验 17 编写包含多个功能子程序的中断例程
「汇编语言 第 3 版 王爽」- 参考答案:课程设计 1
「汇编语言 第 3 版 王爽」- 参考答案:实验 11 编写子程序
「汇编语言 第 3 版 王爽」- 参考答案:实验 10 编写子程序
「汇编语言 第 3 版 王爽」- 参考答案:检测点 14.1
本文详细介绍了如何在汇编语言中准备溢出程序,并通过编写0号中断处理程序来演示结构化编程。内容涵盖了设置中断向量表、复制程序和执行溢出操作,适合学习汇编语言进阶者阅读。
3468

被折叠的 条评论
为什么被折叠?



