(一)程序说明:本程序必须在纯 DOS 环境运行,因为 int 13h 中断例程只能在纯 DOS 环境运行。
(二)安装程序的代码
1. 参数说明:
(1) 用 AH 寄存器传递功能号:0 表示读,1 表示写。
由于要调用 BIOS 的 int 13h 中断例程,而 int 13h 中断例程的 AH 寄存器参数为:(ah)=2 或 (ah)=3。所以需要执行“add ah,2”指令,以转换 AH 寄存器存储的数据来适应 int 13h 中断例程的调用:
add ah,2 ; (ah)=0 或 (ah)=1,调用 BIOS 的 int 13h 中断时,(ah)=2 或 (ah)=...
[2023-09-04 11:23] 第 17 章 实验 17 编写包含多个功能子程序的中断例程
阅读全文 |
评论次数(0) |
浏览次数(279) |
所属类型(课程实验)
[2023-08-24 20:21] 第 16 章 实验 16 编写包含多个功能子程序的中断例程
实验 16 编写包含多个功能子程序的中断例程
安装一个新的 int 7ch 中断例程,为显示输出提供如下功能子程序。
(1) 清屏。
(2) 设置前景色。
(3) 设置背景色。
(4) 向上滚动一行。
入口参数说明如下:
(1) 用 AH 寄存器传递功能号:0 表示清屏,1 表示设置前景色,2 表示设置背景色,3 表示向上滚动一行。
(2) 对于 1、2 号功能,用 AL 寄存器传送颜色值,(al)∈{0,1,2,3,4,5,6,7}。
具体代码:
注意,以下最前面的两种错误代码,仅编写功能号 1 的子程序以作测试。
1. 错误代码:
assume cs...
安装一个新的 int 7ch 中断例程,为显示输出提供如下功能子程序。
(1) 清屏。
(2) 设置前景色。
(3) 设置背景色。
(4) 向上滚动一行。
入口参数说明如下:
(1) 用 AH 寄存器传递功能号:0 表示清屏,1 表示设置前景色,2 表示设置背景色,3 表示向上滚动一行。
(2) 对于 1、2 号功能,用 AL 寄存器传送颜色值,(al)∈{0,1,2,3,4,5,6,7}。
具体代码:
注意,以下最前面的两种错误代码,仅编写功能号 1 的子程序以作测试。
1. 错误代码:
assume cs...
阅读全文 |
评论次数(0) |
浏览次数(308) |
所属类型(课程实验)
[2023-08-19 21:01] 第 15 章 实验 15 安装新的 int 9 中断例程
实验 15 安装新的 int 9 中断例程
安装一个新的 int 9 中断例程。
功能:在 DOS 下,按下“A”键后,除非不再松开,如果松开,就显示满屏幕的“A”,其他的键照常处理。
提示,按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。断码=通码+80h。
具体代码如下:
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
...
安装一个新的 int 9 中断例程。
功能:在 DOS 下,按下“A”键后,除非不再松开,如果松开,就显示满屏幕的“A”,其他的键照常处理。
提示,按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。断码=通码+80h。
具体代码如下:
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
...
阅读全文 |
评论次数(0) |
浏览次数(508) |
所属类型(课程实验)
[2023-08-15 10:41] 第 14 章 实验 14 访问 CMOS RAM
实验 14 访问 CMOS RAM
编程,以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。
注意:CMOS RAM 中存储着系统的配置信息,除了保存时间信息的单元外,不要向其他的单元中写入内容,否则将引起一些系统错误。
具体代码如下:
assume cs:code
; sysdt 段中 '00/00/00 ' 和 '00:00:00' 的 '00' 部分,是需要写入的数据位置。
; 以 ASCII 码值 0 作为字符串结束符。
sysdt segment
db '20','00/00/00 ','00:00:00',0
sysdt ends
...
编程,以“年/月/日 时:分:秒”的格式,显示当前的日期、时间。
注意:CMOS RAM 中存储着系统的配置信息,除了保存时间信息的单元外,不要向其他的单元中写入内容,否则将引起一些系统错误。
具体代码如下:
assume cs:code
; sysdt 段中 '00/00/00 ' 和 '00:00:00' 的 '00' 部分,是需要写入的数据位置。
; 以 ASCII 码值 0 作为字符串结束符。
sysdt segment
db '20','00/00/00 ','00:00:00',0
sysdt ends
...
阅读全文 |
评论次数(0) |
浏览次数(338) |
所属类型(课程实验)
[2023-08-12 20:31] 第 13 章 实验 13 编写、应用中断例程
实验 13 编写、应用中断例程
一、编写并安装“int 7ch”指令所引发中断的中断例程,功能为显示一个用 0 结束的字符串,中断例程安装在内存地址 0:200 处。
参数:(dh)=行号,(di)=列号,(cl)=颜色,ds:si 指向字符串首地址。
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察 int、iret 指令执行前后 CS、IP 和栈的状态。
注意,“ds:si 指向字符串首地址”是作为参数向“int 7ch”指令所引发中断的中断例程提供的,可见该字符串并不在该中断例程程序代码之中,而是位于主调程序内。
assume cs:code
dat...
一、编写并安装“int 7ch”指令所引发中断的中断例程,功能为显示一个用 0 结束的字符串,中断例程安装在内存地址 0:200 处。
参数:(dh)=行号,(di)=列号,(cl)=颜色,ds:si 指向字符串首地址。
以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察 int、iret 指令执行前后 CS、IP 和栈的状态。
注意,“ds:si 指向字符串首地址”是作为参数向“int 7ch”指令所引发中断的中断例程提供的,可见该字符串并不在该中断例程程序代码之中,而是位于主调程序内。
assume cs:code
dat...
阅读全文 |
评论次数(0) |
浏览次数(155) |
所属类型(课程实验)
[2023-08-07 20:03] 第 12 章 实验 12 编写 0 号中断的处理程序
实验 12 编写 0 号中断的处理程序
编写 0 号中断的处理程序,使得在除法溢出发生时在屏幕中间显示字符串“divide error!”,然后返回 DOS 操作系统。
要求:仔细跟踪调试,在理解整个过程之前,不要进行后面课程的学习。
具体代码如下:
必须先执行安装 do0 程序的 do0.asm 程序代码,再执行会产生 0 号中断的 test.asm 测试程序代码。
一、不考虑中断处理程序的返回问题
1. 安装 do0 程序的程序代码:
assume cs:code
code segment
; do0 程序(0 号中断处理程序)的安装
sta...
编写 0 号中断的处理程序,使得在除法溢出发生时在屏幕中间显示字符串“divide error!”,然后返回 DOS 操作系统。
要求:仔细跟踪调试,在理解整个过程之前,不要进行后面课程的学习。
具体代码如下:
必须先执行安装 do0 程序的 do0.asm 程序代码,再执行会产生 0 号中断的 test.asm 测试程序代码。
一、不考虑中断处理程序的返回问题
1. 安装 do0 程序的程序代码:
assume cs:code
code segment
; do0 程序(0 号中断处理程序)的安装
sta...
阅读全文 |
评论次数(0) |
浏览次数(108) |
所属类型(课程实验)
[2023-08-02 15:51] 第 11 章 实验 11 编写子程序
实验 11 编写子程序
编写一个子程序,将包含任意字符,以 0 结尾的字符串中的小写字母转变成大写字母,描述如下:
1. 名称:letterc
2. 功能:将以 0 结尾的字符串中的小写字母转变成大写字母
3. 参数:ds:si 指向字符串首地址
注意需要进行转化的是字符串中的小写字母 a~z,而不是其他字符。
完整程序代码如下(Ubuntu 18.04 中的 DOSBox-X 无法运行,Windows 则 DOSBox 和 DOSBox-X 都可以运行):
assume cs:codesg
datasg segment
db "Beginner's ...
编写一个子程序,将包含任意字符,以 0 结尾的字符串中的小写字母转变成大写字母,描述如下:
1. 名称:letterc
2. 功能:将以 0 结尾的字符串中的小写字母转变成大写字母
3. 参数:ds:si 指向字符串首地址
注意需要进行转化的是字符串中的小写字母 a~z,而不是其他字符。
完整程序代码如下(Ubuntu 18.04 中的 DOSBox-X 无法运行,Windows 则 DOSBox 和 DOSBox-X 都可以运行):
assume cs:codesg
datasg segment
db "Beginner's ...
阅读全文 |
评论次数(0) |
浏览次数(107) |
所属类型(课程实验)
[2023-07-07 12:34] 第10章 实验10 编写子程序
实验 10 编写子程序
本次实验将编写 3 个子程序。
一、显示字符串
这一子程序是个通用程序,用于实现显示字符串。程序提供灵活的调用接口,使调用者可以决定显示的位置(行,列)、内容和颜色。
子程序描述:
1. 名称:show_str
2. 功能:在指定的位置,用指定的颜色,显示一个用 0 结束的字符串。
3. 参数:(dh)=行号(取值范围 0~24),(dl)=列号(取值范围 0~79),(cl)=颜色
ds:si 指向字符串的首地址
4. 返回:无
5. 应用举例:在屏幕的 8 行 3 列,用绿色显示 data 段中的字符串。
...
本次实验将编写 3 个子程序。
一、显示字符串
这一子程序是个通用程序,用于实现显示字符串。程序提供灵活的调用接口,使调用者可以决定显示的位置(行,列)、内容和颜色。
子程序描述:
1. 名称:show_str
2. 功能:在指定的位置,用指定的颜色,显示一个用 0 结束的字符串。
3. 参数:(dh)=行号(取值范围 0~24),(dl)=列号(取值范围 0~79),(cl)=颜色
ds:si 指向字符串的首地址
4. 返回:无
5. 应用举例:在屏幕的 8 行 3 列,用绿色显示 data 段中的字符串。
...
阅读全文 |
评论次数(0) |
浏览次数(125) |
所属类型(课程实验)
[2023-06-25 17:01] 第9章 实验9 根据材料编程
实验 9 根据材料编程
80×25 彩色字符模式显示缓冲区(以下简称为显示缓冲区)的结构:
内存地址空间中,B8000H~BFFFFH 共 32KB 的空间,为 80×25 彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。
内存地址空间 B8000H~BFFFFH,其段地址为 B0000H,偏移地址范围 8000H~FFFFH;可见偏移地址数量计算方法如下:
FFFFH-8000H+1=7FFFH+1=8000H=8×16³=2³×(2⁴)³=2³×2¹²=2¹⁵=2⁵×2¹⁰=2⁵KB=32KB
在 80×25 彩色字符模式下,显示器可以显示 ...
80×25 彩色字符模式显示缓冲区(以下简称为显示缓冲区)的结构:
内存地址空间中,B8000H~BFFFFH 共 32KB 的空间,为 80×25 彩色字符模式的显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。
内存地址空间 B8000H~BFFFFH,其段地址为 B0000H,偏移地址范围 8000H~FFFFH;可见偏移地址数量计算方法如下:
FFFFH-8000H+1=7FFFH+1=8000H=8×16³=2³×(2⁴)³=2³×2¹²=2¹⁵=2⁵×2¹⁰=2⁵KB=32KB
在 80×25 彩色字符模式下,显示器可以显示 ...
阅读全文 |
评论次数(0) |
浏览次数(107) |
所属类型(课程实验)
[2023-06-21 06:57] 第9章 实验8 分析一个奇怪的程序
实验 8 分析一个奇怪的程序
判断下面程序是否可以正确返回,并分析原因。
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax...
判断下面程序是否可以正确返回,并分析原因。
assume cs:codesg
codesg segment
mov ax,4c00h
int 21h
start: mov ax,0
s: nop
nop
mov di,offset s
mov si,offset s2
mov ax,cs:[si]
mov cs:[di],ax
s0: jmp short s
s1: mov ax...
阅读全文 |
评论次数(0) |
浏览次数(125) |
所属类型(课程实验)