pmtest8.asm中对PagingDemo程序段的理解
; 测试分页机制 --------------------------------------------------------------
PagingDemo:
mov ax, cs
mov ds, ax
mov ax, SelectorFlatRW ;这应该是selectorFlatRW所对应的段描述符的首地址,参见pmtest7.asm
mov es, ax
push LenFoo ;0x0000001c sp:0x000001f7
push OffsetFoo ;0x000001a0 sp:0x000001f3
push ProcFoo ;ProcFoo equ 00401000h sp:0x000001ef
call MemCpy ;前面几个push是MemCpy的参数,sp:0x000001eb,call会由系统自动压入参数,sp要加4。这段call的功能是把程序拷贝到ProcFoo处
add esp, 12 ;esp:0x000001fb,见lib.inc ,168行.
push LenBar ;0x0000001e sp:0x000001f7
push OffsetBar ;0x000001bc
push ProcBar ;0x00501000
call MemCpy ;这段call的功能是把程序拷贝到ProcBar处
add esp, 12
push LenPagingDemoAll ;0x00000008
push OffsetPagingDemoProc ;0x00000198
push ProcPagingDemo ;0x00301000
call MemCpy ;这段call的功能是把程序拷贝到ProcPagingDemo处
add esp, 12
mov ax, SelectorData ;0x0030
mov ds, ax ; 数据段选择子
mov es, ax
call SetupPaging ; 启动分页
call SelectorFlatC:ProcPagingDemo ; ; call far 0010:00301000
;跳到PagingDemoProc处,
;执行mov eax, LinearAddrDemo ;LinearAddrDemo equ 00401000h ,ProcFoo equ 00401000h
;call eax ,执行foo函数
call PSwitch ; 切换页目录,改变地址映射关系
call SelectorFlatC:ProcPagingDemo ; call far 0010:00301000
;跳到PagingDemoProc处,
;执行mov eax, LinearAddrDemo ;LinearAddrDemo equ 00401000h ,ProcFoo equ 00401000h
;call eax ,执行bar函数
ret
补充:selectorRW和SelectorFlatC所指向都是同一个段,段基地址0,段界限为4G,只是属性不一样。其实段基址0不起作用,起作用的还是偏移量,偏移量就代表了地址。Call MemCpy需要数据的读写,所以用SelectorRW,Call SelectorFlatC:ProcPagingDemo是代码的执行,所以用SelctorFlatC。