汇编语言课件20 汇编语言 讲稿 13

上传人:f****u 文档编号:122690633 上传时间:2020-03-07 格式:PPT 页数:54 大小:352KB
返回 下载 相关 举报
汇编语言课件20 汇编语言 讲稿 13_第1页
第1页 / 共54页
汇编语言课件20 汇编语言 讲稿 13_第2页
第2页 / 共54页
汇编语言课件20 汇编语言 讲稿 13_第3页
第3页 / 共54页
汇编语言课件20 汇编语言 讲稿 13_第4页
第4页 / 共54页
汇编语言课件20 汇编语言 讲稿 13_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《汇编语言课件20 汇编语言 讲稿 13》由会员分享,可在线阅读,更多相关《汇编语言课件20 汇编语言 讲稿 13(54页珍藏版)》请在金锄头文库上搜索。

1、 汇编语言 课件 王爽著 清华大学出版社 制作工具 MicrosoftPowerPoint2003 本课件由汇编网 制作提供 第13章int指令 13 1int指令13 2编写供应用程序调用的中断例程13 3对int iret和栈的深入理解13 4BIOS和DOS所提供的中断例程13 5BIOS和DOS中断例程的安装过程13 6BIOS中断例程应用13 7DOS中断例程应用 引言 中断信息可以来自CPU的内部和外部 当CPU的内部有需要处理的事情发生的时候 将产生需要马上处理的中断信息 引发中断过程 引言 在第12章中 我们讲解了中断过程和两种内中断的处理 这一章中 我们讲解另一种重要的内中断

2、 由int指令引发的中断 13 1int指令 int格式 intn n为中断类型码 它的功能是引发中断过程 CPU执行intn指令 相当于引发一个n号中断的中断过程 执行过程如下 1 取中断类型码n 2 标志寄存器入栈 IF 0 TF 0 3 CS IP入栈 4 IP n 4 CS n 4 2 从此处转去执行n号中断的中断处理程序 13 1int指令 可以在程序中使用int指令调用任何一个中断的中断处理程序 比如 下面的程序 assumecs codecodesegmentstart movax 0b800hmoves axmovbyteptres 12 160 40 2 int0codeen

3、dsendstart 13 1int指令 这个程序在Windows2000中的DOS方式下执行时 将在屏幕中间显示一个 然后显示 Divideoverflow 后返回到系统中 是我们编程显示的 而 Divideoverflow 是哪里来的呢 我们的程序中又没有做除法 不可能产生除法溢出 13 1int指令 程序是没有做除法 但是在结尾使用了int0指令 CPU执行int0指令时 将引发中断过程 执行0号中断处理程序 而系统设置的0号中断处理程序的功能是显示 Divideoverflow 然后返回到系统 13 1int指令 可见 int指令的最终功能和call指令相似 都是调用一段程序 一般情况

4、下 系统将一些具有一定功能的子程序 以中断处理程序的方式提供给应用程序调用 13 1int指令 我们在编程的时候 可以用int指令调用这些子程序 当然 也可以自己编写一些中断处理程序供别人使用 以后 我们可以将中断处理程序简称为中断例程 13 2编写供应用程序调用的中断例程 前面 我们已经编写过中断0的中断例程了 现在我们讨论可以供应用程序调用的中断例程的编写方法 我们通过两个问题来讨论 1 示例一2 示例二 13 2编写供应用程序调用的中断例程 示例一编写 安装中断7ch的中断例程 功能 求一word型数据的平方 参数 ax 要计算的数据 返回值 dx ax中存放结果的高16位和低16位 应

5、用举例 求2 3456 2程序及分析 13 2编写供应用程序调用的中断例程 assumecs codecodesegmentstart movax 3456 ax 3456int7ch 调用中断7ch的中断例程 计算ax中的数据的平方addax ax dx ax存放结果 讲结果乘以2movax 4c00hint21hcodeendsendstart分析一下 13 2编写供应用程序调用的中断例程 我们要做三部分工作 1 编程实现求平方功能的程序 2 安装程序 我们将其安装在0 200处 3 设置中断向量表 将程序的入口地址保存在7ch表项中 使其成为中断7ch的中断例程 安装程序代码 13 2编

