鱼C论坛

 找回密码
 立即注册
查看: 2362|回复: 0

[学习笔记] 第十三章 int指令

[复制链接]
发表于 2017-12-2 19:58:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 若余相思 于 2017-12-2 19:58 编辑

本章主要讲int指令引发的中断

13.1节   int指令

int指令的格式为int n,n为中断类型码

执行int n 相当于引发一个n号的中断过程,执行如下:
(1)取中断类型码n
(2)标志寄存器入栈,IF = 0,TF = 0
(3)CS, IP 入栈
(4)(IP) = (n * 4), (CS) = (n * 4 + 2)

我们习惯将中断处理程序称为中断例程

13.2节   编写共应用程序调用的中断例程


问题一、编写、安装中断7cH的中断例程
             功能:求word型数据的平方
            参数: ax = 要计算的数值
            返回值Ldx,ax中存放结果的高16位和低16位

代码如下:
  1. assume cs: code

  2. code segment

  3. start:        mov ax, cs
  4.                         mov ds, ax
  5.                         mov si, offset sqr
  6.                        
  7.                         mov ax, 0
  8.                         mov es, ax
  9.                         mov di, 0200H
  10.                        
  11.                         mov cx, offset sqrend - offset sqr
  12.                        
  13.                         cld
  14.                         rep movsb
  15.                        
  16.                         mov ax, 0
  17.                         mov es, ax
  18.                        
  19.                         mov word ptr es:[7cH*0], 0200H
  20.                         mov word ptr es:[7cH + 2], 0
  21.                        
  22.                         mov ax, 4c00H
  23.                         int 21H
  24.                        
  25.         sqr:        mul ax
  26.                         iret
  27.                        
  28. sqrend:        nop

  29.                         mov ax, 4c00H
  30.                         int 21H
  31.                        
  32. code ends
  33. end start
  34.                        
  35.                        
复制代码


问题二、编写、安装中断7cH的中断例程
        功能:将一个全是字母,以0结尾的字符串,转化为大写(即8bit位中的第五位)
        参数:ds:si指向字符串的首地址
       

代码如下:
  1. assume cs: code

  2. code segment

  3. start:                mov ax, cs
  4.                                 mov ds, ax
  5.                                 mov si, offset capital
  6.                                
  7.                                 mov ax, 0
  8.                                 mov es, ax
  9.                                 mov di, 0200H
  10.                                
  11.                                 mov cx, offset capitalend - offset capital
  12.                                
  13.                                 cld
  14.                                 rep movsb
  15.                                
  16.                                 mov ax, 0
  17.                                 mov es, ax
  18.                                 mov word ptr es:[7cH*4], 0200H
  19.                                 mov word ptr es:[7cH*4 + 2], 0
  20.                                
  21.                                
  22.                                 mov ax, 4c00H
  23.                                 int 21H
  24.                                
  25.         capital:        push cx
  26.                                 push si
  27.                                
  28. change:        mov cl, [si]
  29.                                 mov ch, 0
  30.                                 jcxz ok
  31.                                 and byte ptr [si], 11011111B
  32.                                 inc si
  33.                                 jmp short change
  34.                                
  35.                 ok:        pop si
  36.                                 pop cx
  37.                                 iret
  38.                                
  39. capitalend:        nop

  40.                         mov ax, 4c00H
  41.                         int 21H
  42.                        
  43. code ends
  44. end start
复制代码


13.3节   对int  iret和栈的深入理解


本节主要是讲解用中断例程编写loop循环

主程序代码:
  1. assume cs: code

  2. code segment

  3. start:                mov ax, 0b800H
  4.                                 mov es, ax
  5.                                 mov di, 12*160
  6.                                
  7.                                 mov bx, offset s - offset se
  8.                                 mov cx, 80
  9.                                
  10.         s:                        mov byte ptr es:[di], '!'
  11.                                 add di, 2
  12.                                 int 7cH
  13.                 se:        nop
  14.                                
  15.                                 mov ax, 4c00H
  16.                                 int 21H
  17.                                
  18. code ends
  19. end start
复制代码


