int指令01 - 零基础入门学习汇编语言64
2011-04-28 02:19
776 查看
第十三章:int指令01
让编程改变世界Change the world by program
引言
在第12章中,我们讲解了中断过程和两种内中断的处理。这一章中,我们讲解另一种重要的内中断,由int指令引发的中断。
万众瞩目,是什么呢?那就是DOS时代大名鼎鼎的int中断。
int格式: int n,n为中断类型码。它的功能是引发中断过程。
int指令
CPU 执行int n指令,相当于引发一个 n号中断的中断过程,执行过程如下:
(1)取中断类型码n(2)标志寄存器入栈,IF = 0,TF = 0
(3)CS、IP入栈
(4)(IP) = (n*4),(CS) = (n*4+2)
从此处转去执行n号中断的中断处理程序。
可以在程序中使用int指令调用任何一个中断的中断处理程序。
比如我们看下这个程序段:相关代码下载
程序是没有做除法,但是在结尾使用了int 0指令。
CPU执行int 0指令时,将引发中断过程,执行0号中断处理程序,而系统设置的 0号中断处理程序的功能是显示“Divide overflow”,然后返回到系统。
可见,int 指令的最终功能和call指令相似,都是调用一段程序。
因此,一般情况下,系统将一些具有一定功能的子程序,以中断处理程序的方式提供给应用程序调用。
我们在编程的时候,可以用int指令调用这些子程序。当然,也可以自己编写一些中断处理程序供别人使用。
以后,我们可以将中断处理程序简称为中断例程。
编写供应用程序调用的中断例程
前面,我们已经编写过中断0 的中断例程了,现在我们讨论可以供应用程序调用的中断例程的编写方法。我们通过两个实例来讨论:
实例一 编写、安装中断7ch的中断例程,实现求一word型数据的平方。
实例二 编写、安装中断7ch的中断例程,实现将一个全是字母,以 0结尾的字符串,转化为大写。
实例一: 编写、安装中断7ch的中断例程
功能:求一word型数据的平方。参数: (ax)=要计算的数据。
返回值:dx、ax中存放结果的高16位和低16位。
应用举例:求2*3456^2
[codesyntax lang="asm"]
assume cs:code code segment start: mov ax,3456;(ax)=3456 int 7ch ; 调用中断7ch的中断例程,计算ax中的数据的平方 add ax,ax adc dx,dx ; 存放结果,讲结果乘以2 mov ax,4c00h int 21h code ends end start
[/codesyntax]
我们要做三部分工作:
(1)编程实现求平方功能的程序;(2)安装程序,我们将其安装在0:200处;
(3)设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程。
我们来实现安装程序:相关代码下载
注意,在中断例程 sqr的最后,要使用iret指令。
用汇编语法描述,iret指令的功能为:
pop IP
pop CS
popf
CPU执行int 7ch指令进入中断例程之前,标志寄存器、当前的CS和IP被压入栈中,在执行完中断例程后,应该用iret指令恢复int 7ch 执行前的标志寄存器和CS、IP的值,从而接着执行应用程序。
int指令和iret指令的配合使用与call指令和ret指令的配合使用具有相似的思路。
实例二: 编写、安装中断7ch的中断例程
功能:将一个全是字母,以 0结尾的字符串,转化为大写。参数:ds:si指向字符串的首地址。
应用举例:将data段中的字符转化为大写。
[codesyntax lang="asm"]
assume cs:code data segment db 'conversation',0 data ends code segment start: mov ax,data mov ds,ax mov si,0 int 7ch mov ax,4c00h int 21h code ends end start
[/codesyntax]
安装程序:相关代码下载
最后,在中断例程capital中用到了寄存器 si和cx,编写中断例程和编写子程序的时候具有同样的问题,就是要避免寄存器的冲突。
应该注意例程中用到的寄存器的值的保存和恢复。
[buy] 获得所有教学视频、课件、源代码等资源打包 [/buy]
[Downlink href='http://kuai.xunlei.com/d/LZBJKQLZQVES']视频下载[/Downlink]
相关文章推荐
- int指令01 - 零基础入门学习汇编语言64
- int指令03 - 零基础入门学习汇编语言66
- int指令03 - 零基础入门学习汇编语言66
- 转移指令的原理01 - 零基础入门学习汇编语言43
- 转移指令的原理01 - 零基础入门学习汇编语言43
- int指令02 - 零基础入门学习汇编语言65
- int指令02 - 零基础入门学习汇编语言65
- [BX]和loop指令01 - 零基础入门学习汇编语言23
- [BX]和loop指令01 - 零基础入门学习汇编语言23
- 包含多个段的程序01 - 零基础入门学习汇编语言29
- 数据处理的两个基本问题01 - 零基础入门学习汇编语言38
- 转移指令的原理03 - 零基础入门学习汇编语言45
- [BX]和loop指令02 - 零基础入门学习汇编语言24
- 包含多个段的程序01 - 零基础入门学习汇编语言29
- 数据处理的两个基本问题01 - 零基础入门学习汇编语言38
- 转移指令的原理03 - 零基础入门学习汇编语言45
- [BX]和loop指令02 - 零基础入门学习汇编语言24
- 更灵活的定位内存地址的方法01 - 零基础入门学习汇编语言32
- 更灵活的定位内存地址的方法01 - 零基础入门学习汇编语言32
- [BX]和loop指令04 - 零基础入门学习汇编语言26