6、写供应用程序调用的中断例程 注意 在中断例程sqr的最后 要使用iret指令 用汇编语法描述 iret指令的功能为 popIPpopCSpopf 13 2编写供应用程序调用的中断例程 CPU执行int7ch指令进入中断例程之前 标志寄存器 当前的CS和IP被压入栈中 在执行完中断例程后 应该用iret指令恢复int7ch执行前的标志寄存器和CS IP的值 从而接着执行应用程序 int指令和iret指令的配合使用与call指令和ret指令的配合使用具有相似的思路 13 2编写供应用程序调用的中断例程 示例二编写 安装中断7ch的中断例程 功能 将一个全是字母 以0结尾的字符串 转化为大写 参数

7、ds si指向字符串的首地址 应用举例 将data段中的字符转化为大写 13 2编写供应用程序调用的中断例程 应用举例 将data段中的字符转化为大写 assumecs codedatasegmentdb conversation 0dataendscodesegmentstart movax datamovds axmovsi 0int7chmovax 4c00hint21hcodeendsendstart 13 2编写供应用程序调用的中断例程 安装程序源码在中断例程capital中用到了寄存器si和cx 编写中断例程和编写子程序的时候具有同样的问题 就是要避免寄存器的冲突 应该注意例程中用

8、到的寄存器的值的保存和恢复 13 3对int iret和栈的深入理解 问题 用7ch中断例程完成loop指令的功能 loops的执行需要两个信息 循环次数和到s的位移 所以 7ch中断例程要完成loop指令的功能 也需要这两个信息作为参数 我们用cx存放循环次数 用bx存放位移 13 3对int iret和栈的深入理解 应用举例 在屏幕中间显示80个 assumecs codecodesegmentstart movax 0b800hmoves axmovdi 160 12movbx offsets offsetse 设置从标号se到标号s的转移位移movcx 80s movbyteptres

9、 di adddi 2int7ch 如果 cx 0 转移到标号s处se nopmovax 4c00hint21hcodeendsendstart 13 3对int iret和栈的深入理解 在上面的程序中 用int7ch调用7ch中断例程进行转移 用bx传递转移的位移 分析 为了模拟loop指令 7ch中断例程应具备下面的功能 1 deccx 2 如果 cx 0 转到标号s处执行 否则向下执行 13 3对int iret和栈的深入理解 下面我们分析7ch中断例程如何实现到目的地址的转移 1 转到标号s显然应设 CS 标号s的段地址 IP 标号s的偏移地址 2 那么 中断例程如何得到标号s的段地址

10、和偏移地址呢 分析 3 现在知道 可以从栈中直接和间接地得到标号s的段地址和偏移地址 那么如何用它们设置CS IP呢 分析 13 3对int iret和栈的深入理解 int7ch引发中断过程后 进入7ch中断例程 在中断过程中 当前的标志寄存器 CS和IP都要压栈 此时压入的CS和IP中的内容 分别是调用程序的段地址 可以认为是标号s的段地址 和int7ch后一条指令的偏移地址 即标号se的偏移地址 13 3对int iret和栈的深入理解 可见 在中断例程中 可以从栈里取得标号s的段地址和标号se的偏移地址 而用标号se的偏移地址加上bx中存放的转移位移就可以得到标号s的偏移地址 13 3对

11、int iret和栈的深入理解 可以利用iret指令 我们将栈中的se的偏移地址加上bx中的转移位移 则栈中的se的偏移地址就变为了s的偏移地址 我们再使用iret指令 用栈中的内容设置CS IP 从而实现转移到标号s处 13 3对int iret和栈的深入理解 7ch中断例程如下 lp pushbpmovbp spdeccxjcxzlpretadd bp 2 bxlpret popbpiret 13 3对int iret和栈的深入理解 因为要访问栈 使用了bp 在程序开始处将bp入栈保存 结束时出栈恢复 当要修改栈中se的偏移地址的时候 栈中的情况为 栈顶处是bp原来的数值 下面是se的偏移

