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


    第十三章:int指令02

     

    让编程改变世界

    Change the world by program


     

    对int、iret和栈的深入理解

     

    问题:用7ch中断例程完成 loop指令的功能。

    loop  s的执行需要两个信息:循环次数和到s的位移 所以,7ch中断例程要完成loop指令的功能,也需要这两个信息作为参数。 我们用cx存放循环次数,用bx存放位移。  

    应用举例:在屏幕中间显示80个‘!’。

      认识框架代码:相关代码下载   在上面的程序中,用int 7ch调用7ch中断例程进行转移,用 bx 传递转移的位移。

    分析,为了模拟loop指令,7ch中断例程应具备下面的功能:

    (1)dec cx (2)如果(cx)≠0,转到标号s 处执行,否则向下执行。  

    下面我们分析7ch中断例程如何实现到目的地址的转移:

    (1)转到标号s显然应设(CS)=标号s的段地址,(IP)=标号s的偏移地址; (2)那么,中断例程如何得到标号s的段地址和偏移地址呢? (3)现在知道,可以从栈中直接和间接地得到标号s的段地址和偏移地址,那么如何用它们设置CS:IP呢?   int 7ch引发中断过程后,进入 7ch 中断例程,在中断过程中,当前的标志寄存器、CS和IP都要压栈。   此时压入的CS和IP中的内容,分别是调用程序的段地址(可以认为是标号 s 的段地址)和int 7ch后一条指令的偏移地址(即标号se的偏移地址)。 可见,在中断例程中,可以从栈里取得标号s 的段地址和标号 se的偏移地址,而用标号se的偏移地址加上bx中存放的转移位移就可以得到标号s的偏移地址。 可以利用iret指令,我们将栈中的se的偏移地址加上 bx 中的转移位移,则栈中的se的偏移地址就变为了s的偏移地址。 我们再使用iret指令,用栈中的内容设置CS、IP,从而实现转移到标号s处。  

    7ch中断例程如下:

    lp:

    push bp

    mov bp,sp

    dec cx

    jcxz lpret

    add [bp+2],bx

    lpret:

    pop bp

    iret

     

    检测点13.1

      相关代码下载  

    BIOS和DOS中断例程的安装过程

    前边的课程中,我们都是自己编写中断例程,将他们放在安装程序中,然后通过运行安装程序,将他们安装到指定的内存区中。 此后,别的应用程序才可以调用。  

    BIOS和DOS提供的中断例程是如何安装到内存中的呢?

    我们下面讲解它们的安装过程。 (1) 开机后,CPU 一加电,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。 (2)初始化程序将建立BIOS 所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。 (3)硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交由操作系统控制。 (4)DOS 启动后,除完成其它工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。  

    检测点13.2

    [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LTAROXYTTXXG']视频下载[/Downlink]
  • 相关阅读:
    eclipse+myeclipse 使用技巧备忘
    程序员的自我修养
    枚举工具类 EnumUtils
    日期/时间处理工具 DateTimeUtil
    轻松了解Spring中的控制反转和依赖注入(一)
    了解SpringMVC框架及基本工作流程
    HTTP请求行、请求头、请求体详解
    Tomcat项目部署问题记录
    入手IntelliJ IDEA 常用配置
    解决阿里云OSS跨域问题
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846085.html
Copyright © 2020-2023  润新知