【我所認知的BIOS】—>實模式&保護模式切换实例
LightSeed
2009-6-23
上一章從基礎概念上我談了談我的理解。素不知“紙上得來終覺淺,絕知此事要躬行”呀!不多說二話,我們來詳細剖析實模式和保護模式的相互切換。(我儘量解釋清楚每一句話,以下舉的例子是楊季文老師書里一個最簡單的例子)
Let us go!
1、這個例子中code做的事
下麵我們看到的這個code做了這樣的操作:
① 在實模式進入保護模式
② 在保護模式里把高端內存的value copy到低端內存中來(buffer中)
③ 返回到實模式
④ 在實模式下,顯示buffer中的內存數值。
對此需要說明的一點是這個例子是一個很簡單很簡單地實模式和保護模式的切換,中間很多東西都沒有考慮,不過拿來作為我們學習保護模式的入門我想到是再好不過了。
2、原程式加詳細註釋
;-------------这段代码copy form<80X86汇编语言程序设计教程>--------
;-------------只是一个最简单的实模式与保护模式的相互切换----------
;-------------切忌,本程序编译连接后生成的exe文件在纯DOS下--------
;-------------才能够执行LGDT这个命令,才能顺利进入保护模式--------
;-------------宏定义区域开始--------------------------------------
;16位偏移的段间直接转移指令的宏定义
JUMP macro selector,offsetv
db 0eah ;操作码 jmp
dw offsetv ;16位偏移
dw selector ;段值(real mode下)或者选择子(protect mode下)
endm
;字符显示宏指令的定义
ECHOCH macro ascii
mov ah, 2 ;选功能号
mov dl, ascii ;填将要显示的ASCII码给DL
int 21h ;调用DOS中断来显示ASCII码
endm
;-------------宏定义区域结束-------------------------------------
;-------------结构体定义区域开始---------------------------------
;存储段描述符结构类型的定义
DESCRIPTOR struc
Limitl dw 0 ;段界限(0~15)
Basel dw 0 ;段基地址(0~15)
Basem db 0 ;段基地址(16~23)
Attributes dw 0 ;段属性
Baseh db 0 ;段基地址(24~31)
DESCRIPTOR ENDS
;伪描述符结果类型的定义
PDESC struc
Limit dw 0 ;16界限
Base dd 0 ;基地址
PDESC ENDS
;-------------结构体定义区域结束---------------------------------
;常量定义
ATDW = 92H ;存在的可读写数据段属性值
ATCE = 98H ;存在的只执行代码段属性值
.386P