实验 12 编写 0 号中断的处理程序
编写 0 号中断的处理程序,使得在除法溢出发生时在屏幕中间显示字符串“divide error!”,然后返回 DOS 操作系统。
要求:仔细跟踪调试,在理解整个过程之前,不要进行后面课程的学习。
具体代码如下:
必须先执行安装 do0 程序的 do0.asm 程序代码,再执行会产生 0 号中断的 test.asm 测试程序代码。
一、不考虑中断处理程序的返回问题
1. 安装 do0 程序的程序代码:
assume cs:code
code segment
; do0 程序(0 号中断处理程序)的安装
sta...
[2023-08-07 20:03] 第 12 章 实验 12 编写 0 号中断的处理程序
阅读全文 |
评论次数(0) |
浏览次数(107) |
所属类型(课程实验)
[2023-08-03 10:39] 第 12 章 检测点 12.1
检测点 12.1
(1) 用 Debug 查看内存,情况如下:
0000:0000 68 10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00
则 3 号中断源对应的中断处理程序的入口地址为:0070:018B
(2) 存储 N 号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为:0000:(N×4)
存储 N 号中断源对应的中断处理程序入口的段地址的内存单元的地址为:0000:(N×4+2)
中断号 偏移地址 段地址 示例实际存储内容(以本题(1)为例)
0 0~1 2~3 00A7:1068...
(1) 用 Debug 查看内存,情况如下:
0000:0000 68 10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00
则 3 号中断源对应的中断处理程序的入口地址为:0070:018B
(2) 存储 N 号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为:0000:(N×4)
存储 N 号中断源对应的中断处理程序入口的段地址的内存单元的地址为:0000:(N×4+2)
中断号 偏移地址 段地址 示例实际存储内容(以本题(1)为例)
0 0~1 2~3 00A7:1068...
阅读全文 |
评论次数(0) |
浏览次数(111) |
所属类型(汇编作业)
[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-08-01 17:30] 第 11 章 检测点 11.4
检测点 11.4
下面的程序执行后,(ax)=?
mov ax,0
push ax
popf
mov ax,0FFF0h
add ax,0010h
pushf
pop ax
and al,11000101B
and ah,00001000B
分析:
1. 观察指令
mov ax,0
push ax
popf
这三条指令使得 flag 各位均为 0。
2. 观察指令
mov ax,0FFF0h
add ax,0010h
pushf
(ax)=FFF0h+0010h=(1)0000h,也即 (ax)=-16+16=0,这影响了 flag 的 OF、...
下面的程序执行后,(ax)=?
mov ax,0
push ax
popf
mov ax,0FFF0h
add ax,0010h
pushf
pop ax
and al,11000101B
and ah,00001000B
分析:
1. 观察指令
mov ax,0
push ax
popf
这三条指令使得 flag 各位均为 0。
2. 观察指令
mov ax,0FFF0h
add ax,0010h
pushf
(ax)=FFF0h+0010h=(1)0000h,也即 (ax)=-16+16=0,这影响了 flag 的 OF、...
阅读全文 |
评论次数(0) |
浏览次数(113) |
所属类型(汇编作业)
[2023-08-01 09:36] 第 11 章 检测点 11.3
检测点 11.3
(1) 补全下面的程序,统计 F000:0 处 32 个字节中,大小在 [32,128] 的数据的个数。
mov ax,0f000h
mov ds,ax
mov bx,0
mov dx,0 ; 将统计的结果存储在 DX 寄存器中
mov cx,32
s: mov al,[bx]
cmp al,32
jb s0 ; 小于 32 则跳至 s0 标号处执行,以进入下一个循环或结束循环
cmp al,128
ja s0 ; 大于 128 则跳至 s0 标号处执行,以进入下一个循环或结束循环
...
(1) 补全下面的程序,统计 F000:0 处 32 个字节中,大小在 [32,128] 的数据的个数。
mov ax,0f000h
mov ds,ax
mov bx,0
mov dx,0 ; 将统计的结果存储在 DX 寄存器中
mov cx,32
s: mov al,[bx]
cmp al,32
jb s0 ; 小于 32 则跳至 s0 标号处执行,以进入下一个循环或结束循环
cmp al,128
ja s0 ; 大于 128 则跳至 s0 标号处执行,以进入下一个循环或结束循环
...
阅读全文 |
评论次数(0) |
浏览次数(106) |
所属类型(汇编作业)
[2023-07-27 11:36] 第11章 检测点 11.2
检测点 11.2
写出下面每条指令执行后,ZF、PF、SF、CF、OF 等标志位的值。
CF OF SF ZF PF
sub al,al 0 0 0 1 1
结果 (al)=00000000B:进位 0,“假”;溢出 0,“假”;符号非负,“假”;零位“真”;“偶个 1”,“真”。
CF OF SF ZF PF
mov al,10H 0 0 0 1 1
mov 为传送指令,(al)=10h,flag 寄存器保持原值不变。
CF OF SF ZF PF
add al,90...
写出下面每条指令执行后,ZF、PF、SF、CF、OF 等标志位的值。
CF OF SF ZF PF
sub al,al 0 0 0 1 1
结果 (al)=00000000B:进位 0,“假”;溢出 0,“假”;符号非负,“假”;零位“真”;“偶个 1”,“真”。
CF OF SF ZF PF
mov al,10H 0 0 0 1 1
mov 为传送指令,(al)=10h,flag 寄存器保持原值不变。
CF OF SF ZF PF
add al,90...
阅读全文 |
评论次数(0) |
浏览次数(111) |
所属类型(汇编作业)
[2023-07-27 08:09] 第11章 检测点 11.1
检测点 11.1
写出下面每条指令执行后,ZF、PF、SF 等标志位的值。
sub al,al ZF=1 PF=1 SF=0
结果为 00000000B,因此 ZF=1(零标志为真),PF=1(含 0 个 1,即偶数个 1,奇偶标志为真),SF=0(结果为非负数,负数标志为假)。
mov al,1 ZF=1 PF=1 SF=0
mov 指令为传送指令,不影响标志寄存器的值,因此标志寄存器保持原来的数据不变。
因此,虽然结果为 00000001B,但仍然是 ZF=1(零标志为真),PF=1(含 0 个 1,即偶数个 1,奇偶标志为真),SF=0(结果为非负数,负数标志为假)。...
写出下面每条指令执行后,ZF、PF、SF 等标志位的值。
sub al,al ZF=1 PF=1 SF=0
结果为 00000000B,因此 ZF=1(零标志为真),PF=1(含 0 个 1,即偶数个 1,奇偶标志为真),SF=0(结果为非负数,负数标志为假)。
mov al,1 ZF=1 PF=1 SF=0
mov 指令为传送指令,不影响标志寄存器的值,因此标志寄存器保持原来的数据不变。
因此,虽然结果为 00000001B,但仍然是 ZF=1(零标志为真),PF=1(含 0 个 1,即偶数个 1,奇偶标志为真),SF=0(结果为非负数,负数标志为假)。...
阅读全文 |
评论次数(0) |
浏览次数(149) |
所属类型(汇编作业)
[2023-07-21 09:38] 课程设计 1(方法 2)
方法 2
table 段中只设置一组字符串,全部用于存储一年的数据。下一年的数据覆盖前一年的数据字符串。
Ubuntu 18.04 系统安装的 DOSBox-X 无法运行,只能在其 DOSBox 中运行;而 Widows 中则两者都可运行
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '...
table 段中只设置一组字符串,全部用于存储一年的数据。下一年的数据覆盖前一年的数据字符串。
Ubuntu 18.04 系统安装的 DOSBox-X 无法运行,只能在其 DOSBox 中运行;而 Widows 中则两者都可运行
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '...
阅读全文 |
评论次数(0) |
浏览次数(112) |
所属类型(课程设计)
[2023-07-20 18:25] 课程设计 1(方法 1)
方法 1
table 段中设置一年一组字符串,共 21 组字符串。
Ubuntu 18.04 系统的 DOSBox-X 无法运行,只能在其 DOSBox 中运行;而 Widows 中则两者都可运行。
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
...
table 段中设置一年一组字符串,共 21 组字符串。
Ubuntu 18.04 系统的 DOSBox-X 无法运行,只能在其 DOSBox 中运行;而 Widows 中则两者都可运行。
assume cs:code
data segment
db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
db '1993','1994','1995'
...
阅读全文 |
评论次数(0) |
浏览次数(119) |
所属类型(课程设计)
[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) |
所属类型(课程实验)