int指令是X86汇编语言中最重要的指令之一。它的作用是引发中断,调用“中断例程”(interrupt routine)。本文将介绍int指令的基本原理和应用,以及BIOS和DOS系统的中断例程。

一、int指令的原理

1,指令原型

int n

注:

1)n 表示中断号,也可以称为中断类型码。n是一个字节大小的正整数,范围为“0 - 255”。

2)执行“int n”时,CPU从中断向量表中,找到第n号表项,修改CS和IP

(IP)=(n*4),(CS)=(n*4+2)

3)对8086PC,中断向量表指定放在内存地址0处(地址固定),共1024个字节。每个表项占两个字,低字存放偏移地址,高字存放段地址。

2,int指令执行过程

1)取中断类型码n;

2)标志寄存器入栈(pushf),IF=0,TF=0(重置中断标志位);

3)CS、IP入栈;

4)查中断向量表, (IP)=(n*4),(CS)=(n*4+2)。

3,中断例程的返回

中断例程既可以直接返回dos,如下

mov ax,4c00h
int 21h

中断例程也可以像子程序一样返回到中断产生的地方,这时,就需要用到“iret”——中断返回指令。

iret指令的汇编语法描述为:

pop IP
pop CS
popf

iret指令与int相对,它会恢复原始的CS和IP值,并恢复标志寄存器的值。

二、中断例程的应用

事实上,我们可以将中断例程(interrupt routine)当作子程序(函数)调用来实现一些特定功能。不同的是:

1)调用方式。中断例程通过“int n”引发中断,而被调用,通过“iret”返回;子函数通过“call label”指令调用,通过“ret”指令返回。

2)中断例程安装后,会长驻内存(除非退出DOS,或被覆盖),故中断例程可以被不同的程序反复调用;而子程序是随主程序一同被加载到一片连续的内存(逻辑上),只能在同一个程序内被调用。

为了演示中断例程的“功能特性”,书中用“int 7ch”例举三个不同功能的中断例程。

1)求一word型数据的平方;

2)将一个全是字母,以0结尾的字符串,转化为大写;

3)模拟loop指令。(修改栈内数据)

这三个功能性的程序,书中都有,且与下面的检测点13.1类似,我就不贴出来了。

检测点13.1

1)我们用7ch中断例程模拟loop指令,它能进行的最大转移位移是多少?

参考第八章,“转移指令的原理”,“jmp near ptr label”。

在模拟的过程中,使用bx保存和传递位移值。bx是16位的寄存器,故它的最大转移位移量为“(-32768,32767) ”。

2)用7ch中断例程完成jmp near ptr s指令的功能。

应用举例:在屏幕第12行,显示data段中的以0结尾的字符串

assume cs:codedata segmentdb 'conversation',0
data endscode segmentstart:mov ax,datamov ds,axmov si,0mov ax,0b800hmov es,axmov di,12*160s:cmp byte ptr [si],0je okmov al,[si]mov ah,0cahmov es:[di],axinc siadd di,2mov bx,offset s - offset okint 7chok:mov ax,4c00hint 21h
code ends
end start

下面是中断例程:

assume cs:code
code segmentstart:mov ax,csmov ds,axmov si,offset jumpmov ax,0mov es,axmov di,200hmov cx,offset jumpend - offset jumpcldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hjump:push bpmov bp,spadd [bp+2],bxpop bpiretjumpend:nopcode ends
end start

三、BIOS提供的中断例程

BIOS,即“Basic Input Output System”,它是系统板的ROM(Read-Only Memory)中的一套程序。BIOS中的中断例程安装过程如下:

1)开机后,CPU一加电,初始化(CS)=0FFFFH,(IP)=0,(参考第一章可知,该地址位于系统板的ROM中),自动从FFFF:0单元开始执行程序。FFFF:0处有一条跳转指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。

2)初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。注意,对应BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在(仅需登记,无需安装)。

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

4)DOS启动后,除完成其他工作外,还将它提供的中断例程装入内存,并建立相应的中断向量。

关于BIOS的启动过程,可以参考:http://www.techbulo.com/760.html

检测点13.2

判断题

1)我们可以编程改变FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。

False !

参考第一章,FFFF:0是系统板ROM中的地址,只能读,不能写。

2)int 19h中断例程,可以由DOS提供

False !

此时,操作系统还没有被引导加载。

四、BIOS和DOS提供的中断例程的子程序和参数

BIOS和DOS提供的中断例程,往往都包含几个子程序,一般通过设置“ah”的值来调用对应编号的子程序。此外,子程序还会用到其他的一些参数,都通过各个寄存器进行传递。

典型地,BIOS提供的“int 10h”中断例程,它就包含了“设置光标位置”和“显示字符”等功能子程序。DOS提供的中断例程,以“int 21h”为代表,它包括“函数返回”、“设置光标”和“显示字符”等等功能子程序。如下:

assume cs:code
data segmentdb 'Welcome to masm','$'
data endscode segmentstart:mov ah,2        ; set cursormov bh,0        ; the zero pagemov dh,5        ; row numbermov dl,12       ; column numberint 10hmov ax,datamov ds,axmov dx,0mov ah,9int 21hmov ax,4c00hint 21h
code ends
end start

