汇编笔记_第十三章

中断程序设计

int 指令

int n:n为中断类型码,功能是引发中断过程

定制自己的中断

eg:将data段中的字符转化为大写

assume cs:code
data segment 
    db 'coversation',0
data ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov si,0

    int 7ch

    mov ax,4c00h
    int 21h

code ends
end start



capital:
    push cx
    push si
change:
    mov cl,[si]
    mov ch,0
    jcxz ok
    and byte ptr [si],0DFH
    inc si
    jmp short change

ok:
    pop si
    pop cx
    iret

capitalend:nop

软件中断子程序的编写

  • 保存现场
  • STI开中断指令;如允许中断嵌套,则开中断
  • 处理中断
  • CLI关中断指令
  • 恢复现场
  • IRET指令,返回被中断的程序

对int,iret和栈的深入理解

用7ch中断完成loop指令的功能

bx:保存位移(负的)
cx: 保存循环次数

所以7ch的功能有:

  • dec cx
  • 判断(cx),不为零循环,为零向下执行
assume cs:code
code segment
start:
    mov ax,0b800h
    mov es,ax
    mov di,160*12

    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


;int 7ch:
;直接修改IP的值到s处实现循环
;访问栈需要使用bp

lp:
    push bp
    mov bp,sp
    dec cx
    jcxz lpret
    add [bp+2],bx   ;[bp+2]即为IP
lpret:
    pop bp
    iret

BIOS和DOS中断例程

rom中存放着BIOS(基本输入输出系统):

  • 硬件系统的检测和初始化程序
  • 外部中断和内部中断例程
  • 用于对硬件设备进行IO操作的中断例程
  • 其他和硬件系统相关的中断例程

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

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

BIOS中断

BIOS主要分为:

  • 系统硬件检测和初始化程序
  • 内中断的中断处理程序
  • 硬件中断的中断处理程序
  • IO设备及接口控制等功能模块

屏幕及光标控制 int 10h

光标控制

  • 光标大小控制
ah=01h
ch=光标开始行
cl=光标结束行
int 10h
  • 设置光标位置
ah=01h
dh=行号
dl=列号
bh=页号
int 10h
  • 读光标位置
ah=03h
bh=页号
int 10h

返回值:
dh=行号
dl=列号
cx=光标大小

卷屏、清屏、开窗口

  • 选择显示页
ah=05h
al=页号
int 10h
  • 屏幕开窗口
ah=06h
al=0
bh=窗口颜色属性
ch=左上角行号
cl=左上角列号
dh=右下角行号
dl=右下角列号
int 10h
  • 屏幕上卷
ah=06h
al=上卷行数
bh=卷入行属性
ch=左上角行号
cl=左上角列号
dh=右下角行号
dl=右下角列号
int 10h
  • 屏幕下卷
ah=07h

字符读与显示

  • 读当前光标处字符和属性
ah=08h
bh=页号
int 10h

返回值:
ah=属性
al=字符
  • 显示多个带属性的相同字符
ah=09h
bh=页号
cx=字符重复个数
al=字符
bl=属性
int 10h


7   6 5 4  3  2 1 0
bl  r g b  i  r g b
闪烁 背景 高亮 前景

DOS中断

显示功能调用

  • 显示一个字符
ah=02h
dl=字符
int 21h
功能:屏幕上显示一个字符,光标跟随字符移动。检验DL是否为Ctrl_Break。
  • 显示一个字符
ah=06h
dl=字符
int 21h
功能:屏幕上显示一个字符,光标跟随字符移动。不检验Ctrl_Break。
  • 显示一串字符
ah=09h
ds:dx=字符串地址
int 21h
功能:屏幕上显示一串字符,光标跟随字符移动。要求字符串必须以$结尾。

输入

  • 键入一个字符并回显
ah=01h
int 21h
返回值:AL=字符的ASCII码。
  • 键入一个字符不回显
ah=07h
int 21h
返回值:AL=字符的ASCII码。不检验键入的字符是否为Ctrl_Break。

(end)

posted @ 2019-01-02 17:39  31415926535x  阅读(224)  评论(0编辑  收藏  举报