(一)程序说明:本程序必须在纯 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) |
浏览次数(266) |
所属类型(课程实验)
[2023-08-27 20:49] 第 17 章 17.3 节示例
第 17 章 17.3 节示例
可运行的完整测试程序如下:
assume cs:code,ds:stack
; 声明字符栈
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ds,ax
mov si,0
mov dh,8 ; 行号:8
mov dl,4 ; 列号:4
call getstr
mov ax,4c00h
int 21h
getstr: push ax
getstrs: mov ah,0 ...
可运行的完整测试程序如下:
assume cs:code,ds:stack
; 声明字符栈
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ds,ax
mov si,0
mov dh,8 ; 行号:8
mov dl,4 ; 列号:4
call getstr
mov ax,4c00h
int 21h
getstr: push ax
getstrs: mov ah,0 ...
阅读全文 |
评论次数(0) |
浏览次数(277) |
所属类型(示例演示)
[2023-08-26 11:36] 第 17 章 检测点 17.1
检测点 17.1
“在 int 16h 中断例程中,一定有设置 IF=1 的指令。”这种说法对吗?
答:正确。int 16h 中断例程的功能是读取键盘缓冲区的信息。当执行该中断例程时,如果键盘缓冲区为空,则该中断例程会处于循环执行状态(即循环检测键盘缓冲区是否存在可读取信息)以等待键盘缓冲区被写入信息;由于引发 int 16h 中断过程中,硬件已经自动执行了 IF=0,因此如果 int 16h 中断例程中没有设置 IF=1 的指令,那么一旦键盘缓冲区在执行 int 16h 中断例程之前的状态为空,使得 int 16h 中断例程处于等待键盘输入的状态,IF=0 会导致 CPU 无法响应 ...
“在 int 16h 中断例程中,一定有设置 IF=1 的指令。”这种说法对吗?
答:正确。int 16h 中断例程的功能是读取键盘缓冲区的信息。当执行该中断例程时,如果键盘缓冲区为空,则该中断例程会处于循环执行状态(即循环检测键盘缓冲区是否存在可读取信息)以等待键盘缓冲区被写入信息;由于引发 int 16h 中断过程中,硬件已经自动执行了 IF=0,因此如果 int 16h 中断例程中没有设置 IF=1 的指令,那么一旦键盘缓冲区在执行 int 16h 中断例程之前的状态为空,使得 int 16h 中断例程处于等待键盘输入的状态,IF=0 会导致 CPU 无法响应 ...
阅读全文 |
评论次数(0) |
浏览次数(280) |
所属类型(汇编作业)
[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) |
浏览次数(298) |
所属类型(课程实验)
[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) |
浏览次数(489) |
所属类型(课程实验)
[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) |
浏览次数(319) |
所属类型(课程实验)
[2023-08-14 18:42] 第 14 章 检测点 14.2
检测点 14.2
编程,用加法和移位指令计算 (ax)=(ax)*10。提示,(ax)*10=(ax)*2+(ax)*8。
具体代码如下:
1. 说明:AX 寄存器存储的初始数据不得超过 6553,因为 6553×10=65530 是 16 位寄存器 AX 能进行乘 10 计算后所存储的最大值,超过后就会由于 AX 寄存器的存储容量不足而导致溢出,所得的结果将是错误的。例如若计算 6554×10,结果为 65540,该数值在 AX 寄存器中实际存储的是其补码,即十进制的数值 4,因为 AX 寄存器最大能存储的无符号数为 65535。本程序代码只有计算功能,需通过 Debug ...
编程,用加法和移位指令计算 (ax)=(ax)*10。提示,(ax)*10=(ax)*2+(ax)*8。
具体代码如下:
1. 说明:AX 寄存器存储的初始数据不得超过 6553,因为 6553×10=65530 是 16 位寄存器 AX 能进行乘 10 计算后所存储的最大值,超过后就会由于 AX 寄存器的存储容量不足而导致溢出,所得的结果将是错误的。例如若计算 6554×10,结果为 65540,该数值在 AX 寄存器中实际存储的是其补码,即十进制的数值 4,因为 AX 寄存器最大能存储的无符号数为 65535。本程序代码只有计算功能,需通过 Debug ...
阅读全文 |
评论次数(0) |
浏览次数(397) |
所属类型(汇编作业)
[2023-08-13 18:22] 第 14 章 检测点 14.1
检测点 14.1
编程:读、写 CMOS RAM 的 2 号单元的内容
说明:1. CMOS RAM 芯片的端口是 8-bits 端口,要通过 AL 寄存器进行读写操作。
2. CMOS RAM 芯片端口的地址是 70H 和 71H,地址值范围在 255(0FFh)以内,所以在 int、out 指令中使用 CMOS RAM 芯片端口时,直接书写其端口号 70H 或 71H。
3. CMOS RAM 的 2 号单元存储的是系统时间的分钟数:如果当前系统时间是 17:32,则 2 号单元存储的数据就是 32H —— 注意,不会将分钟数转换为 16 进制数,而是直接的 16 ...
编程:读、写 CMOS RAM 的 2 号单元的内容
说明:1. CMOS RAM 芯片的端口是 8-bits 端口,要通过 AL 寄存器进行读写操作。
2. CMOS RAM 芯片端口的地址是 70H 和 71H,地址值范围在 255(0FFh)以内,所以在 int、out 指令中使用 CMOS RAM 芯片端口时,直接书写其端口号 70H 或 71H。
3. CMOS RAM 的 2 号单元存储的是系统时间的分钟数:如果当前系统时间是 17:32,则 2 号单元存储的数据就是 32H —— 注意,不会将分钟数转换为 16 进制数,而是直接的 16 ...
阅读全文 |
评论次数(0) |
浏览次数(214) |
所属类型(汇编作业)
[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) |
浏览次数(143) |
所属类型(课程实验)
[2023-08-10 09:15] 第 13 章 检测点 13.1
检测点 13.1
(1) 在上面的内容中,用 7ch 中断例程实现 loop 的功能,则上面的 7ch 中断例程所能进行的最大转移位移是多少?
答:由于存储位移数据的是 16 位的 BX 寄存器,而压栈后,栈元素也是 16 位的字内存单元,16 位存储空间所能存储的有符号数范围是 -32768~32767,因此最大位移就是 32767 字节(Byte)和 -32768 字节(Byte)。
(2) 实现用 7ch 中断例程完成“jmp near ptr s”指令的功能,用 BX 寄存器向中断例程传送转移的位移值 —— (bx) 成为调用中断例程的参数。
应用举例:在屏幕的...
(1) 在上面的内容中,用 7ch 中断例程实现 loop 的功能,则上面的 7ch 中断例程所能进行的最大转移位移是多少?
答:由于存储位移数据的是 16 位的 BX 寄存器,而压栈后,栈元素也是 16 位的字内存单元,16 位存储空间所能存储的有符号数范围是 -32768~32767,因此最大位移就是 32767 字节(Byte)和 -32768 字节(Byte)。
(2) 实现用 7ch 中断例程完成“jmp near ptr s”指令的功能,用 BX 寄存器向中断例程传送转移的位移值 —— (bx) 成为调用中断例程的参数。
应用举例:在屏幕的...
阅读全文 |
评论次数(0) |
浏览次数(157) |
所属类型(汇编作业)
『 查看更多文章 』