摘要:
最近在学习操作系统,操作系统的启动也摸索了一段时间,现在记录下来,方便后续的复习。 1. 总体功能 (1)ROM BIOS 功能描述: x86 PC 刚开机时,CPU 处于实模式(实模式的寻址 CS:IP (CS左移4位 + IP)) 开机时,CS=0xFFFF, IP=0x0000 寻址 0xFF 阅读全文
摘要:
最近一个月断断续续的在看 王爽的《汇编语言(第3版)》,已经将书看完,相关的实验已经做完并写了博客,看书的过程中做了一个思维导图,以供后续复习使用。 阅读全文
摘要:
1. 前提知识: (1) 说明 我用的是 DOSBox 0.74-3 启动并运行的,而且我没有软盘,因此我只能操作硬盘 直接向磁盘扇区写入数据是危险的,很可能覆盖掉重要的数据,所以千万不要随便对硬盘中的扇区进行写入。文章中所有程序的功能都是从硬盘中读取数据。 (2) 从 硬盘中读取数据 的测试代码 阅读全文
摘要:
1. “int 9h 中断例程” 和 “int 16h 中断例程”: (1) 使用 int 9h 中断例程对键盘输入的处理 键盘输入将引发 9 号中断,BIOS 提供了 int 9 中断例程。CPU 在 9 号中断发生后,执行 int 9 中断例程,从 60h 端口读出扫描码,并将其转化为相应的 A 阅读全文
摘要:
1. 思路: 根据 “第 16 章中的代码示例” 以及 “安装程序” 的套路,仿照着之前的例子,代码写出来不会太难 需要注意以下几点: 在代码段中,“标号”或者是“数据标号”,都代表了该段内的某一个偏移地址。 对于任何一个内存段来说,段地址可以开始于任何16 字节对齐的地方,偏移地址则总是从 0x0 阅读全文
摘要:
1. 思路: 如果完整的看完了第 15 章节的内容,那么题目还是很简单的 只需要判断 A 键松开后,向端口 60h 发送的扫描码(即 A 键的断码为 9eh) 2. 代码实现: 文件名:exp15.asm assume cs:code stack segment db 128 dup (0) sta 阅读全文
摘要:
1. 思路: 可以仿照 实验13 的第 3 个例子 的编程思想 将要显示的时间格式预先定义好,从 CMOS RAM 中获取到的 BCD 码,将其转换成对应的 ASCII 码字符后,再替换输出格式中的某些字符 将 CMOS RAM 中,存放当前时间的地址信息先列出来(年、月、日、时、分、秒 的存放单元 阅读全文
摘要:
1. 思路: 由于代码给出了一部分,咱们可以先通过调用的 int 指令 来判断要实现的功能 比如程序中的 int 10h 中断例程是 BIOS 提供的中断例程,ah 是用来传递内部子程序的编号,(ah)=2 表示调用第 10h 号中断例程的 2 号子程序,功能为设置光标位置,可以提供光标所在的 行号 阅读全文
摘要:
1. 思路: 可以参考第 13 章中的例子 2. int 7ch 中断例程代码: 文件名:exp132.asm assume cs:code code segment start: mov ax, cs mov ds, ax mov si, offset lp ; 设置 ds:si 指向源地址 mo 阅读全文
摘要:
1. 思路: 看到题目的第一眼,总感觉题目很熟悉,好像之前写过,仔细想想,原来是 实验10-1 写过一个 显示字符串的子程序 通过第 13 章的学习,我们知道 int 指令 和 iret 指令 的配合使用与 call 指令 和 ret 指令 的配合使用具有相似的思路,因此我们可以将 实验10-1 的 阅读全文
摘要:
1. 我们要做以下几个事情: 编写可以显示 "divide error!" 的中断处理程序:do0 将 do0 送入内存 0000:0200 处 将 do0 的入口地址 0000:0200 存储在中断向量表 0 号表项中 编写一个除法溢出的测试程序,用于触发除法错误,产生内中断 2. 代码实现: 文 阅读全文
摘要:
1. 思路: 该程序比较简单,就不写思路了 2. 代码实现: assume cs:codesg datasg segment db "Beginner's All-purpose Symbolic Instruction Code.", 0 datasg ends codesg segment be 阅读全文
摘要:
1. 思路: 根据第 10 章的第 9 小结,也就是 10.9 模块化程序设计的方法:将程序分为两部分 数值的转换 和 数值的显示 因为 数值的显示 在 实验10-1 已经实现了 show_str,因此我们先将 数值的转换 调试好,再将 show_str 的程序引入进来 因为不断的取余,所以取得余数 阅读全文
摘要:
1. 思路: 题目给出了一个公式,可以解决除法溢出的问题,因此我们只需要分析公式,然后按照公式的思路去写程序就可以了。 公式:X/N = int(H/N) * 65536 + [rem(H/N) * 65536 + L] / N = int(0FH/0AH) * 65536 + [rem(0FH/0 阅读全文
摘要:
1. 思路: 因为实验9 的经验,我们知道,在 80x25 彩色模式下,显示器可以显示 25 行,每行 80 个字符,每个字符占据 2 个字节。 行号的取值范围:0 ~ 25,因此,第 n 行的首地址 = 行号 x 80 x 2 列数的取值范围:0 ~ 79,因此,第 n 列地址 = 列号 x 2 阅读全文
摘要:
1. 解题思路: 通过分析可以得到最后展示效果的起始行和列的大致位置: 第 12 行的起始地址:11 * 80 * 2 = 1760 = 06E0H 第 13 行的起始地址:11 * 80 * 2 + (80 * 2) 第 14 行的起始地址:11 * 80 * 2 + (2 * 80 * 2) 列 阅读全文
摘要:
1. 分析下面的程序,在运行前思考:这个程序可以正确返回吗? 在程序运行前,我个人的思考结果是不会返回,好像进入了死循环(说明我在看第九章的时候不仔细(─.─||)) 2. 运行后再思考:为什么是这种结果? 先说结论:运行后,程序可以正确返回 3. 代码讲解: mov di, offset s mo 阅读全文
摘要:
1. 思路: data 段: 年份的数据:4 * 21 = 84 = 54H 公司年度总收入的数据:4 * 21 = 84 = 54H 雇员的数据:2 * 21 = 42 = 2AH 可以得出下面的关系: data 段中,“年份”的起始地址为 0 (假设 bx = 0) “公司年度总收入”的起始地址 阅读全文
摘要:
(1)将课程中所有讲解过的程序上机调试,用 Debug 跟踪其执行过程,并在过程中进一步理解所讲内容。 (略) (2)编程,完成问题 7.9 中的程序。 完成的程序如下: assume cs:codesg, ds:datasg, ss:stacksg stacksg segment dw 0, 0, 阅读全文
摘要:
(1) 编程,向内存 0:2000:23F 一次传送数据 063(3FH)。 assume cs:code code segment mov ax, 0020h mov ds, ax mov bx, 0 mov cx, 64 ; (cx)=64,循环 64 次 s: mov ds:[bx], bl 阅读全文