我们通过int 15h得到了计算机内存信息。但是不知道你发现没有,我们所有中断的操作都是在实模式下进行的。我们在实模式下用int 15h得到内存信息,然后在保护模式下把它们显示出来。
------------------------------------------------------------
实模式下,通过线性地址直接访问内存,保存cs到内存中,实模式写入实模式读取
mov [LABEL_GO_BACK_TO_REAL+3], ax
LABEL_GO_BACK_TO_REAL:
jmp 0:LABEL_REAL_ENTRY ; 段地址会在程序开始处被设置成正确的值
------------------------------------------------------------
通过中断获取的内存分布信息,实模式写入,保护模式读取
_dwMemSize: dd 0
_MemChkBuf: times 256 db 0
dwMemSize equ _dwMemSize - $$
MemChkBuf equ _MemChkBuf - $$
在实模式下应使用_dwMemSize,而在保护模式下应使用dwMemSize。因为程序是在实模式下编译的,地址只适用于实模式,在保护模式下,数据的地址应该是其相对于段基址的偏移。
在写汇编程序的时候,要知道此时处于保护模式下,还是实模式下,才能知道使用哪个变量。