【笔记】8086汇编-int(interrupt)指令

前言:本篇仅仅是笔记,整理于2017/9/4,结构可能会略有混乱,见谅。

-【注意:内存单元与数字发生关系时,必需要限定数据占据的位数】

-汇编指令缩写:http://www.cnblogs.com/ljtknowns/p/5741341.html

-这一章我们讲解int指令引发的中断

-【int指令】

–语法:int n

–作用:相当于引发一个n号中断过程。

–我们可以将中断处理程序简称为中断例程。

–这既提供了方便,却又降低了dos的安全性。

-【13.2  编写供应用程序调用的中断例程】

–问题一:编写、安装中断7ch的中断例程。

—功能:求一word型数据的平方

—参数:(ax)=原始数据(即底数)

—返回值:dx、ax中存放结果的高16位和低16位。

–问题二:编写、安装中断7ch的中断例程。

—功能:将以0结尾的字符串转化为大写。【C、C++的字符串都是这种以0结尾风格】

—参数:ds:si指向字符串的首地址。

-【13.3  对int、iret和栈的深入理解】

–我们现在要用int来模拟loop指令:我们用cx存储循环次数,bx存储位移。

–关键:iret实际上是是出栈操作,所以我们可以直接在栈中,将原来的CS、IP进行修改。

–我们这里最好是使用bp来代替sp操作,这样可以防止意外情况将sp弄乱(结果造成严重错误),我们这里的方法是:将bp入栈(因为要还原),将sp给bp,通过bp来定位IP在栈中的位置,修改IP(实现段内近转移),还原bp,iret中断返回。

-【13.4  BIOS和DOS所提供的中断例程】

–BIOS(basic input output system)是存放在系统板的ROM中的一套程序,其中主要包含以下部分内容:

—1)硬件系统的检测及初始化程序

—2)外部中断和内部中断的中断例程

—3)用于硬件设备进行I/O操作的中断例程

—4)其它和硬件系统相关的中断例程

-【13.5  BIOS和DOS中断例程的安装过程】

–引入:我们之前是通过安装程序来完成安装到内存中这一操作的,那么BIOS和DOS提供的中断例程是如何安装到内存中呢?

–1)开机后,CPU加电,初始化(CS)=0FFFFH,(IP)=0,自动从这个位置开始执行程序,这里有一条跳转指令,CPU执行后,转去执行BIOS中的硬件系统检测和初始化程序。

–2)初始化程序会建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。【因为这些中断例程存放在ROM中,所以它们能够持续存在,只需要进行定位即可】

–3)硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导,从此计算机交给操作系统来控制。

–4)DOS启动后【这里的操作系统是DOS】,除完成其它工作外,还将它提供的中断例程装入内存,并建立相应的中断向量。

–检测点13.2结论:

—我们无法通过直接的编程来改变FFFF:0的指令,而使CPU不执行BIOS的硬件检测程序。

—int 19h执行前,DOS还未获得控制权,所以int 19h的中断例程不可以由DOS提供。

-【13.6  BIOS中断例程应用】

–int 10h是BIOS提供的中断例程,其中包含了多个和屏幕输出相关的子程序。

–【使用ah来确定子程序,ah为2表示放置光标,ah为9表示字符输出】

–一般一个中断例程,提供了许多的子程序。

–【int 10h的子程序使用dh存储行,dl存储列,这里我们可以联想记忆h=行,l=列】

–BIOS和DOS提供的中断例程,都用ah来传递内部子程序的编号。

-【13.7  DOS中断例程的应用】

–int 21h就是DOS提供的中断例程。

–我们最常使用的就是它的4ch号功能,详解:

—ah放置功能的序号,al存放返回值,一般0表示正常返回。

–我们来看一下int 21h显示字符串的功能:

—ds:dx指向字符串,字符串以’$’结尾【与C语言的方式不同】。

—mov ah,9,因为这个9号程序就是在光标处显示字符串。【所以我们可以用上一节的内容定位光标】

—这个字符串输出能够在行尾时自动向下一行,而达到最后一行时,还可以自动上卷,十分方便。