中断程序代码:
  1. assume cs:code

  2. code segment

  3. start:       
  4.                                 mov ax, cs
  5.                                 mov ds, ax
  6.                                 mov si, offset lp
  7.                                
  8.                                 mov ax, 0
  9.                                 mov es, ax
  10.                                 mov di, 0200H
  11.                                
  12.                                 mov cx, offset lpend - offset lp
  13.                                
  14.                                 cld
  15.                                 rep movsb
  16.                                
  17.                                 mov ax, 0
  18.                                 mov es, ax
  19.                                 mov word ptr es:[7cH * 4], 0200H
  20.                                 mov word ptr es:[7cH * 4 + 2], 0
  21.                                
  22.                                 mov ax, 4c00H
  23.                                 int 21H
  24.                                
  25.                 lp:        push bp
  26.                                 mov bp, sp
  27.                                 dec cx
  28.                                 jcxz ok
  29.                                 add [bp + 2], bx
  30.                                
  31.                 ok:        pop bp
  32.                                 iret
  33.                                
  34.                                 mov ax, 4c00H
  35.                                 int 21H
  36.         lpend:        nop
  37. code ends
  38. end start
复制代码



中断例程的核心代码:
  1. push bp
  2.                                 mov bp, sp
  3.                                 dec cx
  4.                                 jcxz ok
  5.                                 add [bp + 2], bx
复制代码


主要分为以下几个步骤:
(1)将bp压栈
(2)将栈顶指向bp(用意是保护栈顶的位置,不会因为bp的错乱而搞得全部都错完)
(3)cx减1
(4)当cx = 0时跳转到结束的位置
(5)设置【bp + 2】为IP的指向,把bx(即距离s的偏移位移)赋值给IP,这就让IP指向s处


13.4节   BIOSS和DOS所提供的中断例程

BIOS(基础的输入输出系统),BIOS主要包含如下:
(1)硬件系统的检测和初始化程序
(2)外部中断和内部中断的中断例程
(3)用于对硬件设备进行I/O操作的中断例程
(4)其他和硬件相关的中断例程

程序员在编程时可以用int 指令调用BIOS和DOS的中断例程来完成某些工作


13.5节   BIOS和DOS中断例程的安装

下面是BIOS和DOS提供的中断例程的安装到内存中
(1)开机后,CPU加电,初始化(CS) = FFFFH,(IP) = 0,CPU自动从FFFF:0执行程序,FFFF:0有一条跳转指令,
CPU执行该指令后,转去执行BIOS的硬件系统的检测和初始化程序
(2)初始化程序将建立相关的中断向量(即将中断例程的入口i地址登陆到中断向量表中)
(3)硬件系统检测和初始化完成后,调用int 19H进行操作系统的引导,从此将计算机交付给操作系统控制
(4)DOS启动后,除了完成其他工作外,还将中断例程装入内存中,并建立相应的中断向量

也就是说,系统启动时首先启动BIOS程序,装入BIOS的中断向量,然后调用int 19H将计算机交给操作系统,然后才启动DOS,然后才建立DOS相关的中断例程

13.6节   BIOS中断例程的应用


对于中断是一个程序,里面会有许多小程序,并且有如下规则
ah:为子程序的编号,如:mov ah, 9,表示调用9号小程序
al:为子程序的字符,比如:mov al, 'a'
bh:为子程序的页号。比如:mov bh, 0,将在第0页
bl: 为al里面字体的颜色,比如mov bl, 11001010B
cx:为将要显示的al字符的个数,比如:mov cx, 3
dh:为行号
dl为列号


比如编写一个一个在屏幕的5行12列显示3个红底高亮闪烁绿色的a
代码:
  1. assume cs: code

  2. code segment

  3. start:                mov ah, 2
  4.                                 mov bh, 0
  5.                                 mov dh, 5
  6.                                 mov dl, 12
  7.                                 int 10H
  8.                                
  9.                                 mov ah, 9
  10.                                 mov al, 'a'
  11.                                 mov bh,0
  12.                                 mov bl, 11001010B
  13.                                 mov cx, 3
  14.                                 int 10H
  15.                                
  16.                                 mov ax, 4c00H
  17.                                 int 21H
  18.                                
  19. code ends
  20. end start
复制代码


13.7节   DOS中断例程的应用

和上节的BIOS中断的规则差不多,就是调用int 21H中断的时候编号9的显示字符子程序,字符以$为结束

编写在屏幕5行12列显示字符串"I love fishc.com!"
代码:
  1. assume cs: code

  2. data segment

  3.         db 'I love fishc,com!','



  4. code segment

  5. start:                mov ah, 2
  6.                                 mov dh, 5
  7.                                 mov dl, 12
  8.                                 mov bh, 0
  9.                                 int 10H
  10.                                
  11.                                 mov ax, data
  12.                                 mov ds, ax
  13.                                 mov dx, 0
  14.                                 mov ah, 9
  15.                                 int 21H
  16.                                
  17.                                 mov ax, 4c00H
  18.                                 int 21H
  19.                                
  20. code ends
  21. end start
复制代码


本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 05:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表