int 指令

int 指令的格式为:int n,n为中断类型码。这里由 n 显式的给出了调用哪一个中断处理程序。
      CPU 的中断过程仍然是:
(1)取中断类型码n
(2)标志寄存器入栈,IF=0,TF=0
(3)CS、IP入栈
(4)(IP)=(nx4),(CS)=(nx4+2)
      比如:当除法溢出时产生的0号中断,会在屏幕上显示“Divide overflow”。我们也可以通过 int 0 指令来让屏幕上显示“Divide overflow”,虽然此时并没有发生除法溢出。

当编写返回到应用程序的中断处理程序时,它与返回到dos系统的中断例程差别在于,它使用了iret指令来返回到应用程序,后者是通过 mov ax 4c00h        int 21h来返回的。
      iret指令的功能为IP 出栈,CS 出栈,标志寄存器出栈。它常和 int 指令来配合使用 ,就像 call 和 ret 指令一样。

编写程序实现:在屏幕中间显示80个 '!’。要求用 int 指令来代替 loop 指令,其中需要将循环次数和指令转移位移做为参数。将循环次数放在 cx 中,位移放在 bx 中,完整程序如下:

 assume cs:codecode segmentstart: mov ax,0b800hmov es,axmov di,160*12mov bx,offset s-offset se       ;设置标号s到se的转移位移mov cx,80                     ;循环次数s: mov byte ptr es:[di],'!'add di,2int 7chse: nopmov ax,4c00hint 21hcode endsend start

7ch 中断例程如下:

  lp: push bpmov bp,spdec cx             jcxz lpend          ;判断cx是否为0add [bp+2],bx     ;用转移位移bx更改IP的值lpend: pop bpiret

采用 bp 来作为临时寄存器,需要对它进行入栈保存,结束时恢复。当要用 bx 来修改原来的应用程序偏移地址 IP 时,栈中的情况为:sp 指向 bp 的值,sp+2 指向原来的 IP,sp+4 指向原来的 CS,sp+6 指向原来的标志寄存器。原来程序的段地址 CS 和标号 s 的段地址 CS 是相同,故只需要改变原 IP 的值即可,通过 add [bp+2],bx 来改变。
      loop 指令是8位短转移指令,用来替代它的 int 指令是16位的近转移指令,这是需要注意的。

DOS和BIOS中断例程

一般来说,一个供程序员调用的中断例程往往包括多个子程序,中断例程内用传递进来的参数来决定执行哪一个子程序。BIOS和DOS中的参数往往采用 ah 来传递。
      int 10h 是BIOS提供的中断例程,其中包含多个和屏幕输出相关的子程序。
      int 21h 是DOS提供的中断例程。我们一直使用的是 int 21h 中断例程的 4ch 号子程序,功能为程序返回,可以提供返回值作为参数。如下:

         mov ah,4ch          ;4c作为参数进行程序返回功能mov al,0         ;0作为返回值int 21h

也可以像我们经常使用的那样:

             mov ax,4c00hint 21

实验13

(1)编写安装 int 7ch 中断例程,功能为显示一个用0结束的字符串,中断例程安装在 0:200 处。
      参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。
      程序举例如下:

     assume cs:codedata segmentdb "welcome to masm!",0data endscode segmentstart: mov dh,10mov dl,10mov cl,2mov ax,data mov ds,axmov si,0int 7chmov ax,4c00hint 21hcode endsend start

7ch 中断例程安装如下:

     assume cs:codecode segmentmov ax,cs         ;中断处理程序安装在0:200处mov ds,csmov si,offset smov ax,0mov es,axmov di,200hmov cx,offset send-offset scldrep movsbmov ax,0             ;设置中断向量表mov ds,axmov word ptr ds:[7c*4],200hmov word ptr ds:[7c*4+2],0mov ax,4c00hint 21hs: push si                ;中断处理程序的实现push espush dimov ax,0b800hmov es,axmov di,160*dh+2*dllp: mov al,[si]cmp al,0je okmov es:[di],almov es:[di+1],cladd di,2inc sijmp short lpok: pop dipop espop siiretsend: nop               ;这条指令是不会执行的,因为它没有被传送过去code endsend start

(2)略。