实验13

assume cs:code
code segments1:    db 'Good,Better,Best,','$'s2:    db 'Never let it rest,','$'s3:    db 'Till good is better,','$'s4:    db 'And better,best.','$'s :    dw offset s1,offset s2, offset s3, offset s4row:    db 2,4,6,8start:mov ax,csmov ds,axmov bx,offset smov si,offset rowmov cx,4ok:mov bh,0        ; page numbermov dh,[si]     ; row numbermov dl,0        ; column numbermov ah,2        ; set cursorint 10hmov dx,[bx]     ; string addresssmov ah,9        ; display stringint 21hinc siadd bx,2loop okmov ax,4c00hint 21h
code ends
end start

《汇编语言》学习(十三)int指令相关推荐

  1. 汇编语言学习之基本指令(上)

    汇编语言学习之基本指令(上) 汇编语言对大小写不敏感,所以笔者全部采用大写说明语法规则,实例中采用小写英文 文章目录 汇编语言学习之基本指令(上) 1.数据传送类指令 1.1传送指令MOV 1.2交换 ...

  2. int指令01 - 零基础入门学习汇编语言64

    第十三章:int指令01 让编程改变世界 Change the world by program 引言 在第12章中,我们讲解了中断过程和两种内中断的处理. 这一章中,我们讲解另一种重要的内中断,由i ...

  3. int指令02 - 零基础入门学习汇编语言65

    第十三章:int指令02 让编程改变世界 Change the world by program 对int.iret和栈的深入理解 问题:用7ch中断例程完成 loop指令的功能. loop  s的执 ...

  4. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  5. 计算机指令int,汇编入门学习笔记 (十二)—— int指令、端口

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.端口 参考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一 ...

  6. LOOP指令——汇编语言学习笔记3

    因为嵌入式系统学习需要,开始学习汇编语言 学习资料是B站的视频:汇编语言程序设计 贺利坚主讲 (P25) 这里写目录标题 一.LOOP功能与格式 二.LOOP指令实例 三.LOOP指令执行的要求 四. ...

  7. 汇编语言随笔(11)- int 指令(返回到应用程序的中断例程),实验13(编写、应用中断例程)

    int 指令 int 指令的格式为:int n,n为中断类型码.这里由 n 显式的给出了调用哪一个中断处理程序.       CPU 的中断过程仍然是: (1)取中断类型码n (2)标志寄存器入栈,I ...

  8. 汇编语言--int指令

    int指令的格式为:int n ,n为中断类型码,它的功能是引发中断过程. CPU执行int n指令,相当于引发一个n号中断的中断过程 在程序中使用int指令调用任何一个中断的中断处理程序(中断例程) ...

  9. int指令---汇编学习笔记

    int指令 int指令可以引发中断 13.1 int指令 int指令格式:int n,n为中断类型码,它的功能是引发中断过程. CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下 ...

  10. 汇编语言-int指令

    int 指令 int 指令的格式为:int n,n为中断类型码,它的功能是引发终端过程. CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下. 取中断类型码n: 标志寄存器入栈, ...

最新文章

  1. flask 使用cache时 报错 No module named 'flask.ext'
  2. IOS7为什么遭吐槽?
  3. 12、索引在什么情况下不会被使用?
  4. CompletableFuture异步调用
  5. php重写地址,php url地址重写
  6. windows下配置tensorflow
  7. html滚动字幕如何向下移动,按向下键的同时,菜单选项向下移动,浏览器右边的滚动条也跟着跑怎么办。这个bug怎么改...
  8. C#算法设计排序篇之01-冒泡排序(附带动画演示程序)
  9. 利用apache限制IP并发数和下载流量控制
  10. easyUi load方法重新加载表单的数据
  11. 戴尔dell电脑恢复出厂设置教程(BIOS恢复出厂设置,新版台式机)
  12. 我了解的软件测试基本概念
  13. Pytest setup teardown
  14. 美团2020后台校招题目--美团骑手包裹区间分组
  15. 2014522420145238 《信息安全系统设计基础》 第四次实验
  16. derived(derived什么意思)
  17. Java中jdk1.8和jdk17相互切换
  18. 什么是FE/GE/XG端口???
  19. 牛客网刷算法题的输入输出(C++)
  20. 删除打开方式中的选项

热门文章

  1. chrome浏览器打开网页,总是跳转到2345主页的解决方法 2345.com 绑架主页
  2. 如何设置微信公众号多条被关注自动回复个性语
  3. 无线打印机 连接路由器连接到服务器,路由器连接打印机方法
  4. 【OMNeT++】ALOHA协议仿真中的channelUtilization
  5. 【java导出PDF】
  6. solr5.3 实现同义词 扩展词典 停止词典 功能介绍
  7. jQuery获取兄弟元素
  8. 普通二本毕业八年,京东就职两年、百度三年,分享大厂心得
  9. 计算机考研数学2019,2019计算机考研数学复习:最常遇到的10个问题
  10. 四川民办高校计算机专业排名2015,2015中国民办大学最佳专业排行榜10强