title: 汇编笔记_第十三章
date: 2019-01-02 15:45:55
tags:
- 笔记
categories: - 汇编语言
中断程序设计
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)