随笔分类 - 汇编语言
摘要:(一) Bochs 软件说明 Bochs 是一款开源的虚拟机软件,它用软件来模拟处理器取指令和执行指令的过程,以及整个计算机硬件。当它开始运行时,就直接模拟计算机的加电启动过程。 Bochs 本身是一个虚拟机,类似于 VirtualBox,可以作为类似于 VirtualBox 的虚拟机来使用,因此它
阅读全文
摘要:内嵌汇编(英语:Inline assembly)通俗来讲,就是将汇编语言代码嵌入到高级语言的程序中,例如嵌入到 C 语言程序中。 linux 操作系统下,C 语言程序的编译一般使用 GCC 来编译,而 GCC 编译器提供了内嵌汇编的功能,也就是说可以在 C 代码中直接内嵌汇编语言语句。 GNU 汇编
阅读全文
摘要:1. 汇编语言的流派 x86 汇编指令有两大风格,分别是: Intel 汇编 AT&T 汇编 2. 汇编语言的运作模式 实模式 16 位保护模式 32 位保护模式 3. x86 寄存器 (1)寄存器分类 16 位 自 Intel 8086和 8088 起,有 14 个 16 比特寄存器(AX、BX、
阅读全文
摘要:最近一个月断断续续的在看 王爽的《汇编语言(第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) “公司年度总收入”的起始地址
阅读全文