汇编 int10h(转)
原文:http://www.cnblogs.com/magic-cube/archive/2011/10/19/2217676.html
INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序,而后倚天公司针对倚天中文提供了许多服务程序,这些服务程序也加挂在 INT 10H 内。使用 INT 10H 中断服务程序时,先指定 AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用 INT 10H。底下是它们的说明:
AH
|
功 能
|
调用参数
|
返回参数 / 注释
|
1
|
置光标类型
|
(CH)0―3 = 光标开始行
(CL)0―3 = 光标结束行 |
|
2
|
置光标位置
|
BH = 页号
DH = 行 DL = 列 |
|
3
|
读光标位置
|
BH = 页号
|
CH = 光标开始行
CL = 光标结束行 DH = 行 DL = 列 |
4
|
读光笔位置
|
|
AH=0 光笔未触发
=1 光笔触发 CH=象素行 BX=象素列 DH=字符行 DL=字符列 |
5
|
显示页
|
AL = 显示页号
|
|
6
|
屏幕初始化或上卷
|
AL = 上卷行数
AL =0全屏幕为空白 BH = 卷入行属性 CH = 左上角行号 CL = 左上角列号 DH = 右下角行号 DL = 右下角列号 |
|
7
|
屏幕初始化或下卷
|
AL = 下卷行数
AL = 0全屏幕为空白 BH = 卷入行属性 CH = 左上角行号 CL = 左上角列号 DH = 右下角行号 DL = 右下角列号 |
|
8
|
读光标位置的属性和字符
|
BH = 显示页
|
AH = 属性
AL = 字符 |
9
|
在光标位置显示字符及其属性
|
BH = 显示页
AL = 字符 BL = 属性 CX = 字符重复次数 |
|
A
|
在光标位置只显示字符
|
BH = 显示页
AL = 字符 CX = 字符重复次数 |
|
E
|
显示字符(光标前移)
|
AL = 字符
BL = 前景色 |
光标跟随字符移动
|
13
|
显示字符串
|
ES:BP = 串地址
CX = 串长度 DH, DL = 起始行列 BH = 页号 AL = 0,BL = 属性 串:Char,char,……,char AL = 1,BL = 属性 串:Char,char,……,char AL = 2 串:Char,attr,……,char,attr AL = 3 串:Char,attr,……,char,attr |
光标返回起始位置 光标跟随移动 光标返回起始位置 光标跟随串移动 |
AH=00H
AH=00/INT 10H 是用来设定显示模式的服务程序,AL 寄存器表示欲设定的模式:
AL | 文字/图形 | 分辨率 | 颜色 |
00 | 文字 | 40*25 | 2 |
01 | 文字 | 40*25 | 16 |
02 | 文字 | 80*25 | 2 |
03 | 文字 | 80*25 | 16 |
04 | 图形 | 320*200 | 2 |
05 | 图形 | 320*200 | 4 |
06 | 图形 | 640*200 | 2 |
AH=01H
您可以把光标想成一个小的矩形,平时这个矩形扁平位于某字底部,但藉由此功能可以改变其大小与位置。光标起始处与终止处分别由 CL 与 CH 的 0 到 4 位表示,参考下图:
而 CH 的第 7 位必须是 0,第 5、6 位表示光标属性:
位 6 位 5 属性
0 0 正常
0 1 隐形
1 0
1 1 闪烁缓慢
AH=02H
此功能是设定光标位置,位置用 DH、DL 表示,DH 表示列号,DL 表示行号。由左至右称之为『列』,屏幕最上面一列为第零列,紧靠第零列的下一列称为第一列……;由上而下称之为『行』,屏幕最左边一行称之为第零行,紧靠 第零行右边的一行为第一行。故最左边,最上面的位置为 DH=0 且 DL=0;最左边第二列,DH=1,DL=0。如果是文字模式时,BH 为欲改变光标位置的显示页,如果是图形模式,BH 要设为 0。
以行列来说明 DH、DL 之意义,小木偶常常搞混,底下以座标方式解释。在文字模式下,字符的位置类似数学直角座标系的座标,但是 Y 轴方向相反,Y 轴是以屏幕最上面为零,越下面越大,直到 24 为止,存于 DH 内。X 轴和直角座标系相同,越右边越大,存于 DL 内,其最大值视显示模式而变。
AH=03H
AH=03H/INT 10H 这个中断服务程序返回时,会在 DX 里面有光标的行列位置,CX 内有光标的大小,DX、CX 之数值所代表的意义和 AH=02H/INT 10H、AH=01H/INT 10H 相同。
AH=04H
此功能是探测光笔之位置,似乎只有 CGA 卡有接上光笔??
AH=05H
这个功能是把指定的显示页显示于屏幕上,欲显示的显示页于 AL 寄存器中指定。此功能只能在文字模式下才能发生作用。
AH=06H/07H
这个服务程序的功用是把某一个设定好的矩形区域内的文字向上或向下移动。先说明向上移动,即调用 AH=06H/INT 10H。当此服务程序工作时,会使矩形区域的文字向上移动,而矩形区域底端移进空格列。向上移动的列数存入 AL 中 ( 如果 AL 为零,表示使矩形区域的所有列均向上移 ),底端移入空格列的属性存于 BH,矩形区域是藉由 CX、DX 来设定左上角与右上角的座标,左上角的行与列分别由 CL、CH 设定,右下角的行与列由 DL、DH 设定。
AH=07H/INT 10H 和 AH=06H/INT 10H 相似,只是卷动方像不同而已。
AH=08H
这个服务程序是用来取得光标所在位置的字符及属性,调用前,BH 表示欲读取之显示页,返回时,AL 为该位置之 ASCII 字符,AH 为其属性。有关属性的说明,请参考注一。
AH=09H
这个功能是在光标位置显示字符,所要显示字符的 ASCII 码存于 AL 寄存器,字符重复次数存于 CX 寄存器,显示页存于 BH 寄存器,属性存于 BL 寄存器,其属性使用与 AH=08/INT 10H 一样。
AH=0AH
这个功能和 AH=09H/INT 10H 一样,差别在 AH=0AH 只能写入一个字符,而且不能改变字符属性。
AH=0BH
这个服务程序是选择调色盘。显示模式 5 是 320*200 的图形模式,最多可以显示 4 种颜色,这四种颜色的意思是最多可以『同时』显示一种背景色及三种前景色,而这三种前景色有两种方式可供选择,因此事实上,在显示模式 5 有两种调色盘可供选择。就好像您去买 12 种颜色的水彩,但可在调色盘上以任意比例搭配出许多种颜色。
调色盘 0 的三色是绿、红、黄;调色盘 1 的三色是青、紫红、白。背景色有 16 六种可供选择,这 16 种就是注一的 16 色。调用此中断时,先决定要设定背景色抑或调色盘,
- 要设定背景色时,则使 BH 为 0,再使 BL 之数值为 0 到 0fh 之间表示注一的 16 色之一。
- 要设定调色盘时,则使 BH 为 1。再设定 BL 为零或一表示选择那一种调色盘。
背景色只有在前景色为 0 时才会显现出来。
AH=0CH
AH=0Ch/INT 10H 是在绘图模式中显示一点 ( 也就是写入点像,write graphics pixel ),而 AH=0DH/INT 10H 则是读取点像 ( read graphics pixel )。
写入时,要写入位置 X 座标存于 CX 寄存器,Y 座标存于 DX 寄存器,颜色存于 AL 寄存器。和文字模式相同,萤光幕上的 Y 座标是最上面一列为零,越下面越大,X 座标则和数学的定义相同。CX、DX、AL 值之范围与显示模式有关:
显示模式 | X 座标 | Y 座标 | 颜色 |
4 | 0~319 | 0~199 | 0、1 |
5 | 0~319 | 0~199 | 0~3 |
6 | 0~639 | 0~199 | 0、1 |
AH=0DH/INT 10H 则是读取某一位置之点像,您必须指定 CX、DX,而 INT 10H 会传回该位置点像之颜色。
AH=0EH
这个子程序是使显示器像打字机一样的显示字符来,在前面用 AH=09H/INT 10H 和 AH=0AH/INT 10H 都可以在萤光幕上显示字符,但是这两奘方式显示字符之后,光标位置并不移动,而 AH=0EH/INT 10H 则会使光标位置移动,每显示一个字符,光标会往右移一格,假如已经到最右边了,则光标会移到最左边并移到下一列,假如已经移到最下面一列的最右边,则屏幕 会向上卷动。
AL 寄存器存要显示的字符,BH 为目前的显示页,如果是在图形模式,则 BH 须设为 0,假如是在图形模式下,也可以设定 BL 来表示文字的颜色,文字模式下的 BL 则无功能。
AH=0FH
这个服务程序是得到目前的显示模式,调用前只需使 AH 设为 0fh,当由 INT 10H 返回时,显示模式存于 AL 寄存器 ( 参考 AH=00H/INT 10H 的显示模式表 ),目前的显示页存于 BH 寄存器,总字符行数存于 AH 寄存器。
注一: 所谓属性是指字符的颜色、背景颜色、是否闪烁、有没有底线等性质。在彩色显示卡 ( CGA/EGA/VGA 等 ) 的文字模式中,颜色是用 4 个位表示,故可以表现出 16 种颜色,如下表:
二进制数 | 颜色 | 例子 | 二进制数 | 颜色 | 例子 |
0000 | 黑色 | black | 1000 | 灰色 | gray |
0001 | 蓝色 | blue | 1001 | 淡蓝色 | light blue |
0010 | 绿色 | green | 1010 | 淡绿色 | light green |
0011 | 青色 | cyan | 1000 | 淡青色 | light cyan |
0100 | 红色 | red | 1100 | 淡红色 | light red |
0101 | 紫红色 | magenta | 1101 | 淡紫红色 | light magenta |
0110 | 棕色 | brown | 1110 | 黄色 | yellow |
0111 | 银色 | light gray | 1111 | 白色 | white |
在彩色显示器里,如 CGA、EGA、VGA 等,常用一个字节 ( 8 个位 ) 来表示文字颜色和背景颜色,通常以第 0~3 位表示文字本身颜色;第 4~6 位表示背景颜色,背景颜色只有上表左栏的 8 种而已;第 7 个位,表示是否闪烁,0 表示不闪烁,1 表示闪烁。
但是在单色显示器里,如 MDA 和 Hercules 卡中,这些颜色表并无意义,所以属性解释方式不同,请看下表:
数值 | 属性 |
00H | 空格,不显示任何数据 |
77H | 显示白色方块 |
07H | 正常的黑底白字 |
70H | 反白的白底黑字 |
01H | 加底线 |
汇编 int10h(转)的更多相关文章
- u-boot源码汇编段简要分析
Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ...
- GCC 预处理、编译、汇编、链接..
1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...
- 从linux0.11中起动部分代码看汇编调用c语言函数
上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...
- C内嵌汇编-格式
C内嵌汇编-格式: __asm__(汇编语句部分:输出部分:输入部分破坏描述部分);C内嵌汇编以关键字"__asm__"或"asm"开始, 下辖四个部分, 各部 ...
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
- C程序汇编运行模式简析
SJTUBEAR 原创作品转载请注明出处 /<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 1. 汇编 ...
- 生成ARM汇编
使用ndk即可生成arm汇编 1.首先写好hello.c 2.编写makefile #ndk根目录 NDK_ROOT=E:\Android\android-ndk-r10b #编译器根目录 TOOLC ...
随机推荐
- CSS布局技巧 -- 纯CSS让子元素的宽度总和决定其父元素的宽度
使用场景 在移动端屏幕宽度有限的前提下,使用横向滚动的方式展示更多的内容.在这样的需求下,希望父元素作为容器,其宽度可以又横向排列资源的总宽度动态撑开,超过祖父元素的宽度:在不超过祖父元素时,自动继承 ...
- 【环境配置】php5.5 + apache2.4 安装配置【转+修改】
转自 http://my.oschina.net/lilinzero/blog/180509 [转+修改][环境配置]php5.5.10 + apache2.4 安装配置 根据自己的实践所得,稍微修改 ...
- dom4j使用xpath报异常 Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext
Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext ...
- while语句
<?php $num=10;//被除数 $cs=2; $str=""; while ($num !=0) { $ys=$num % $cs ...
- Java学习笔记 04 类和对象
一.类和对象的概念 类 >>具有相同属性和行为的一类实体 对象 >>实物存在的实体.通常会将对象划分为两个部分,即静态部分和动态部分.静态部分指的是不能动的部分,被称为属性,任 ...
- http协议性能相关的技术要点
1.http协议介绍 HTTP是一种请求/响应式的协议,基于TCP协议来进行数据传输. HTTPS是HTTP协议和安全套借口层(SSL)的结合,即安全增强版的HTTP. HTTP请求由三部分组成:请求 ...
- Android studio 多渠道打包
一般用渠道的统计无非是用友盟或者其它之类的,今天就以友盟的为例吧. 渠道信息一般在 AndroidManifest.xml中修改以下值: <meta-data android:name=&quo ...
- Matlab-Octave中绘制网格图和等高线:mesh 和 surf
x=linspace(-50, 50, 50); % 在x轴上取50点y=linspace(-25, 25, 25); % 在y轴上取25点[xx,yy]=meshgrid(x, y); % xx和y ...
- android开机过程简单描述
1 开机引导bootloader,相当于电脑开机启动bios 2 引导过后可以进入三种模式:fastboot, recovery, linux kernel.前两种跟版本升级相关,正常开机进入linu ...
- Java程序,取随机数的两种实现方法
1.随机数的第一种程序(取0-9的整型随机数) public class random_1 { public static void main(String[] args) { Random r=ne ...