int 13H int 10H int 15H

一、int 13h中断

       int 13H int 10H int 15H_第1张图片  

       对于1.44MB的软盘来讲,总共有两面(磁头号0和1),每面有80个柱面(0-79),每个柱面有18个扇区。软盘的容量的由来:2×80×18×512=1.44MB,扇区号是这样分配的,0柱面,0磁头是第一个扇区,0柱面,1磁头是第二个扇区,1柱面,0磁头是第三个扇区,1柱面,1磁头是第四个扇区。

       int 13H int 10H int 15H_第2张图片


二、int 10H

       参考http://blog.csdn.net/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如下:

       int 13H int 10H int 15H_第3张图片

       ARDS之Type

       int 13H int 10H int 15H_第4张图片

       最后内存情况解释

       int 13H int 10H int 15H_第5张图片

      实际内存分配如下图:

       int 13H int 10H int 15H_第6张图片

       此图与上图遥相呼应。

你可能感兴趣的:(实模式,内中断)