鱼C论坛

 找回密码
 立即注册
查看: 2550|回复: 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位

代码如下:
assume cs: code 

code segment 

start:        mov ax, cs 
                        mov ds, ax 
                        mov si, offset sqr
                        
                        mov ax, 0
                        mov es, ax 
                        mov di, 0200H
                        
                        mov cx, offset sqrend - offset sqr
                        
                        cld 
                        rep movsb 
                        
                        mov ax, 0
                        mov es, ax 
                        
                        mov word ptr es:[7cH*0], 0200H
                        mov word ptr es:[7cH + 2], 0
                        
                        mov ax, 4c00H
                        int 21H
                        
        sqr:        mul ax 
                        iret
                        
sqrend:        nop

                        mov ax, 4c00H
                        int 21H
                        
code ends 
end start 
                        
                        

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

代码如下:
assume cs: code 

code segment 

start:                mov ax, cs 
                                mov ds, ax 
                                mov si, offset capital
                                
                                mov ax, 0
                                mov es, ax 
                                mov di, 0200H
                                
                                mov cx, offset capitalend - offset capital
                                
                                cld 
                                rep movsb
                                
                                mov ax, 0 
                                mov es, ax 
                                mov word ptr es:[7cH*4], 0200H
                                mov word ptr es:[7cH*4 + 2], 0 
                                
                                
                                mov ax, 4c00H
                                int 21H
                                
        capital:        push cx
                                push si 
                                
change:        mov cl, [si]
                                mov ch, 0 
                                jcxz ok 
                                and byte ptr [si], 11011111B
                                inc si 
                                jmp short change 
                                
                ok:        pop si 
                                pop cx 
                                iret
                                
capitalend:        nop 

                        mov ax, 4c00H
                        int 21H
                        
code ends 
end start 

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


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

主程序代码:
assume cs: code 

code segment 

start:                mov ax, 0b800H
                                mov es, ax 
                                mov di, 12*160 
                                
                                mov bx, offset s - offset se
                                mov cx, 80
                                
        s:                        mov byte ptr es:[di], '!'
                                add di, 2
                                int 7cH
                se:        nop
                                
                                mov ax, 4c00H
                                int 21H
                                
code ends 
end start 

中断程序代码:
assume cs:code 

code segment 

start:        
                                mov ax, cs 
                                mov ds, ax 
                                mov si, offset lp 
                                
                                mov ax, 0
                                mov es, ax 
                                mov di, 0200H
                                
                                mov cx, offset lpend - offset lp
                                
                                cld 
                                rep movsb 
                                
                                mov ax, 0 
                                mov es, ax 
                                mov word ptr es:[7cH * 4], 0200H
                                mov word ptr es:[7cH * 4 + 2], 0 
                                
                                mov ax, 4c00H
                                int 21H
                                
                lp:        push bp 
                                mov bp, sp 
                                dec cx 
                                jcxz ok 
                                add [bp + 2], bx 
                                
                ok:        pop bp 
                                iret 
                                
                                mov ax, 4c00H
                                int 21H
        lpend:        nop
code ends 
end start 


中断例程的核心代码:
push bp 
                                mov bp, sp 
                                dec cx 
                                jcxz ok 
                                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
代码:
assume cs: code 

code segment 

start:                mov ah, 2
                                mov bh, 0
                                mov dh, 5
                                mov dl, 12
                                int 10H
                                
                                mov ah, 9
                                mov al, 'a'
                                mov bh,0
                                mov bl, 11001010B
                                mov cx, 3
                                int 10H
                                
                                mov ax, 4c00H
                                int 21H
                                
code ends 
end start 

13.7节   DOS中断例程的应用

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

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

data segment

        db 'I love fishc,com!','



code segment 

start:                mov ah, 2
                                mov dh, 5
                                mov dl, 12
                                mov bh, 0
                                int 10H
                                
                                mov ax, data
                                mov ds, ax 
                                mov dx, 0
                                mov ah, 9
                                int 21H
                                
                                mov ax, 4c00H
                                int 21H
                                
code ends 
end start 

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 06:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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