一、int 13h中断
对于1.44MB的软盘来讲,总共有两面(磁头号0和1),每面有80个柱面(0-79),每个柱面有18个扇区。软盘的容量的由来:2×80×18×512=1.44MB,扇区号是这样分配的,0柱面,0磁头是第一个扇区,0柱面,1磁头是第二个扇区,1柱面,0磁头是第三个扇区,1柱面,1磁头是第四个扇区。
二、int 10H
参考http://blog.youkuaiyun.com/thimin/article/details/2313390。
AH
|
功 能
|
调用参数
|
返回参数 / 注释
|
1
|
置光标类型
|
(CH)0―3 = 光标开始行
(CL)0―3 = 光标结束行 | |
2
|
置光标位置
|
BH = 页号
DH = 行 DL = 列 | |
3
|
读光标位置
|
BH = 页号
|
CH = 光标开始行
CL = 光标结束行 DH = 行 DL = 列 |
4
|
置显示页
|
AL = 显示页号
| |
5
|
屏幕初始化或上卷
| ||
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 |
|
三、int 15H
eax int 15h可完成许多工作,主要由ax的值决定,我们想要获取内存信息,需要将ax复制为0E820h。
ebx 放置着“后续值”,第一次调用时ebx必须为0。
es:di 指向一个地址范围描述符结构ARDS(Address Range Descriptor Structure)
ecx es:di所指向的地址范围描述符结构的大小,以字节为单位。无论es:di所指向的结构如何设置,BIOS最多讲会填充ecx个字节。不过,通常情况下无论ecx为多大,BIOS只填充20字节,有些BIOS忽略ecx的值,总是填充20字节。
edx 0534D415h--BIOS将会使用此标志,对调用者将要请求的系统映像信息进行检验,这些信息会被BIOS放置到es:di所指向的结构中。
中断调用之后,结构存放于下列寄存器之中。
CF CF=0表示没有错误,否则存在错误。
eax 0534D415h
es:di 返回的地址范围描述符结构指针,和输入值相同。
ecx BIOS填充在地址范围描述符的字节数量,被BIOS所返回的最小值是20字节。
ebx 这里放置着为等到下一个地址描述符所需要的后续值,这个值的实际形势依赖于具体的BIOS的实现,调用者不必关心它的具体形式,只需在下次迭代时将其原封不动地放置到ebx中,就可以通过它获取下一个地址范围描述符。如果它的值为0,并且CF没有进位(表示没有错误),表示它是最后一个地址范围描述符。
代码如下:
mov ebx, 0 ; ebx = 后续值, 开始时需为 0
mov di, _MemChkBuf ; es:di 指向一个地址范围描述符结构(Address Range Descriptor Structure)
.MemChkLoop:
mov eax, 0E820h ; eax = 0000E820h
mov ecx, 20 ; ecx = 地址范围描述符结构的大小
mov edx, 0534D4150h ; edx = 'SMAP'
int 15h ; int 15h
jc .MemChkFail
add di, 20
inc dword [_dwMCRNumber] ; dwMCRNumber = ARDS 的个数
cmp ebx, 0
jne .MemChkLoop
jmp .MemChkOK
.MemChkFail:
mov dword [_dwMCRNumber], 0
.MemChkOK:
ARDS如下:
ARDS之Type
最后内存情况解释
实际内存分配如下图:
此图与上图遥相呼应。