12、地址 再下面是s的段地址 再下面是标志寄存器的值 13 3对int iret和栈的深入理解 而此时 bp中为栈顶的偏移地址 所以 ss 16 bp 2 处为se的偏移地址 将它加上bx中的转移位移就变为s的偏移地址 最后用iret出栈返回 CS IP即从标号s处开始执行指令 如果 cx 0 则不需要修改栈中se的偏移地址 直接返回即可 CPU从标号se处向下执行指令 特别提示 检测点13 1 page246 没有通过此检测点 请不要向下进行 13 5BIOS和DOS中断例程的安装过程 而BIOS和DOS提供的中断例程是如何安装到内存中的呢 我们下面讲解它们的安装过程 13 5BIOS和DOS中

13、断例程的安装过程 1 开机后 CPU一加电 初始化 CS 0FFFFH IP 0 自动从FFFF 0单元开始执行程序 FFFF 0处有一条转跳指令 CPU执行该指令后 转去执行BIOS中的硬件系统检测和初始化程序 13 5BIOS和DOS中断例程的安装过程 2 初始化程序将建立BIOS所支持的中断向量 即将BIOS提供的中断例程的入口地址登记在中断向量表中 13 5BIOS和DOS中断例程的安装过程 3 硬件系统检测和初始化完成后 调用int19h进行操作系统的引导 从此将计算机交由操作系统控制 13 5BIOS和DOS中断例程的安装过程 4 DOS启动后 除完成其它工作外 还将它所提供的中断

14、例程装入内存 并建立相应的中断向量 特别提示 检测点13 2 page248独立思考后可共同讨论 没有通过此检测点 请不要向下进行 13 6BIOS中断例程应用 下面我们举几个例子 来看一下BIOS中断例程的应用 int10h中断例程是BIOS提供的中断例程 其中包含了多个和屏幕输出相关的子程序 13 6BIOS中断例程应用 一般来说 一个供程序员调用的中断例程中往往包括多个子程序 中断例程内部用传递进来的参数来决定执行哪个子程序 BIOS和DOS提供的中断例程 都用ah来传递内部子程序的编号 13 6BIOS中断例程应用 我们看一下int10h中断例程的设置光标位置功能 movah 2mov

15、bh 0movdh 5movdl 12int10h 13 6BIOS中断例程应用 ah 2表示调用第10h号中断例程的2号子程序 功能为设置光标位置 可以提供光标所在的行号 80 25字符模式下 0 24 列号 80 25字符模式下 0 79 和页号作为参数 bh 0 dh 5 dl 12 设置光标到第0页 第5行 第12列 13 6BIOS中断例程应用 bh中页号的含义 内存地址空间中 B8000h BFFFFh共32K的空间 为80 25彩色字符模式的显示缓冲区 一屏的内容在显示缓冲区中共占4000个字节 13 6BIOS中断例程应用 显示缓冲区分为8页 每页4K 4000 显示器可以显示

16、任意一页的内容 一般情况下 显示第0页的内容 也就是说 通常情况下 B8000 B8F9F中的4000个字节的内容将出现在显示器上 13 6BIOS中断例程应用 再看一下int10h中断例程的在光标位置显示字符功能 movah 9 置光标moval a 字符movbl 7 颜色属性movbh 0 第0页movcx 3 字符重复个数int10h 13 6BIOS中断例程应用 ah 9表示调用第10h号中断例程的9号子程序 功能为在光标位置显示字符 可以提供要显示的字符 颜色属性 页号 字符重复个数作为参数 13 6BIOS中断例程应用 bh 中的颜色属性格式如下 可以看出 和显存中的属性字节的格式相同 13 6BIOS中断例程应用 编程 在屏幕的5行12列显示3个红底高亮闪烁绿色的 a 程序源码注意 闪烁的效果必须在全屏DOS方式下才能看到 13 7DOS中断例程应用 int21h中断例程是DOS提供的中断例程 其中包含了DOS提供给程序员在编程时调用的子程序 我们从前一直使用的是int21中断例程的4ch号功能 即程序返回功能 如下 movah 4ch 程序返回moval 0 返回值i

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号