(3)下面程序在屏幕的2,4,6,8行显示4句英文诗,补全程序如下:

     assume cs:codecode 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          ;选择显示缓冲区第0页mov dh,[si]      ;dh中保存行号mov dl,0            ;dl中保存列号mov ah,2            ;调用int 10h的2号子程序:置光标int 10hmov dx,[bx]       ;ds:dx为待显示字符串的首地址,以'$'作为结尾符mov ah,9            ;调用int 21h的9号子程序:显示字符串int 21hadd bx,2inc siloop okmov ax 4c00h       ;调用int 21h的4c号子程序:程序返回,返回值为0int 21hcode endsend start

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

  1. 汇编语言随笔(14)-直接定址表、检测点16和实验16

    标号 1,关于地址标号,a:,带有冒号的形式,之前我们一直使用.这种标号被用来标记指令,数据的起始地址,表示内存单元的起始地址.       后面带有冒号的地址标号,只能在代码段中使用,不能在其他段中 ...

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

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

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

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

  4. 汇编语言随笔(15)- 对键盘输入进行处理(int 9 和 int 16h 中断例程)

    键盘输入 1,前面讲过, int 9 中断例程负责对键盘输入进行处理,具体为:从 60h 端口读出扫描码,并将其转化为相应的ASCII码或状态信息,一起存储到内存的指定空间(键盘缓冲区或状态字节)中. ...

  5. 汇编语言--int指令

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

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

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

  7. 汇编语言-int指令

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

  8. 汇编语言随笔(16)- 对磁盘进行读写(int 13h 中断例程)和实验 17

    磁盘读写 3.5 英寸软盘分为上下两面,每面有 80 个磁道,每个磁道又分为 18 个扇区,每个扇区的大小为 512 个字节.下面的磁盘读写均以 3.5 英寸软盘为例. 在读写扇区的时候,要给出面号. ...

  9. 8086汇编语言寻址方式、基本指令和调试指令

    一.80x86/Pentium 各种寻址方式 1.立即寻址 立即寻址方式下,操作数作为立即数直接包含在指令中,紧跟在操作码之后与其一起 存放在代码段区域.因此,立即数总是和操作码一起被存入 CPU 的 ...

最新文章

  1. Skype for Business Server 2015-07-边缘服务器-3-部署
  2. 每一个科学家的内心都住着一位哲学家(节选)
  3. linux即时通讯软件下载,安信通linux版下载
  4. linux硬盘检测工具,CrazyDiskInfo 硬盘检测工具 Linux版 | 厘米天空
  5. 中加学校计算机考试题,嘉应学院2009年计算机期末考试试题
  6. html中的各种协议,html 中使用 wtai 协议
  7. hdu 4318 Power transmission 临接表 广搜 多校联合赛(二) 第九题
  8. lhgcoreDialogPlugin v3.5.2 使用点滴
  9. 电子设计竞赛经验介绍
  10. python xlsxwriter生成图片保存_Python xlsxwriter库 图表Demo
  11. solidworks动画制作教程——简单直线运动
  12. 小米手机开发者选项在哪?小米手机怎么打开开发者选项
  13. 深圳学位锁定怎么计算机,【实用】如何查询深圳房子学位是否锁定?(附操作步骤)...
  14. python软件下载对电脑配置要求-Python实现的读取电脑硬件信息功能示例
  15. 考虑蒙特卡洛考虑风光不确定性的配电网运行风险 评估 由于风电光伏出力的不确定性,造成配电网运行风险,运用蒙特卡洛概率潮流计算分析电压和线路支路越限
  16. 计算机固态地址是什么,SSD固态硬盘安装到笔记本电脑什么位置比较合适
  17. 中国故事 张亚勤 访谈
  18. Spring boot 之 RestTemplate
  19. Linux 驱动程序 USB控制
  20. LeetCode 46.全排列

热门文章

  1. 聊聊Servlet、Struts1、Struts2以及SpringMvc中的线程安全
  2. 通过FactoryBean方式来配置bean
  3. IE8下 Select文字垂直居中的办法
  4. Eclipse jee 配置Tomcat5.5
  5. 对应生成树的基本回路_数据结构与算法——最小生成树
  6. UVA10020(最小区间覆盖)
  7. hdu4280 最大流DINIC
  8. 【Android NDK 开发】Android NDK 下载 ( 下载指定历史版本 NDK | Android NDK r10e - 2015 年 5 月 )
  9. 【Windows 逆向】CE 地址遍历工具 ( CE 结构剖析工具 | 遍历查找后坐力数据 | 尝试修改后坐力数据 )
  10. 【OpenGL】十七、OpenGL 绘制四边形 ( 绘制 GL_QUAD_STRIP 模式四边形 )