¦b½Í¤F³\¦h¦b¯u¹ê¼Ò¦¡ ( real mode ) ¤Uªºµ{¦¡³]p¤§«á¡A¤p¤ì°¸¥´ºâ½Í½Í«OÅ@¼Ò¦¡ ( protected mode )¡C³o¨âºØ¼Ò¦¡ªº®t§O¦b©ó¥i¨Ï¥Îªº°O¾ÐÅé¦h¹è¡C¦b¥Á°ê 70 ¦~ ( ¤]´N¬O¦è¤¸ 1981 ¦~ ) ®É¡A¨Ï¥Î 8088 ¬° CPU ªº IBM PC è±À¥X®É¡A¥D¬y¹q¸£¤Wªº°O¾ÐÅé¦h¬° 64KB¡A¦Ó 8088 ¦³ 20 ±ø¦ì§}½u¡A¨C±ø¦ì§}½u¥i¥H¥H°ª¹qÀ£©Î§C¹qÀ£ªí¥Ü 0 ©Î 1¡A¦]¦¹¥u¯àªí¥Ü 220 Ó¦ì§}¡A¤]´N¬O»¡ 8088 ¯à¦s¨ú 1MB ¥H¤ºªº°O¾ÐÅé¡C¦b¨ºÓ®ÉÔ¡A³o¬O«Ü¤jªº°O¾ÐÅé¡A¦ý¬O«Ü§Ö´N¤£°÷¥Î¤F¡CÄ~°_ªº 80286 ¦³ 24 ±ø¦ì§}½u¡A¦]¦¹³Ì¦h¯à©w§} 224 Ó¤£¦P¦ì§}¡A¥ç§Y 16M Ӧ줸²Õ¡C80286 ¦³¨âºØ¤u§@¼Ò¦¡¡G¯u¹ê¼Ò¦¡»P«OÅ@¼Ò¦¡¡C³o¨âºØ¼Ò¦¡©w§}ªº¤è¦¡¤£¦P¡A©Ò¥H¯à¦s¨úªº°O¾ÐÅé¦h¹è¤]¤£¦P¡C¦b¯u¹ê¼Ò¦¡®É¡A80286 ¤´µM¥u¯à¦s¨ú 1MB ¥H¤ºªº°O¾ÐÅé¡A¦ý¬O³t«×¤ñ 8088 §Ö¦h¤F¡A³nÅé¤]¤£¶·×§ï´N¯àª½±µ°õ¦æ¡A¯à¹F¦¨»P 8088 ¦V¤U¬Û®eªº¥Øªº¡C¦pªG 80286 ¤Á´«¨ì«OÅ@¼Ò¦¡®É¡A´N¯à¦s¨ú³Ì¦h 16MB ªº°O¾ÐÅé¡CÁöµM 80286 ©w§}ªÅ¶¡¬O 8086/8088 ªº 16 ¿¡A¦ý¬O¤´µM¤£°÷¡C·Q·Q¡A¦p¤µ¤@º MP3 À£ÁYªººq¦±¡A´Nn¼ÆÓ MB ¤F¡C¨ì¤F¥Á°ê 74 ¦~ ( ¦è¤¸ 1985 ¦~ )¡A^¯Sº¸µo°â·s¤@¥Nªº CPU¡A80386¡A§â¦ì§}½uÂX¥R¬° 32 ±ø¡A¥i¥H¦s¨ú 232 Ӧ줸²Õ¡A¥ç§Y 4GB¡A¤j¬ù¨¬°÷À³¥I¤@¯ë»Ýn¤F¡A80386 ªº«OÅ@¼Ò¦¡¤]»P 80286 ªº«OÅ@¼Ò¦¡¤£¤Ó¬Û¦P¡A¥i¥H©w§}¨ì 4GB¡C¥H«á^¯Sº¸©Òµo°âªº CPU¡A¤@ª½¨ì Pentium 4 ªº³¡¥÷«¬¸¹¬°¤î¡A¨ä©w§}¤è¦¡³£»P 80386 ¬Û¦P¡A³o¨Ç CPU ¬[ºc¬Û¦ü¡A³QºÙ¬°¡u80x86¡v¡B¡ux86¡v©Î¡uIA32¡v( ¤£¹L IA32 ªº©R¦W·|¥X²{³Â·Ð¡A¦]¬°¥¦¤]¥]¬A 16 ¦ì¤¸ªº CPU )¡CµwÅé¡A½Ñ¦p CPU ¤w¶i¤J 32 ¦ì¤¸«OÅ@¼Ò¦¡®É¥N¡A¦Ó§@·~¨t²Î¶i¤J«OÅ@¼Ò¦¡¡A¤´¦³¤@¬q«Üªøªº¸ô¡C
¦b 80286 ¤w¸g´¶¤Îªº®ÉÔ ( ¥Á°ê 72 ¦~¥ª¥k )¡A±`¥Îªº§@·~¨t²Î¬O MS¡ÐDOS 3.x¡AMS¡ÐDOS 3.x ¬O¦b¯u¹ê¼Ò¦¡¤U°õ¦æªº¨t²Î¡A¨º®ÉÔªº°O¾ÐÅé¤]«Ü¶Q¡A¤j¬ù¨C MB n»ù¤@¸U¥x¹ô¡A¦A¥[¤W¨º®É§@·~¨t²Î¨Ã«D¹Ï§Î¬É±¡A¦Ó¬O¤å¦r¾É¦V¡A¦]¦¹¹ï°O¾ÐÅé»Ý¨D¤£¤j¡A©Ò¥H¦ü¥G¤£Ä±±o¨Ï¥Î¶W¹L 1MB ªº°O¾ÐÅ馳¢¤Áªº»Ýn¡C³oºØ±¡§Î¤@ª½¨ì¦è¤¸ 1990 ¦~¥Nªì´Á¡AWindows µ¥¹Ï§Î¬É±ªº§@·~¨t²Îµo®i«á¡A¤~³vº¥§ïÆ[¡C¨ì¤F¦è¤¸ 1995 ¦~¡A·L³nµo°â Windows 95 ¤§«á¡AWindows ¤~¯u¥¿¶i¤J«OÅ@¼Ò¦¡¡C
^¯Sº¸©Ò¥X«~ªº CPU ¥u¦³¦b 80286 ©Î§ó°ªµ¥¯Åªº CPU ¤~¦³«OÅ@¼Ò¦¡¡A¦ý¬O 80286 »P 80386 ªº«OÅ@¼Ò¦¡¤£¤Ó¬Û¦P¡A80286 «OÅ@¼Ò¦¡ªº°¾²¾¦ì§}¤´¨Ï¥Î 16 ¦ì¤¸¡A¦]¦¹¨CӰϬq¤´µM¦³ 64KB ªº¨î¡A³o·|¾ÉP³B²z¤j¶q¸ê®Æ®Éªº½ÆÂø©Ê¡A¦Ó 80386 «OÅ@¼Ò¦¡ªº°¾²¾¦ì§}±Ä¥Î 32 ¦ì¤¸¡A¦]¦¹´î§C¤F³oÓ¯ÊÂI¡C¦A¥[¤W²{¤µ¤j·§¨S¤H¤´µM¨Ï¥Î 80286 ¤F¡A©Ò¥H©³¤U¤¶²Ðªº¬O¥H 80386 «OÅ@¼Ò¦¡¬°¥D¡C¦b 80386 ¥H«áªº CPU¡A¦p 80486¡BPentium ª½¨ì²{¦b ( ¥Á°ê 102 ¦~¡A¦è¤¸ 2013 ¦~ )¡A«OÅ@¼Ò¦¡¤´µM¦s¦b¡A¥u¬O²{¦bªº§@·~¨t²Î¡A±q Windows 9x ¨ì Windows 7¡A³£¬O¤@¶}¾÷¡A´N¤Á´«¨ì«OÅ@¼Ò¦¡¡AÅý¨Ï¥ÎªÌ¹îı¤£¥X¨Ó¡C
¥Ñ¯u¹ê¼Ò¦¡¶i¤J«OÅ@¼Ò¦¡«á¡A°£¤F¥i¥H¨Ï¥Î¶W¹L 1MB °O¾ÐÅ餧¥~¡A«OÅ@¼Ò¦¡ÁÙ¹ï°O¾ÐÅé°µ¨ì¡u«OÅ@¡vªº³d¥ô¡C·N«ä¬O¦b«OÅ@¼Ò¦¡¤U¡Aµ{¦¡µLªk¥ô·N¦s¨ú¨ä¥L°Ï¬qªº¸ê®Æ¡A©Ò¥H¦UÓµ{¦¡¤§¶¡¤£·|¤¬¬Û¤zÂZ©Î¯}Ãa¡C¦pªG¦³¤@Ó³]p¤£¦nªºµ{¦¡¶i¤JµL½a°j°é¡A¨Ï¥ÎªÌ¥u»Ý§â³oÓµ{¦¡Ãö³¬§Y¥i¡A¤£·|¼vÅT¨ä¥Lµ{¦¡¡A¤]¤£»Ýn¦]³oÓµ{¦¡·í±¼¦Ó«·s±Ò°Ê¹q¸£¡C
¤p¤ì°¸±N¦b¤U±´X³¹ùØ¡A¤¶²Ð«OÅ@¼Ò¦¡¡C¤p¤ì°¸¥ý¹ê§@¤@Ó¯u¹ê¼Ò¦¡¤Á´«¨ì«OÅ@¼Ò¦¡ªºµ{¦¡¬°¨Ò¤l¡C©³¤Uªºµ{¦¡½X¬O¥Ñ¯u¹ê¼Ò¦¡¤Á´«¨ì«OÅ@¼Ò¦¡¡G
.386P ;001
desc STRUC
limit_l DW 0 ;°Ï¬qÃä¬É(BIT0-15)
base_l DW 0 ;°Ï¬q¦ì§}(BIT0-15)
base_m DB 0 ;°Ï¬q¦ì§}(BIT16-23)
attributes DB 0 ;°Ï¬qÄÝ©Ê
limit_h DB 0 ;°Ï¬qÃä¬É(BIT16-19)(§t°Ï¬qÄݩʪº°ª4¦ì)
base_h DB 0 ;°Ï¬q¦ì§}(BIT24-31)
desc ENDS 0 ;10
pdesc STRUC
limit DW 0 ;¥þ°ì´yz¾¹ªí®æ¤j¤p
base DD 0 ;32¦ì¤¸°ò©³¦ì§}
pdesc ENDS
jmp2pm MACRO s,o
DB 66h,0eah;¾Þ§@½X
DW o,0 ;32¦ì¤¸°¾²¾¦ì§}
DW s ;°Ï¬qȩΰϬq¿ï¾Ü¤l
ENDM ;021
;*******************************************************************************
code SEGMENT USE16
ASSUME cs:code,ds:code
ORG 100h
;-------------------------------------------------------------------------------
start: jmp SHORT begin
ALIGN 8
gdt LABEL BYTE ;030 ;¥þ°ì´yz¾¹ªí®æ
dummy desc <0,0,0,0,0,0> ;ªÅ´yz¾¹
pm_code desc <pm_c_len-1,0,0,98h,0,0> ;µ{¦¡½X°Ï¬q´yz¾¹
pm_vedio desc <0ffffh,8000h,0bh,92h,0,0> ;Åã¥Ü°O¾ÐÅé°Ï¬q´yz¾¹
pm_data desc <pm_d_len-1,0,0,92h,0,0> ;¸ê®Æ°Ï¬q´yz¾¹
gdt_len = $-gdt ;¥þ°ì´yz¾¹ªí®æªº¤j¤p
gdt_ptr pdesc <gdt_len-1,0> ;¥þ°ì´yz¾¹ªí®æ¸ê®Æ
code_selector = pm_code-gdt ;µ{¦¡½X°Ï¬q¿ï¾Ü¾¹
video_selector = pm_vedio-gdt ;Åã¥Ü°O¾ÐÅé°Ï¬q¿ï¾Ü¾¹
data_selector = pm_data-gdt ;¸ê®Æ°Ï¬q¿ï¾Ü¾¹
;------------------------------------040----------------------------------------
begin: sub eax,eax ;041
;³]¸mµ{¦¡½X°Ï¬q´yz¾¹
mov ebx,eax
mov ax,cs
mov bx,OFFSET pm
shl eax,4
add eax,ebx ;µ{¦¡½X°Ï¬q°¾²¾¦ì§}¬° 0
mov pm_code.base_l,ax
shr eax,10h
mov pm_code.base_m,al ;050
mov pm_code.base_h,ah
;³]¸m¸ê®Æ°Ï¬q´yz¾¹
sub eax,eax
mov ebx,eax
mov ax,cs
mov bx,OFFSET pm_data_seg
shl eax,4
add eax,ebx
mov pm_data.base_l,ax ;060
shr eax,10h
mov pm_data.base_m,al
mov pm_data.base_h,ah
;¶ñ¤J¥¿½Tªº¼ÆÈ¨ì gdt_ptr ùØ
sub eax,eax
mov ebx,eax
mov ax,cs
mov bx,OFFSET gdt
shl eax,4 ;070
add eax,ebx ;pºâ GDT ¦ì§}¡A¦s©óEAX
mov gdt_ptr.base,eax ;EAX¡×CS¡Ñ4¡Ï(OFFSET gdt)
;¸ü¤J GDT
lgdt QWORD PTR gdt_ptr ;Y¥Î MASM 6.x ²ÕĶ¡A§ï¥Î¡ulgdt gdt_ptr¡v
;Ãö¤¤Â_
cli
;¶}±Ò A20 ¦a§}½u
in al,92h ;080
or al,00000010b
out 92h,al
;·Ç³Æ¤Á´«¨ì«OÅ@¼Ò¦¡
mov eax,cr0
or eax,1
mov cr0,eax
;¯u¥¿¶i¤J«OÅ@¼Ò¦¡
jmp2pm code_selector,0 ;090
;¥H¤U¨ì pm_len ¬O¦b«OÅ@¼Ò¦¡¤¤°õ¦æªºµ{¦¡½X°Ï¬q
pm: mov cx,video_selector
mov es,cx
mov cx,data_selector
mov ds,cx
mov esi,OFFSET string-OFFSET pm_data_seg
mov edi,(80*10+0)*2 ;¿Ã¹õ²Ä 10 ¦C¡A²Ä 0 ¦æ¡C
mov ah,0eh ;¶Â©³¶À¦r
next: lodsb ;100
cmp al,0
jz exit
stosw
jmp next
exit: jmp $ ;¨ì¦¹°±¤î
pm_c_len EQU $-pm
;«OÅ@¼Ò¦¡¤¤ªºµ{¦¡½X°Ï¬qµ²§ô
;¥H¤U¨ì pm_d_len ¬O¦b«OÅ@¼Ò¦¡¤¤ªº¸ê®Æ°Ï¬q
pm_data_seg: ;110
string DB 'In protected mode.',0
pm_d_len EQU $-OFFSET pm_data_seg
;«OÅ@¼Ò¦¡¤¤ªº¸ê®Æ°Ï¬qµ²§ô
;-------------------------------------------------------------------------------
code ENDS
;*******************************************************************************
END start
§Q¥Î¤å®Ñ³B²z³nÅé¡A¿é¤J¤Wzì©l½X«á¡A¦s¦¨ PM1.ASM ÀÉ¡AµM«á¶}±Ò Virtual PC ( °Ñ¦Òªþ¿ý¤Q¤@ )¡A¨Ì·Ó¤U±ºñ¦â®Ø®Øªº«ü¥O²ÕĶ¡B³sµ²¡A§O§Ñ¤F¨C¦æ¿é¤J«ü¥O«án«ö¡uEnter¡vÁä¡G

²ÕĶ¡B³sµ²¦¨¥\«á¡A¿é¤Jµµ¦â®Ø®Øªº¡upm1¡v¡A°õ¦æ PM1.COM «á¡A·|¬Ý¨£¦b¿Ã¹õ²Ä 10 ¦C¡A¦L¥X¤@¦æ¶À¦âªº¦r¦ê¡uIn protect mode.¡v( ¬õ¦â®Ø®Ø¤º ) «á¡A´N·í¾÷¤F¡A³o¬O¦]¬°¦b²Ä 106 ¦æªºµ{¦¡½X¸õ¶i¤FµL½a°j°é¤¤¡A¬G¦Ó·í¾÷¡F¤£¹L§Ú̪ºµ{¦¡½T¹ê¬O¶i¤J¤F«OÅ@¼Ò¦¡¡C©³¤U§ÚÌ¨Ó¬Ý¬Ý PM1.ASM ªºì©l½X¡C
PM1.ASM ªº²Ä 3 ¦æ¨ì²Ä 21 ¦æ©w¸q¤F¨âÓµ²ºcÅé©M¤@Ó¥¨¶°¡A¨ä¤¤¤@Óµ²ºcÅéºÙ¬° desc¡A¥¦¬O¥Ñ 8 Ӧ줸²Õ©Ò²Õ¦¨ªº¡A¥¦¤]¬O«OÅ@¼Ò¦¡ªº¥D¨¤¡A³oÓµ²ºcÅ馳ӯS§Oªº¦W¦r¡AºÙ¬°¡u°Ï¬q´yz¾¹¡v( segment descriptor¡A©Î²ºÙ´yz¾¹¡A¤j³°ºÙ¬°´yz²Å )¡C²Ä 30 ¦æ¨ì 35 ¦æ¡A¨Ì¾Ú°Ï¬q´yz¾¹¡Adesc¡Aµ²ºcÅé©w¸q¤F¥|µ§¸ê®Æ¡A³oÓ¥|µ§¸ê®Æ¦n¤ñ¬O¤@±iªí®æ¡A±z¤]¥i¥H·Q¦¨¬O¤@Ó°}¦C¡A³o±iªí®æºÙ¬°¡u°Ï¬q´yz¾¹ªí®æ¡v( segment descriptor table¡A©Î²ºÙ´yz¾¹ªí®æ¡A¤j³°ºÙ¬°´yz²Åªí®æ )¡C¨ì¦¹¬°¤î¡A§ÚÌ¥i¥HÁA¸Ñ¡A°Ï¬q´yzªí®æ¬O¥Ñ¤@Ó¤@Óªº°Ï¬q´yz¾¹©Òºc¦¨¡A¨CӰϬq´yz¾¹¤S¥Ñ 8 Ӧ줸²Õ©Ò²Õ¦¨¡C
¡u°Ï¬q´yz¾¹¡v¡AÅU¦W«ä¸q¡A´N¬O¥Î¨Ó´yz«OÅ@¼Ò¦¡¤§¤Uªº°Ï¬q¡A¤£¹L¡A¦b«OÅ@¼Ò¦¡¤U©M¯u¹ê¼Ò¦¡¤U¡A°Ï¬qªº·N¸q¬O¤£¦Pªº¡AÁöµM¨âªÌ³£ºÙ¬°¡usegment¡v( ¤¤¤å¤]³£ºÙ¬°¡u°Ï¬q¡v¡A¤]¦³¤HºÙ¬°¡u¸`°Ï¡v©Î¡u¸`¡v)¡C¦b¯u¹ê¼Ò¦¡¤U¡A¨CӰϬq³Ì¤j¥u¯à¦³ 64K ¦ì¤¸²Õ¡F¦Óµ{¦¡¥i¥HŪ¨ú¥ô·N°Ï¬qªº¸ê®Æ¡A¤]¯à§â¥ô·N¸ê®Æ¼g¤J¥ô·N°Ï¬q¤¤¡F¦¹¥~¡A¦ì§}ªºªí¥Ü¤è¦¡¬O¥H¡u°Ï¬q:°¾²¾¦ì§}¡vªí¥Ü¡A¦pªG±z·QÀò±o¹êÅé¦ì§} ( physical address )¡A¥u»Ý¨Ì·Ó¤U±ªº¤½¦¡¡G
¹êÅé¦ì§}¡×°Ï¬q¡Ñ16¡Ï°¾²¾¦ì§}
´N¥i¥H±o¨ì¡C( ¹ï 32 ¦ì¤¸ªº CPU ¦Ó¨¥¡A¹q¸£¥D¾÷ªO¤W©Ò²Õ¦¨°O¾ÐÅé´¹¤ùùØ¡A¦³³\³\¦h¦hªº°O¾ÐÅéªÅ¶¡¡A¨CӪŶ¡³Qµe¤À¬°¤@Ӧ줸²Õªº¤j¤p¡A¥Ñ 0 ¶}©l½s¸¹¤@ª½¨ì 4G ¬°¤î¡A¨CӼи¹¥Nªí¤@Ӧ줸²Õ¡A³oÓ½s¸¹´N¥s¹êÅé¦ì§}©Îµ´¹ï¦ì§} )
¦b«OÅ@¼Ò¦¡¤U¡A¨CӰϬq³Ì¤j¥i¥H¦³ 4G ¦ì¤¸²Õ¡A·íµM¤]¥i¥H¤p©ó 4G ¦ì¤¸²Õ¡A¨Ã¥Bµ{¦¡µLªk¥ô·NŪ¨ú©Î¼g¤J¨ä¥L°Ï¬q¡A¬°¤F¹F¨ì³o¨Çn¨D¡AÅãµM¥²¶·n¦³¤@¶ô°O¾ÐÅé°O¸üµÛ¨CӰϬqªº¸ê®Æ¡A³o¨Ç¸ê®Æ¥]§t°Ï¬q°_©l¦ì§}¡B°Ï¬q¤j¤p¡B¥i¥HŪ¨ú©Î¼g¤JªºÄݩʵ¥µ¥¡A³o¼Ëªº¤@¶ô°O¾ÐÅé´N¬O«e±©Ò»¡ªº¡u°Ï¬q´yz¾¹¡v¡A§Ṳ́S§â©Ò¦³ªº°Ï¬q´yz¾¹³£¶°¤¤°_¨Ó¡A§Î¦¨¤@Óªí®æ¡A´N¬O¡u°Ï¬q´yz¾¹ªí®æ¡v¡C§ÚÌ¥ý¨Ó¬Ý¬Ý¡u°Ï¬q´yz¾¹¡v¡C¡u°Ï¬q´yz¾¹¡v¬O¥Ñ³sÄòªº 8 Ӧ줸²Õ ( ¥ç§Y 64 ¦ì¤¸ ) ²Õ¦¨ªº°O¾ÐÅé¡A¨ä¤º®e¦p¤U¡G

¤W¹Ï©Ò¼Ð¥Üªº 0¡ã15 ¦ì¤¸©M 48¡ã51 ¦ì¤¸¡A¦@ 20 Ӧ줸 ( ²HÂŦⳡ¥÷ ) ªí©ú¤F°Ï¬qªºÃä¬É ( limit )¡C¦]¬°¥ô¦ó°Ï¬qªº¶}©l¦ì§}³£¬O¥Ñ½s¸¹ 0 ªº¦ì§}¶}©l¡A¨CӦ줸²Õ¨Ï¥Î¤@Ó½s¸¹¡AÃä¬Éªº·N«ä´N¬Oªí¥Ü³oӰϬq³Ì¦h¥i¥H¨Ï¥Î¨ì½s¸¹²Ä´XÓ¡A·N§Y¨ì³oӰϬqªº¡uÃä¬É¡v¤F¡C¨Ò¦p¡A¦³¤@ӰϬqªº°Ï¬q´yz¾¹ªºÃä¬É¬° 100¡A¨ºªí¥Ü³oӰϬq¥Ñ¦ì§} 0 ¶}©l¨ì 100¡A¦pªG§â¤@Ӧ줸²Õªº¼ÆÈ©ñ¨ì½s¸¹ 100 ªº¦ì§}¡A´N¨ì¹FÃä¬É¤F¡A¦ý¤£¯à©ñ¨ì½s¸¹ 101 ªº¦ì§}¡A¬G³oӰϬq¤j¤p¬° 101 Ӧ줸²Õ¡C¤]´N¬O»¡¡AÃä¬É»P°Ï¬q¤j¤p¬Û®t¤@Ӧ줸²Õ¡A¦Óèè©Ò»¡±o¦ì§}½s¸¹¡A´N¥s°µ¡u°¾²¾¦ì§}¡v¡C
¦Ó²Ä 16¡ã39¡B56¡ã63 ¦ì¤¸¡A¦@ 32 ¦ì¤¸ ( ºñ¦â³¡¥÷ ) ªí©ú¤F°Ï¬qªº°ò©³¦ì§} ( base )¡A°ò©³¦ì§}´N¬O°Ï¬q¥Ñ¹êÅé¦ì§}ªºþ¤@Ó¦a¤è¶}©l¡C¨Ò¦p¡A¦pªG°ò©³¦ì§}¬O 30000H¡A¨º»òªí¥Ü³oӰϬq¬O¥Ñ¹êÅé¦ì§} 30000H ¶}©l¡A¦Ó°Ï¬qªºÃä¬É´N¬O°Ï¬q¤j¤p´î¤@¡C±z¥i¯à·|ı±o©_©Ç¡A¬°¤°»ò¤£§â°Ï¬qªº°ò©³¦ì§}Â\¦b¤@¶ô¡A¦Ón¤À¶}©O¡H³o¨ä¹ê¬O¬°¤F»P 286 «OÅ@¼Ò¦¡¬Û®e©Ò±Ä¨úªº¤£±o¤w±¹¬I¡A¦]¦¹³y¦¨µ{¦¡ªº½ÆÂø©Ê¡A³½»Pºµ´x¤£¥iݱo¡A³o¤]¬O¨S¿ìªkªº¨Æ¡C²Ä 40¡ã47 ¦ì¤¸¡B²Ä 52¡ã55 ¦ì¤¸¡A¦@ 12 Ӧ줸¡A«h¬Oªí©ú¦¹°Ï¬qªºÄݩʡA°Ï¬qªºÄݩʸû¬°½ÆÂø¡Aµy«á¦A²Ó»¡¡C²{¦b§ÚÌ¥ý¨Ó¬Ý¬Ý°Ï¬q´yz¾¹ªº°ò©³¦ì§}¤Î¤j¤p¦p¦ó¨Ï¥Î¡C
¦b«OÅ@¼Ò¦¡¤¤¡A¹³ CS¡BDS¡BES µ¥°Ï¬q¼È¦s¾¹¬O¥Î¨Ó«ü¦V¡u°Ï¬q´yz¾¹ªí®æ¡v¤¤ªº¬YÓ¡u°Ï¬q´yz¾¹¡v¡A©Ò¥H¤]¥i¥H»¡°Ï¬q¼È¦s¾¹¬O¬YÓ¡u°Ï¬q´yz¾¹¡vªº«ü¼Ð©Î¯Á¤Þ¡C¨Ò¦p¡A¦b«OÅ@¼Ò¦¡¤¤¡ACS ¼È¦s¾¹´NÀ³¸Ó«ü¦Vµ{¦¡½X°Ï¬qªº¡u°Ï¬q´yz¾¹¡v¡A¦Ó³oÓµ{¦¡½X°Ï¬qªº¡u°Ï¬q´yz¾¹¡v¤º°ò©³¦ì§}´N¬Oµ{¦¡½X°Ï¬qªº°_©l¦ì§}¡A¦Ó¦¹¡u°Ï¬q´yz¾¹¡v¤ºªºÃä¬É´N¬Oµ{¦¡½X°Ï¬qªº¤j¤p´î¤@¡C¥Ñ PM1.ASM ªº²Ä 31¡ã34 ¦æ¬Ý¨Ó¡A±oª¾ PM1 ¶i¤J«OÅ@¼Ò¦¡«á¦³¥|ӰϬq´yz¾¹¡Adummy¡Bpm_code¡Bpm_vedio¡Bpm_data¡A¤À§O¬OªÅªº°Ï¬q´yz¾¹¡Bµ{¦¡½X°Ï¬q´yz¾¹¡BÅã¥Ü°O¾ÐÅé°Ï¬q´yz¾¹¡B¸ê®Æ°Ï¬q´yz¾¹¡C³o¥|ӰϬq´yz¾¹¶°¤¤°_¨Ó¡A´N§Î¦¨¤@Ó¡u°Ï¬q´yz¾¹ªí®æ¡v¡C¦b¶i¤J«OÅ@¼Ò¦¡¤§«e¡An¥ý§â³o¥|Ó¡u°Ï¬q´yz¾¹¡vªº©Ò¦³¸ê®Æ³£³]¦n¡CªÅªº°Ï¬q¤ñ¸û¯S§O¡A¥H«á¦A»¡¡A¤Ï¥¿¤j³¡¤À±¡§Î¤U¡A¡u°Ï¬q´yz¾¹ªí®æ¡vùتº²Ä¤@Ó¡u°Ï¬q´yz¾¹¡v¬°ªÅªº°Ï¬q´yz¾¹¡CPM1.ASM ùتº²Ä¤GӰϬq´yz¾¹¬O pm_code¡A¬Ý¥¦ªº¦W¦r¡A´Nª¾¹D¥¦¬O«OÅ@¼Ò¦¡¤Uµ{¦¡½X°Ï¬qªº¡u°Ï¬q´yz¾¹¡v¡CPM1 ¦b«OÅ@¼Ò¦¡°õ¦æ®É¡A¥u§â¡uIn protect mode.¡v¦r¦ê¦L¦b¿Ã¹õ¤W¡A¨äì©l½X¦ì©ó²Ä 92¡ã108 ¦æ¡A¦p¤U±©Ò¥Ü¡G
;¥H¤U¨ì pm_len ¬O¦b«OÅ@¼Ò¦¡¤¤°õ¦æªºµ{¦¡½X°Ï¬q
pm: mov cx,video_selector
mov es,cx
mov cx,data_selector
mov ds,cx
mov esi,OFFSET string-OFFSET pm_data_seg
mov edi,(80*10+0)*2 ;¿Ã¹õ²Ä 10 ¦C¡A²Ä 0 ¦æ¡C
mov ah,0eh ;¶Â©³¶À¦r
next: lodsb ;100
cmp al,0
jz exit
stosw
jmp next
exit: jmp $ ;¨ì¦¹°±¤î
pm_c_len EQU $-pm
;«OÅ@¼Ò¦¡¤¤ªºµ{¦¡½X°Ï¬qµ²§ô
ÁöµMµ{¦¡½X°Ï¬q¶Èµuµu¤Q´X¦æ¡A©Ò¦û¦ì¤¸²Õ¤]¤£¤j¡A¦ý¬O¤´¬O¤@ӰϬq¡An¬°¥¦·Ç³Æ¤@ӰϬq´yz¾¹¡C©Ò¥H¦b pm_code ´yz¾¹¤ºªº°ò©³¦ì§}»Ý¶ñ¤J pm: ¼Ð¸¹ªº¹êÅé¦ì§}¡A¨ä¹êÅé¦ì§}¥i¥H¥Ñ¡u°Ï¬q:°¾²¾¦ì§}¡v±o¨ì¡C¦]¬°¦b¶i¤J«OÅ@¼Ò¦¡¤§«e¡ACPU ¤´³B©ó¯u¹ê¼Ò¦¡¡A©Ò¥H¹êÅé¦ì§}´N¬O¡u°Ï¬q¡Ñ16¡Ï°¾²¾¦ì§}¡v¡Aì©l½Xªº²Ä 41¡ã51 ¦æ ( ¤U±ªºµ{¦¡½X ) ´N¬Opºâ¹êÅé¦ì§}¡A¤Î§â¹êÅé¦ì§}¶ñ¤Jµ{¦¡½X°Ï¬q´yz¾¹ªº¹Lµ{¡G
begin: sub eax,eax ;041
;³]¸mµ{¦¡½X°Ï¬q´yz¾¹
mov ebx,eax
mov ax,cs
mov bx,OFFSET pm
shl eax,4
add eax,ebx ;µ{¦¡½X°Ï¬q°¾²¾¦ì§}¬° 0
mov pm_code.base_l,ax
shr eax,10h
mov pm_code.base_m,al ;050
mov pm_code.base_h,ah
¦Ü©óµ{¦¡½X°Ï¬qªºªø«×«h¦b²Ä 107 ¦æ¡A¥Ñ²Õ;¹pºâ¥X¨Ó¡A¨Ã©ó²Ä 32 ¦æª½±µ¶ñ¤J¡G
pm_code desc <pm_c_len-1,0,0,98h,0,0> ;µ{¦¡½X°Ï¬q´yz¾¹
²Ä¤TӰϬq´yz¾¹¬O¥Î¨Ó«ü¦VÅã¥Ü°O¾ÐÅ骺°Ï¬q¡A³o¬O¬°¤F¦b¶i¤J«OÅ@¼Ò¦¡«á¡Aª½±µ§â¦r¦ê¶ñ¤JÅã¥Ü°O¾ÐÅ餺¡A´N¥i¥H§â¦r¦êÅã¥Ü¦b¿Ã¹õ¤W¤F¡CÅã¥Ü°O¾ÐÅé¬O¦b 0B8000H ªº¦a¤è¡A¤j¤p¬O 64K ¦ì¤¸²Õ¡A¦]¦¹§Ú̦bµ{¦¡½X²Ä 33 ¦æª½±µ©w¸q¡G
pm_vedio desc <0ffffh,8000h,0bh,92h,0,0> ;Åã¥Ü°O¾ÐÅé°Ï¬q´yz¾¹
²Ä¥|ӰϬq´yz¾¹¬O¥Î¨Ó«ü¦V¸ê®Æ°Ï¬qªº¡A¨ä¹êÅé¦ì§}ªºpºâ¤è¦¡©Mµ{¦¡½X°Ï¬qpºâ¤è¦¡¬Û¦P¡C¤p¤ì°¸´N¤£¦AÂØz¡A½Ð¦Û¦æ°Ñ¦Òì©l½X¡C
¶i¤J«OÅ@¼Ò¦¡«á¡A§Ú̧â DS¡BES ¼È¦s¾¹¤À§O«ü¦V pm_data¡Bpm_vedio¡ACPU ´N¥i¥H§ä¨ì¬Û¹ïÀ³ªº°Ï¬q´yz¾¹¡C¦ý¬Oè¤~Á¿¹L¡ADS¡BES µ¥°Ï¬q¼È¦s¾¹¬O¤@Ó¯Á¤ÞÈ¡A¬O¬Û¹ï©ó°Ï¬q´yz¾¹ªí®æªº¯Á¤Þ¡C¤]´N¬O»¡¡ADS¡BES µ¥°Ï¬q¼È¦s¾¹¥²¶·¥H¬YÓ¦ì§}¬°°ò·Ç¡A¦Ó³oÓ¦ì§}´N¬O°Ï¬q´yz¾¹ªí®æªº¦ì§}¡C¨º»ò CPU ¤S¬O¦p¦ó±oª¾°Ï¬q´yz¾¹ªí®æªº¹êÅé¦ì§}©O¡Hµª®×´N¦b 80386 CPU ·s¼Wªº¤@ӼȦs¾¹¡AºÙ¬° GDTR ( global descriptor table register¡A¥þ°ì´yz¾¹ªí®æ¼È¦s¾¹ )¡C¨Æ¹ê¤W°Ï¬q´yz¾¹ªí®æ¤À¬°¦n´XºØ¡A¥þ°ì´yz¾¹ªí®æ¥u¬O¨ä¤¤ªº¤@ºØ¡A¨ä¥LÁÙ¦³¦n´XºØ¡A¦ý¬O¥H«á¦A²Ó»¡§a¡CGDTR ±Mªù¥Î¨Ó°O¿ý¥þ°ì´yz¾¹ªí®æ©Ò¦b¦ì§}¡A¸ü¤J¦¹¦ì§}¨ì GDTR ¼È¦s¾¹ªº¤èªk¬O¥Î·sªº 80386 «ü¥O¡ALGDT¡C
LGDT «ü¥O¬O 80286 ¥H¤W¤~¦³ªº«ü¥O¡A¨ä¥\¯à¬O§â°O¾ÐÅ餺ªº¥þ°ì´yz¾¹ªí®æªº¸ê®Æ¸ü¤J¨ì GDTR ¼È¦s¾¹ùØ¡C¥þ°ì´yz¾¹ªí®æªº¸ê®Æ¬O¤@Ó 6 ¦ì¤¸²Õªøªºµ²ºcÅé¡APM1.ASM ©R¦W¬° pdesc¡A·íµM±z¥i¥H¨Ì³ß·R¦Û¦æ©R¦W¡A¨ÃµLµw©Ê³W©w¡C¦¹µ²ºcÅ馳¨âÓÄæ¦ì¡G²Ä¤@ÓÄæ¦ìªø¤@Ó¦r²Õ¡A¬O¥þ°ì´yz¾¹ªí®æªº¤j¤p¡A¥H¦ì¤¸²Õ¬°³æ¦ì¡F²Ä¤GÓÄæ¦ìªø¤@ÓÂù¦r²Õ¡A¬O¥þ°ì´yz¾¹ªí®æªº¦ì§}¡C¦p¤U¡G
pdesc STRUC limit DW 0 ;¥þ°ì´yz¾¹ªí®æ¤j¤p base DD 0 ;32¦ì¤¸°ò©³¦ì§} pdesc ENDS
LGDT »yªk¬°
LGDT ¡updesc ¦ì§}¡v
°²¦p±z¥Î MASM 5.x ²ÕĶ¡A¥²¶·¨Ï¥Î¡uLGDT QWORD PTR pdesc¦ì§}¡v¡A§_«h·|µo¥Íĵ§i¡A¦ý¬O¨ä¹ê¸ü¤J¨ì LGDT ªº¦ì¤¸²ÕÀ³¬° 6 Ӧ줸²Õ¡A³o¬O MASM 5.x ªº¿ù»~¡A¤£¹L¤£¼vÅTµ{¦¡¹ê»Ú¹B§@¡A°Ñ¦Ò·L³nªººô¶¡CMASM 6.x ¤w×¥¿³oÓ¿ù»~¡A¤£»Ýn«ü©w¦ì¤¸²Õªø«×¡C¦b¥H LGDT «ü¥O¸ü¤J pdesc ¤ºªº¸ê®Æ¨ì GDTR ¼È¦s¾¹«e¡A¤@¼Ën¥ý§â¥¿½Tªº¸ê®Æ¶ñ¤J pdesc µ²ºcÅé¡A¨äµ{¦¡½X¦b²Ä 65¡ã74 ¦æ¡A½Ð¦Û¦æ°Ñ¦Ò¡C
ÁöµMn¶i¤J«OÅ@¼Ò¦¡¤£¤@©wn¶}±Ò A20 ¦ì§}½u¡A¦ý¬OY¤£¶}±Ò¥¦¡A«hµLªkŪ¼g¶W¹L 1MB ¥H¤Wªº°O¾ÐÅé¡C¤°»ò¬O A20 ¦ì§}½u¡A¤S¬°¤°»òn¶}±Ò A20 ¦ì§}½u¤~¯àŪ¼g¶W¹L 1MB ¥H¤Wªº°O¾ÐÅé©O¡Hì¨Ó 8086/8088 ¥u¦³ 20 ±ø¦ì§}½u¡A±q½s¸¹ AD0¡ãAD7¡BA8¡ãA19¡A¥i¥H©w§} 220 ¦ì¤¸²Õ¡A¤]´N¬O 1MB¡A¦ý¬O 8086/8088 ªº¼È¦s¾¹¥u¦³ 16 ¦ì¤¸¡AµLªkªí¥Ü³o»ò¦hªº¦ì§}¡A¦]¦¹³]p 8086/8088 ªº¤uµ{®v·Q¨ì¤@Ó¤èªk¡A¥Î¨âÓ 16 ¦ì¤¸ªº¼È¦s¾¹¤À§O¥Nªí¡u°Ï¬q¡v¡B¡u°¾²¾¦ì§}¡v¡A¨Ã¥H¡u°Ï¬q:°¾²¾¦ì§}¡vªí¥Ü¡C¥Î³o¼Ëªºªí¥Ü¤è¦¡¡A¸Ñ¨M¤F¥H 16 ¦ì¤¸ªº¼È¦s¾¹ªí¥Ü 20 ¦ì¤¸ªº¦ì§}¡C¦ý¬O³o¼Ë°µ·|²£¥Í¤@Ó¤£¦X²zªº²{¶H¡A°²¦p¦³Ó«ü¥OŪ¨ú¦ì§}¡uFFFF:FFFF¡vªº¤º®e¡A¦ì§}¡uFFFF:FFFF¡v¨ä¹ê¬O¹êÅé¦ì§} 10FFEF¡A¤]´N¬O 1114095¡A¤w¸g¶W¹L 8086/8088 20 ®Ú¦ì§}½uªº©w§}½d³ò¤F¡A¤£¹L¡uFFFF:FFFF¡v«o²Å¦X¡u°Ï¬q:°¾²¾¦ì§}¡vªí¥Ü¦ì§}ªº³W«h¡C¤uµ{®v¤]«Ü§Öªº¸Ñ¨M¤F³oÓ°ÝÃD¡A¨º´N¬O¦s¨ú¶W¹L 1MB ªº¦ì§}®É¡ACPU ·|¦Û°Ê¥ý´î¥h 1MB¡C¤]´N¬O»¡¡A·í¦s¨úÃþ¦ü¡uFFFF:FFFF¡v³oºØ¦ì§}®É¡A¨ä¹ê¬O¦s¨ú¡u0000:FFEF¡v¦ì§}ªº¤º®e¡C³o´N¬O©Ò¿×ªº¦^¶ ( wrap-around )¡C
«á¨Óªº 80286 ¦@¦³ 24 ±ø¦ì§}½u¡A¥i©w§} 16MB¡A©Ò¥H¦s¨úÃþ¦ü¡uFFFF:FFFF¡v³oºØ¦ì§}®É¡A¦³¥i¯à¬O¯uªºn¦s¨ú¹êÅé¦ì§} 10FFEF ( «OÅ@¼Ò¦¡¤U )¡F¦ý¬O¤S§Æ±æ 80286 ¦b¯u¹ê¼Ò¦¡®É¯à¦V¤U¬Û®e¡C¬°¤F¸Ñ¨M³oÓ°ÝÃD¡A¤uµ{®v̤S·Q¥X¤@Ó¤èªk¡A¨º´N¬O¦b¯u¹ê¼Ò¦¡®É¡AA20 ¦ì§}½u¬O¬OÃö³¬ªº¡A¢¨Ï CPU µo¥Í¦^¶®ÄªG¡F·í¶i¤J«OÅ@¼Ò¦¡®É¡A¤~¶}±Ò A20 ¦ì§}½u¡A¥H«KŪ¨ú 1MB ¥H¤Wªº°O¾ÐÅé¡C( °Ñ¦Òµù¤@¥i¾\Ū§ó¦hªº¸ê®Æ )
¤@¯ë¶}±Ò A20 ¦ì§}½uªº¤èªk¬O§Q¥Î 92H °ð¡A92H °ð¦ì©ó«n¾ô´¹¤ù¤W¡A±N¨ä²Ä¤@Ӧ줸³]¬°¡u1¡v¡A´N¯à¶}±Ò A20 ¦ì§}½u¡FY³]¬°¡u0¡v¡A´N¯àÃö³¬¡Cµ{¦¡½X¦p¤U¡G
;¶}±Ò A20 ¦a§}½u
in al,92h ;080
or al,00000010b
out 92h,al
80286 ¤Î¨ä¸û°ª¯Åªº CPU¡A·s¼W¤F¤@¨Ç±±¨î¼È¦s¾¹¡GCR0¡BCR1 µ¥µ¥¡C¨ä¤¤ CR0 ¼È¦s¾¹ªº²Ä 0 ¦ì¤¸¥s°µ PE ¦ì¤¸¡A^¤åºÙ¬° protection enabled¡A·N§Y¡u«OÅ@¼Ò¦¡±Ò°Ê¡v¡C·í¦¹¦ì¤¸¬°¡u0¡v®É¡ACPU ³B©ó¯u¹ê¼Ò¦¡¡F·í¦¹¦ì¤¸¬°¡u1¡v®É¡ACPU ³B©ó«OÅ@¼Ò¦¡¡C
¦]¦¹¥un±N PE ¦ì¤¸Åܬ°¡u1¡v¡ACPU ´N³B©ó«OÅ@¼Ò¦¡¤F¡A³o¬qµ{¦¡½X¦b²Ä 84¡ã87 ¦æ¡A¦p¤U±µ{¦¡¤ù¬q¡C·íµM¦pªG¶È¶È§â³oӦ줸Åܦ¨¡u1¡v¡A¦Ó¨S¦³³]¸m¥¿½Tªº¡u°Ï¬q´yz¾¹ªí®æ¡v¡A©ÎªÌ°Ï¬q¼È¦s¾¹¨S¦³«ü¦V¥¿½Tªº¡u°Ï¬q´yz¾¹¡v¡A¨º»ò¹q¸£¬O·|·í¾÷ªº¡C©Ò¥H¥Ñ¯u¹ê¼Ò¦¡¤Á´«¨ì«OÅ@¼Ò¦¡¡A¤£¬O¶È¶È§â PE ¦ì¤¸Åܦ¨¡u1¡v´N¥i¥H¤F¡C
;·Ç³Æ¤Á´«¨ì«OÅ@¼Ò¦¡
mov eax,cr0
or eax,1
mov cr0,eax
¨ì¦¹¤w¬O¸U¨Æ¨ã³Æ¡A¥u¤íªF·¡A¶ZÂ÷¶i¤J«OÅ@¼Ò¦¡¶È¤@¨B¤§»»¡A°õ¦æµ{¦¡½Xªº²Ä 90 ¦æ´N¶i¤J«OÅ@¼Ò¦¡¤F¡Cµ{¦¡²Ä 90 ¦æ¡A¬O¤@Ó¥¨¶°«ü¥O¡Ajmp2pm¡C¥Ñ¯u¹ê¼Ò¦¡¶i¤J«OÅ@¼Ò¦¡¡A¤£¶È¶È DS¡BES µ¥°Ï¬q¼È¦s¾¹»Ý«ü¦V¬Û¹ïÀ³ªº°Ï¬q´yz¾¹¡ACS ¼È¦s¾¹¤]¬O¦p¦¹¡CDS¡BES µ¥¼È¦s¾¹¥i¥H¥Î MOV «ü¥O¡A§â¾A·íªº¼ÆÈ¸ü¤J¡F¦ý¬O CS µLªk³o¼Ë°µ¡A¥u¯à¥H JMP¡BJx¡BCALL¡BRET µ¥¸õÅD«ü¥O§ïÅܨäÈ¡C¦b¦¹³B¡A¤p¤ì°¸±Ä¥Î JMP «ü¥O¡A©Ò¥H¦¹³Bªº«ü¥O¬°¡ujmp code_selector:0¡v¡C¦ý¬O¡A¦¹³BÁÙ±Á{¤@Ó°ÝÃD¡C¦b«OÅ@¼Ò¦¡ùØ¡A°¾²¾¦ì§}¬O¥H 32 ¦ì¤¸ªí¥Ü¡A¦Ó¯u¹ê¼Ò¦¡ùØ«o¬O 16 ¦ì¤¸¡A¦]¦¹³oÓ¸õÅD«ü¥OÀ³¸Ó¬On¸õÅD¨ì°¾²¾¦ì§}¡u00000000¡v³B¡A¦Ó¤£¬O¡u0000¡v¡F¦Ó³oÓ«ü¥O¤S¥²¶·¦b 16 ¦ì¤¸ªº°Ï¬q¡Aµ¥°õ¦æ¸õÅD«á¡A¤~·|Åܦ¨ 32 ¦ì¤¸°Ï¬q¡C´«¥y¸Ü»¡¡A³oÓ¸õÅD«ü¥Oªºµ{¦¡½X¬OӫܯS§Oªºµ{¦¡½X¡A¥¦²V¦X¤F 16 ¦ì¤¸»P 32 ¦ì¤¸¡CMASM ¦ü¥G¬OµLªk²ÕĶ¡A©Ò¥H¤@¯ëªº°µªk¬Oª½±µ¶ñ¤W¾÷±ñ½X¡A´N¦p¦P¤U±¡A¥H¥¨¶°¤è¦¡¶ñ¤J¾÷±ñ½X¡G
jmp2pm MACRO s,o
DB 66h,0eah;¾Þ§@½X
DD o ;32¦ì¤¸°¾²¾¦ì§}
DW s ;°Ï¬qȩΰϬq¿ï¾Ü¤l
ENDM ;021
JMP ªº¾÷±ñ½X¬O 0EAH¡A¦pªG¯u¹ê¼Ò¦¡¤U¡An¥Î¨ì 32 ¦ì¤¸ªºµ{¦¡½X¡A«h»Ý¥[¤W 66H §@¬°«e¸m½X¡AÃö©ó«e¸m½X¡A¥i°Ñ¦Òµù¤@¡C¤S¦]¬°°¾²¾¦ì§}¬° 32 ¦ì¤¸¡A¬G¡uo¡vªº¸ê®Æ§ÎºA¬°Âù¦r²Õ¡A¥H¡uDD¡vªí¥Ü¡C³Ì°ª¦ì§}ªº¦r²Õ«h¬O°Ï¬q¿ï¾Ü¾¹¡A¡us¡v¡C
¦b«OÅ@¼Ò¦¡¤U¡A¦@¦³¤TӰϬq¡Gµ{¦¡½X°Ï¬q¡B¸ê®Æ°Ï¬q¡BÅã¥Ü°O¾ÐÅé°Ï¬q¡C³o¨Ç°Ï¬qªº¯u¥¿¦ì§}¨Ã¤£¬O CS¡BDS¡BES ¤§¼ÆÈ¡A¦Ó¬OÂǥѦ¹¼ÆÈ¬d¸ß¡u°Ï¬q´yz¾¹ªí®æ¡v¡C
©³¤U¥H DEBUG32 ¨ÓÆ[¹î³o¨Ç¦ì§}ªºÃö«Y¡C¥H DEBUG32 ¸ü¤J PM1.COM¡G
E:\HomePage\SOURCE\PM>h:debug32 pm1.com [Enter]
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994
CPU = ?86, Virtual 8086 Mode, Id/Step = 0F10, A20 enabled
-
²Ä¤@Ó«ü¥O¬O¸õÅD¡A¥H¯d¤U¤@¶ô°O¾ÐÅé·í§@¦s©ñ¸ê®Æ¤§¥Î¡A¥ý¬Ýµ{¦¡·|¸õÅD¦Ü¦ó³B¡A¦AÀˬdì¨Ó¸ê®Æ¦s¤Fþ¨Ç¡C
-u 100 101 [Enter] 291C:0100 EB2C JMP Short 012E -d 100 l40 [Enter] 291C:0100 EB 2C 90 90 90 90 90 90-00 00 00 00 00 00 00 00 k,.............. 291C:0110 23 00 00 00 00 98 00 00-FF FF 00 80 0B 92 00 00 #............... 291C:0120 12 00 00 00 00 92 00 00-1F 00 00 00 00 00 66 2B ..............f+ 291C:0130 C0 66 8B D8 8C C8 BB A4-01 66 C1 E0 04 66 03 C3 @f.X.H;$.fA`.f.C
±q 291C:0108 ³B¶}©l¨ì 291C:0127 ¬°¤î¡A´N¬O¡u°Ï¬q´yz¾¹ªí®æ¡v¡A¦Ó¤W±¬õ¦âªº³¡¥÷¬O¡uµ{¦¡½X°Ï¬q´yz¾¹¡v¡C¡u23 00¡v¨ä¹ê¬O 23H Ӧ줸²Õ¡A³o¬O¦]¬° x86 ¬[ºcªº¹q¸£¸ê®Æ¦w±Æ¤è¦¡¬O¡u¼Æ¦r¦ì¼Æ¤jªº¡A¦b°ª¦ì§}¡A±Æ¦b¥kÃä¡v¡A¹³³oºØ±Æ¦C¤è¦¡ºÙ¤§¬°¡uLittle-Endian¡v¡C¦ì§} 291C:0112¡ã291C:0114 ¬Oµ{¦¡½X°Ï¬qªº°ò©³¦ì§}¡A¤£¹LÁÙ¨S¦³³]©w¦n¥¿½Tªº¼ÆÈ¡A±µ¤U¨Ó¤@ª½¨ì 014E ªºµ{¦¡´N¬O¦b°µ³o¤@¥ó¨Æ¡C§ÚÌ¥ý¤U 4 Ó¡ut¡v«ü¥O°lÂܬݬݡC
-t [Enter] AX=0000 BX=0000 CX=00DB DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=291C ES=291C SS=291C CS=291C IP=012E NV UP DI PL NZ NA PO NC 291C:012E 662BC0 SUB EAX,EAX Trace Interrupt -t [Enter] AX=0000 BX=0000 CX=00DB DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=291C ES=291C SS=291C CS=291C IP=0131 NV UP DI PL ZR NA PE NC 291C:0131 668BD8 MOV EBX,EAX Trace Interrupt -t [Enter] AX=0000 BX=0000 CX=00DB DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=291C ES=291C SS=291C CS=291C IP=0134 NV UP DI PL ZR NA PE NC 291C:0134 8CC8 MOV AX,CS Trace Interrupt -t [Enter] AX=291C BX=0000 CX=00DB DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=291C ES=291C SS=291C CS=291C IP=0136 NV UP DI PL ZR NA PE NC 291C:0136 BBA401 MOV BX,01A4h Trace Interrupt
¨ì 0136 ¦ì§}®É¡A¹ï·Óì©l½X¡A±oª¾²¾¶i BX ªº¼ÆÈ´N¬O«OÅ@¼Ò¦¡µ{¦¡©Ò¦b¦ì§}¡A291C:01A4¡A¤]´N¬O¦bµ´¹ï¦ì§} 29364 ³B ( 291C¡Ñ10¡Ï1A4 )¡C±z¥i¦Û¦æ°lÂÜ¡A¬°¤F¸`¬Ù½g´T¡Aª½±µ°õ¦æ¨ì§â¥¿½Tªºµ´¹ï¦ì§}¶ñ¨ìµ{¦¡½X°Ï¬q´yz¾¹¤º¡A¦A¬Ý¬Ý°O¾ÐÅ餺®e¡A¦p¤U±²HÂŦ⪺¦a¤è¡C
-g 14e [Enter] AX=0002 BX=01A4 CX=00DB DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 DS=291C ES=291C SS=291C CS=291C IP=014E NV UP DI PL NZ AC PO CY 291C:014E 662BC0 SUB EAX,EAX Trace Interrupt -d 100 l40 [Enter] 291C:0100 EB 2C 90 90 90 90 90 90-00 00 00 00 00 00 00 00 k,.............. 291C:0110 23 00 64 93 02 98 00 00-FF FF 00 80 0B 92 00 00 #.d............. 291C:0120 12 00 00 00 00 92 00 00-1F 00 00 00 00 00 66 2B ..............f+ 291C:0130 C0 66 8B D8 8C C8 BB A4-01 66 C1 E0 04 66 03 C3 @f.X.H;$.fA`.f.C
¦A¨ìµ´¹ï¦ì§} 291C:01A4 ¤Ï²ÕĶ¬Ý¬Ý¡A¨Ã¹ï·Óì©l½X¡AªG¯u¬O«OÅ@¼Ò¦¡¤Uªºµ{¦¡¤ù¬q¡A¦¹¤ù¬q¥Ñµ´¹ï¦ì§} 291C:01A4 °_¨ì 291C:01C6¡A¦@ 36 Ӧ줸²Õ¡A©Ò¥H¬É¬° 23H¡A´N¬O¤W±¥Õ¦âªº³¡¥÷¡C
-u 1a4 1c6 [Enter] 291C:01A4 B91000 MOV CX,0010h 291C:01A7 8EC1 MOV ES,CX 291C:01A9 B91800 MOV CX,0018h 291C:01AC 8ED9 MOV DS,CX 291C:01AE 66BE00000000 MOV ESI,00000000h 291C:01B4 66BF40060000 MOV EDI,00000640h 291C:01BA B40E MOV AH,0Eh 291C:01BC AC LODSB 291C:01BD 3C00 CMP AL,00h 291C:01BF 0F840300 JZ 01C6 291C:01C3 AB STOSW 291C:01C4 EBF6 JMP Short 01BC 291C:01C6 EBFE JMP Short 01C6
¨Æ¹ê¤W¡A¦b 80386 ¯u¹ê¼Ò¦¡©Î«OÅ@¼Ò¦¡¤Uªº¦ì§}¦³¦n´XºØ¡C¦¹³B©Ò¥Î¨ìªº¦³¨âºØ¡GÅÞ¿è¦ì§} ( logical address ) »Pµ´¹ï¦ì§}¡CÅÞ¿è¦ì§}¬O«ü±z¦b°£¿ù¾¹¤W©Ò¬Ý¨ìªº¦ì§}¡A³o¤]¬Oµ{¦¡©Ò¬Ý¨ìªº¦ì§}¡A¦b¯u¹ê¼Ò¦¡¤¤¡AÅÞ¿è¦ì§}´N¬O¥H¡u°Ï¬q:°¾²¾¦ì§}¡vªí¥Ü¡A¦b DEBUG/SYMDEB µ¥°£¿ù¾¹¬Ý¨ìªº¤]¬O³oºØ¦ì§}¡C¦b«OÅ@¼Ò¦¡¤§¤U¡A¦ü¥G¨Ã¨S¦³°£¿ù¾¹¥i¥Î¡A¦ý¬O¦b Windows ¨t²ÎùØ¡A¦³¦n´XºØ°£¿ù¾¹¥i¥H¨Ï¥Î¡A¨Ò¦p Olly Debug¡A¥¦Ì©ÒÅã¥Üªº¦ì§}¤]³£¬OÅÞ¿è¦ì§}¡Cµ´¹ï¦ì§}¤]ºÙ¬°¹êÅé¦ì§} ( physical address )¡A½Ð°Ñ¦Ò«e±ªº»¡©ú¡C¤@¯ë¦Ó¨¥¡AÅÞ¿è¦ì§}¶·¸g¹LÂà´«¤~¯àÅܦ¨¹êÅé¦ì§}¡C¦b¯u¹ê¼Ò¦¡¤¤¡AÂà´«¤è¦¡´N¬O«e±©Ò»¡ªº¡u¹êÅé¦ì§}¡×°Ï¬q¡Ñ16¡Ï°¾²¾¦ì§}¡v¤½¦¡¡C¦Ó¦b«OÅ@¼Ò¦¡ùØ¡A¦³¨âºØÂà´«¤è¦¡¡G¤À¬qÂà´« ( segment translation ) »P¤À¶Âà´« ( paging translation )¡C¤W±¡A¤p¤ì°¸¥H PM1.COM ¬°¨Ò¤l¡A¤w²³æÁ¿§¹¤À¬qÂà´«¡C
¦b¦¹°µÓ¤pµ²½×¡C¤À¬qÂà´«¥i°Ñ¦Ò¥kÃ䪺²¹Ï¡C¹Ï¤¤¥ªÃä¶À®Ø³¡¥÷¬O CPU¡A¥u¦C¥X»P PM1.COM ¦³Ãöªº¼È¦s¾¹¡F¹Ï¤¤¥kÃä¬õ¦â¤j®Ø¬°¹êÅé°O¾ÐÅé¡A³Ì¥kÃä¥H¬õ¦âªí¥Üªº 32 ¦ì¤¸¤Q¤»¶i¦ì¼ÆÈ¬°¹êÅé¦ì§}¡A¶V©³¤U¦ì§}¶V°ª¡C·íµM¤£¥i¯à§â¨CӦ줸²Õ¤Î¨ä¹êÅé¦ì§}¼Ð¥Ü¥X¨Ó¡A¤p¤ì°¸¥u¼Ð¥Ü«nªº¡A¦Ó¨Cӳ̤pªº¡A¤¤¶¡¨S¦³¤À¹j½uªº¾î®Ø³£¤@¼Ë¤j¡A¥Nªí 8 Ӧ줸²Õ¡C¦b¦¹¬õ¦â®Ø¤º¡A¦³¥|³¡¥÷¹Ï¦³I´ºÃC¦â¡A©@°Ø¦â¡BÂŦâ¡B¦Ç¦â¡Bµµ¦â¡A¤À§O¥Nªí¥þ°ì´yz¾¹ªí®æ ( GDT ) ¡Bµ{¦¡½X°Ï¬q¡B¸ê®Æ°Ï¬q¡BÅã¥Ü°O¾ÐÅé°Ï¬q¡C¦b¦¹¬õ¦â®Ø¥ª°¼¡A¦³¥|Ó¶À¦âªº¼Æ¦r¡A¬O¬Û¹ï©ó¥þ°ì´yz¾¹ªí®æªº¦ì§}¡A³o¨Ç¼ÆÈÀ³¸Ó¶ñ¤J¾A·íªº°Ï¬q¼È¦s¾¹¡C
CPU ¤¤ªº GDTR §t¦³¥þ°ì´yz¾¹ªí®æªº°ò©³¦ì§}¡A¦¹°ò©³¦ì§}¬O¥H¹êÅé¦ì§}ªí¹F¡A¨Ã§Q¥Î¦¹¤@¦ì§}«ü¦V°O¾ÐÅ餤ªº¥þ°ì´yz¾¹ªí®æ¡A§YÂŦâ½bÀY©Ò«üªº¸ô½u¡C¥þ°ì´yz¾¹ªí®æ¤¤§t¦³¨CӰϬqªº¸ê®Æ¡A¨CӰϬq¼È¦s¾¹¡A¦p CS¡BDS¡BES µ¥¡A¬Ò¬°¬Û¹ï©ó¥þ°ì´yz¾¹ªí®æªº«ü¼Ð¡A¥HÀò±o¸Ó°Ï¬qªº¸ê®Æ¡C¨Ò¦p CS ¤§È¬° 0008¡A§Yªí¥Ü CS ©Ò«üªº°Ï¬q´yz¾¹¬O¦b¥þ°ì´yz¾¹ªí®æªº²Ä 8 Ӧ줸²Õ¶}©l¡A§YÂëC¦â½bÀY©Ò«üªº¸ô½u¡C¦¹´yz¾¹ªº°ò©³¦ì§}¬°¡u0002 9364¡v¡A¦]¦¹ CS ©Ò«üªº¹êÅé¦ì§}¬O¦b¡u0002 9364¡v³B ( ²`ºñ¦â½bÀY©Ò«ü )¡A¨ä¤j¤p¬°¡u23H¡Ï1¡v¡C¦b«OÅ@¼Ò¦¡¤Uªºµ{¦¡½X°Ï¬qªº°¾²¾¦ì§}¬O EIP¡A¦]¦¹ CPU ´N¥i¥H¥Ñ GDTR ©M CS §ä¨ì¦b¥þ°ì´yz¾¹ªí®æªºµ{¦¡½X°Ï¬q´yz¾¹ªº¦ì§}¡A¥Ñ³o¸Ì¨ú¥X°ò©³¦ì§}¡A¦A¥[¤W EIP ´N¯à§ä¨ì¤U¤@¦æ«ü¥Oªº¦ì§}¡C
¸ê®Æ¤]¬O³o¼Ë¡ACPU ÂÇ¥Ñ GDTR ©M DS §ä¨ì¥þ°ì´yz¾¹ªí®æªº¸ê®Æ°Ï¬q´yz¾¹ªº¦ì§}¡A¥Ñ¦¹±o¨ì¸ê®Æ°Ï¬qªº°ò©³¦ì§}¡A0002 9388¡AµM«á¦A¥Ñ 32 ¦ì¤¸ªº°¾¤@¦ì§}¡A´N¯à¦s¨ú¸ê®Æ¡CPM1 ùØ¡A¦b«OÅ@¼Ò¦¡ùئs¨úªº¸ê®Æ´N¥u¦³ string ¦r¦ê¡A¥¦¦b¸ê®Æ°Ï¬qªº°¾²¾¦ì§}¥i¥Ñ¤U±µ{¦¡ ( ²Ä 97 ¦æ ) ºâ¥X¨Ó¡A¦s¨ì ESI ùØ¡G
mov esi,OFFSET string-OFFSET pm_data_seg
OFFSET string ¬O string ªº¦ì§}¡AOFFSET pm_data_seg ¬O¸ê®Æ°Ï¬qªº°ò©³¦ì§}¡A¨âªÌ¬Û´î¡A´N±o¨ì string ¦r¦êªº°¾²¾¦ì§}¡C
³o¤@¸`¨Ó»¡»¡°Ï¬q´yz¾¹¤º³Ñ¤U¨SÁ¿ªº³¡¥÷¡A¥ý¬Ý¬Ý°Ï¬q´yz¾¹ªº¼Ë¤l¡G

¨ä¤¤°ò©³¦ì§}¡BÃä¬É§¡¤w¸ÑÄÀ¹L¤F¡A±µ¤U¨Ó½Í½Í TYPE¡CTYPE ¦@¦³¥|Ӧ줸¡A40¡ã43¡A¥¦Ì©Ò¥Nªíªº·N¸q¡A¦³ÂI½ÆÂø¡C²Ä 43 ¦ì¤¸ºÙ¬° T ¦ì¤¸¡A¦Ó²Ä 40¡ã42 ¦ì¤¸ªº·N¸q©M T ¦ì¤¸¤§¼ÆÈ¦³Ãö¡FY T¡×1¡Aªí¥Ü¦¹°Ï¬q¬°µ{¦¡½X°Ï¬q¡FY T¡×0¡Aªí¨Ï¦¹°Ï¬q¤£¬Oµ{¦¡½X°Ï¬q¡A¦p¸ê®Æ¬q¡B°ïÅ|¬qµ¥¡C¦p¥k¹Ï©Ò¥Ü¡C
²Ä 40 ¦ì¤¸¬O A ¦ì¤¸¡A¬O accessed ªº·N«ä¡A§PÂ_¦¹°Ï¬q¬O§_´¿¸g³Q¦s¨ú¹L¡CY A¡×0¡A¥¼¦s¨ú¹L¡FA¡×1¡A¤w³Q¦s¨ú¹L¡C
¦A¨Ó¡A¸ÑÄÀ S ¦ì¤¸¡BDPL¡BP ¦ì¤¸¤T¶µ¡G
TYPE¡BS ¦ì¤¸¡BDPL¡BP ¦ì¤¸¥ç¦XºÙ¦s¨úÅv ( access rights )¡C
¦A¦^ÀY¬Ý¬Ý PM1 ªºµ{¦¡½X°Ï¬q´yz¾¹¡A¥Ñ§C¦ì¤¸²Õ¨ì°ª¦ì¤¸²Õ¬°¡u23 00 64 93 02 98 00 00¡v¡Aºñ¦â³¡¥÷¬°Ãä¬É¡A¥Õ¦â³¡¥÷¬°°ò©³¦ì§}¡A´N¤£²Ó»¡¤F¡C¬õ¦â³¡¥÷¡A¡u098¡v¡A¬°ÄݩʡA³Ì°ª¦ìªº 4 Ӧ줸§¡¬°¹s¡A¦]¦¹ G¡×0¡BD¡×0¡BAVL¡×0¡C¥Ñ G¡×0 ¥iª¾¡A¦¹°Ï¬qÃä¬É¥H¦ì¤¸²Õ¬°³æ¦ì¡A¦]¦¹¦¹¥Ñ¹êÅé¦ì§} 29364H ¶}©l¡A¨ì 29387H ¬°¤î¡A¦@ 24H Ӧ줸²Õ¡C¥Ñ D¡×0 ¥iª¾¡A¦¹°Ï¬q¹w³]¬° 16 ¦ì¤¸ªº°Ï¬q¡A¦]¦¹¼È¦s¾¹¡B¹Bºâ¤¸¹w³]¬° 16 ¦ì¤¸¡A¦pªGn¥Î¨ì 32 ¦ì¤¸ªº¼È¦s¾¹¡A±o¦b¾÷±ñ½X«e±¥[¤W«e¸m½X 66H¡A¥i¹ï·Ó PM1 ì©l½X pm: ¼Ð¸¹«á´X¦æªº
mov esi,OFFSET string-OFFSET pm_data_seg
mov edi,(80*10+0)*2 ;¿Ã¹õ²Ä 10 ¦C¡A²Ä 0 ¦æ¡C
³Q²ÕĶ«áªº¾÷±ñ½X¡G
291C:01AE 66BE00000000 MOV ESI,00000000h 291C:01B4 66BF40060000 MOV EDI,00000640h
ª`·N¨ì¬O¤£¬O¦h¤F¬õ¦âªº«e¸m½X¡H( ¾\Ū²Ä 30 ³¹¥iª¾¹D§ó¦hªº«e¸m½Xª¾ÃÑ )
¦A¨Óªº P ¦ì¤¸¡BDPL ©M S ¦ì¤¸¬°¡u9¡v¡A9 ªº¤G¶i¦ì¬°¡u1001¡v¡A¦]¦¹ P¡BS ¦ì¤¸§¡¬°¡u1¡v¡A¤]´N¬O¦¹°Ï¬q¦s¦b©ó¹êÅé°O¾ÐÅ餤¡A¨Ã¥B¬°¤@¯ë°Ï¬q¡A§Yµ{¦¡½X°Ï¬q¦Ó«D LDT µ¥¨t²Î¨Ï¥Îªº°Ï¬q¡CDPL ¬° 0¡Aªí¥Ü¯SÅvµ¥§Y¬O³Ì°ªµ¥¯Å¡C
³Ì«áªº TYPE Ȭ°¡u8¡v¡AÅܦ¨¤G¶i¦ì¬O¡u1000¡v¡A¦]¦¹ T¡×1¡Aªí¥Ü¬Oµ{¦¡½X°Ï¬q¡AC¡BR¡BA §¡¬°¡u0¡v¡A¤À§Oªí¥Ü¤@P¡B¤£¯àŪ¨ú¡B¥¼³Q¦s¨ú¹L¡C
ÁöµMÂÇ¥Ñ PM1¡A§Ṳ́¶²Ð¤F¦p¦ó¶i¤J«OÅ@¼Ò¦¡¡A¦ý¬O¤´µM¨S¦³¨Ï¥Î¨ì«OÅ@¼Ò¦¡¥¨¤j°O¾ÐÅ骺¦n³B¡A¦P®É PM1 ¤]¨S¦³±q«OÅ@¼Ò¦¡ªð¦^ DOS¡A¥u¦nÅý PM1 ¶i¤JµL½a°j°é¦Ó·í¾÷¡C©³¤U¤p¤ì°¸¦A¹ê§@¤@Óµ{¦¡¡APM2¡A³oÓµ{¦¡¶i¤J«OÅ@¼Ò¦¡«á¡A¥ýŪ¨ú¹êÅé¦ì§} 200000H ³B ( ¥Ñ 2MB ) ¶}©lªº´XӦ줸²Õ¡A±N¨ä¤º®e¦L¦b¿Ã¹õ¤W¡A¦A©ó¬Û¦P¦ì§}¼g¤J¡uI learn protected mode with assembly.¡v¦r¦ê¡C±µµÛ¦A±N¦ì§} 200000H ªº¤º®e¦L¦b¿Ã¹õ¤W¡C¦pªG¯uªº¶i¤J«OÅ@¼Ò¦¡¡A¨Ã¥B¼g¤J¦¨¥\¡A¨º»ò¿Ã¹õ¤W©ÒÅã¥Üªº¤º®e¡AÀ³·í¤£¦P¡C©³¤U¬O PM2 ªºì©l½X¡G
.386P
PAGE ,132
tr_seg EQU 200000h ;¥Øªº¸ê®Æ°Ï¬q¦ì§}¬° 2M ³B
tr_len EQU string_pm_len-1 ;¥Øªº¸ê®Æ°Ï¬qªø«×
jmp2pm MACRO s,o
DB 66h,0eah;¾Þ§@½X
DW o,0 ;32¦ì¤¸°¾²¾¦ì§}
DW s ;°Ï¬q¿ï¾Ü¾¹
ENDM
jmp2_16 MACRO s,o
DB 66h,0eah;¾Þ§@½X
DW o ;16¦ì¤¸°¾²¾¦ì§}
DW s ;°Ï¬q¿ï¾Ü¾¹
ENDM
pdesc STRUC
limit DW 0 ;¥þ°ì´yz¾¹ªí®æ¤j¤p
base DD 0 ;32¦ì¤¸°ò©³¦ì§}
pdesc ENDS
desc STRUC
limit_l DW 0 ;°Ï¬qÃä¬É(BIT0-15)
base_l DW 0 ;°Ï¬q¦ì§}(BIT0-15)
base_m DB 0 ;°Ï¬q¦ì§}(BIT16-23)
attributes DB 0 ;°Ï¬qÄÝ©Ê
limit_h DB 0 ;°Ï¬qÃä¬É(BIT16-19)(§t°Ï¬qÄݩʪº°ª4¦ì)
base_h DB 0 ;°Ï¬q¦ì§}(BIT24-31)
desc ENDS
;¥H¥¨¶°«ü¥O©w¸q°Ï¬q¿ï¾Ü´yz¾¹©w¸q
;¥Îªk¡Gdescriptor °Ï¬q¦W,°ò©³¦ì§},°Ï¬q¤j¤p,ÄÝ©Ê
;descriptor¥¨¶°·|¦Û°Ê§â°ò©³¦ì§}¡B°Ï¬q¤j¤p¡BÄÝ©ÊÂkÃþ¨ì¦UÄæ¦ì
;¡A¥Bdescriptor¥¨¶°¥²¶·©M desc µ²ºcÅé¦@¥Î
descriptor MACRO desc_name,base,limit,attribute
limit_0 = limit AND 0ffffh
limit_1 = ( ( limit AND 0ffff0000h ) SHR 10h ) AND 0fh
attrib_0 = attribute AND 0ffh
attrib_1 = ( ( ( attribute SHR 8 ) SHL 4 ) OR limit_1 ) AND 0ffh
base_0 = base AND 0ffffh
base_1 = ( ( base AND 0ff0000h ) SHR 10h ) AND 0ffh
base_2 = ( ( base AND 0ff000000h ) SHR 18h ) AND 0ffh
desc_name desc <limit_0,base_0,base_1,attrib_0,attrib_1,base_2>
ENDM
;*******************************************************************************
data SEGMENT USE16
gdt LABEL BYTE ;¥þ°ì´yz¾¹ªí®æ
descriptor dummy,0,0,0 ;ªÅ´yz¾¹
descriptor pm_code32, 0, pm_c_len-1,498h ;32¦ì¤¸µ{¦¡½X°Ï¬q´yz¾¹
descriptor pm_datasr, 0,pm_d_sr_len-1, 92h ;¨Ó·½¸ê®Æ°Ï¬q´yz¾¹
descriptor pm_datatr, tr_seg, tr_len, 92h ;¥Øªº¸ê®Æ°Ï¬q´yz¾¹
descriptor pm_video, 0b8000h, 0ffffh, 92h ;Åã¥Ü°O¾ÐÅé°Ï¬q´yz¾¹
descriptor pm_stack, 0, stack_len-1, 92h
descriptor pm_code16, 0, 0ffffh, 98h ;·Ç³Æ¸õ¦^¯u¹ê¼Ò¦¡ªº16¦ì¤¸µ{¦¡½X°Ï¬q´yz¾¹
descriptor normal, 0, 0ffffh, 92h
gdt_len = $-gdt ;¥þ°ì´yz¾¹ªí®æªº¤j¤p
gdt_ptr pdesc <gdt_len-1,0> ;¥þ°ì´yz¾¹ªí®æ¸ê®Æ
code32_selector = pm_code32-gdt ;µ{¦¡½X°Ï¬q¿ï¾Ü¾¹
datasr_selector = pm_datasr-gdt ;¨Ó·½¸ê®Æ°Ï¬q¿ï¾Ü¾¹
datatr_selector = pm_datatr-gdt ;¥Øªº¸ê®Æ°Ï¬q¿ï¾Ü¾¹
video_selector = pm_video-gdt ;Åã¥Ü°O¾ÐÅé°Ï¬q¿ï¾Ü¾¹
stack_selector = pm_stack-gdt ;°ïÅ|°Ï¬q¿ï¾Ü¾¹
code16_selector = pm_code16-gdt ;·Ç³Æ¸õ¦^¯u¹ê¼Ò¦¡ªº 16 ¦ì¤¸µ{¦¡½X°Ï¬q¿ï¾Ü¾¹
normal_selector = normal-gdt
SaveSP DW ? ;¥Î©ó«O¦sSP¼È¦s¾¹
SaveSS DW ? ;¥Î©ó«O¦sSS¼È¦s¾¹
;-------------------------------------------------------------------------------
data ENDS
;*******************************************************************************
pm_stack_seg SEGMENT PARA STACK USE16
stack_len = 256
DB stack_len DUP(0)
pm_stack_seg ENDS
;*******************************************************************************
pm_datasr_seg SEGMENT PARA USE16
string_pm DB 'I learn protected mode with assembly.',0
string_pm_len = $-string_pm+1
char_per_line DD ? ;¿Ã¹õ¤W¡A¨C¤@¦C¦L¥X 16 Ó¦r¤¸¤Î¸Ó¦r¤¸©Ò¥Nªíªº¼ÆÈ
x DB 0 ;¸ê®Æ±q¿Ã¹õ²Ä 9 ¦C¡B²Ä 0 ¦æ¶}©lÅã¥Ü
y DB 9
pm_d_sr_len = $-string_pm
pm_datasr_seg ENDS
;*******************************************************************************
code SEGMENT USE16
ASSUME cs:code,ds:data
;-------------------------------------------------------------------------------
main PROC
mov ax,data
mov ds,ax
;³]¸m«OÅ@¼Ò¦¡¤¤¡A32 ¦ì¤¸µ{¦¡½X°Ï¬qªº´yz¾¹
sub eax,eax
xor ebx,ebx
mov ax,pm_code32_seg
mov bx,OFFSET pm_code32_start
shl eax,4
add eax,ebx
mov pm_code32.base_l,ax
shr eax,10h
mov pm_code32.base_m,al
mov pm_code32.base_h,ah
;³]¸m«OÅ@¼Ò¦¡¤¤¡A16 ¦ì¤¸µ{¦¡½X°Ï¬qªº´yz¾¹
sub eax,eax
xor ebx,ebx
mov ax,pm_code16_seg
mov bx,OFFSET main16
shl eax,4
add eax,ebx
mov pm_code16.base_l,ax
shr eax,10h
mov pm_code16.base_m,al
mov pm_code16.base_h,ah
;³]¸m«OÅ@¼Ò¦¡¤¤¡A¨Ó·½¸ê®Æ°Ï¬qªº´yz¾¹
xor eax,eax
mov ax,pm_datasr_seg
shl eax,4
mov pm_datasr.base_l,ax
shr eax,10h
mov pm_datasr.base_m,al
mov pm_datasr.base_h,ah
;³]¸m«OÅ@¼Ò¦¡¤¤¡A°ïÅ|°Ï¬q´yz¾¹
mov ax,ss
mov WORD PTR SaveSS,ax
mov WORD PTR SaveSP,sp
sub eax,eax
mov ax,pm_stack_seg
shl eax,4
mov WORD PTR pm_stack.base_l,ax
shr eax,10h
mov BYTE PTR pm_stack.base_m,al
mov BYTE PTR pm_stack.base_h,ah
;¶ñ¤J¥¿½Tªº¼ÆÈ¨ì gdt_ptr ùØ
sub eax,eax
xor ebx,ebx
mov ax,ds
mov bx,OFFSET gdt
shl eax,4
add eax,ebx ;pºâ¨Ã³]¸m°ò¦ì§}
mov gdt_ptr.base,eax
;¥Î MASM 6.x ²ÕͮɡA§ï¦¨¡ulgst gdt_ptr¡v¡F¥Î MASM 5.x ²ÕͮɡA
lgdt QWORD PTR gdt_ptr ;§ï¦¨¡ulgst QWORD PTR gdt_ptr¡v
cli ;Ãö¤¤Â_
;¶}°_ A20 ¦ì§}½u
in al,92h
or al,00000010b
out 92h,al
;¤Á´«¨ì«OÅ@¼Ò¦¡
mov eax,cr0
or al,1
mov cr0,eax
;²M«ü¥O¹w¨ú¶¤¦C,¨Ã¯u¥¿¶i¤J«OÅ@¼Ò¦¡
jmp2pm code32_selector,<OFFSET main32>
rm_entry: ;¦^¨ì¯u¹ê¼Ò¦¡®Éªº¶i¤JÂI
mov ax,data
mov ds,ax
mov sp,SaveSP
mov ss,SaveSS
;Ãö³¬ A20 ¦ì§}½u
in al,92h
and al,11111101b
out 92h,al
sti
;µ²§ôµ{¦¡¡Aªð¦^ DOS
mov ax,4c00h
int 21h
main ENDP
;-------------------------------------------------------------------------------
code ENDS
;*******************************************************************************
pm_code32_seg SEGMENT USE32
ASSUME cs:pm_code32_seg,ds:pm_datasr_seg
pm_code32_start:
;-------------------------------------------------------------------------------
;¥Ñ DL ( ²Ä´X¦æ¡Ax )¡BDH ( ²Ä´X¦C¡Ay ) ¨D¥XÅã¥Ü°O¾ÐÅ骺¦ì§}¡A¦s©ó EDI ùØ¡C
;¤½¦¡¡GEDI¡×160*DH+2*DL¡×128*DH+32*DH+2*DL
set_edi PROC
movzx eax,x
movzx edi,y
mov ebx,edi
shl eax,1 ;EAX¡×2*DL
shl ebx,7 ;EBX¡×128*DH
shl edi,5 ;EBX¡×32*DH
add edi,ebx
add edi,eax
ret
set_edi ENDP
;-------------------------------------------------------------------------------
ascii PROC
and al,0fh
add al,'0'
cmp al,'9'
jbe number
add al,7
number: stosw
ret
ascii ENDP
;-------------------------------------------------------------------------------
;¦b¿Ã¹õ¤W B8000:EDI ³B¦L¥X AL ¤§¤Q¤»¶i¦ì¼ÆÈ
print_char PROC
mov bl,al
shr al,4
call ascii
mov al,bl
call ascii
ret
print_char ENDP
;-------------------------------------------------------------------------------
;¦¹°Æµ{¦¡·|§â FS:ESI ©Ò«ü¦ì§}¤§¤º®e¦L¦b¿Ã¹õ B8000:EDI ¤W
print_line PROC
mov ah,0eh
push ecx
mov edx,tr_seg
xor ebx,ebx
add edx,esi
mov ecx,4
next0: shld ebx,edx,8
mov al,bl
call print_char
shl edx,8
loop next0
mov al,' '
stosw
pop ecx
mov char_per_line,10h
push esi
push ecx
next1: mov al,fs:[esi]
inc esi
call print_char
mov al,' '
stosw
dec ecx
jz blank
dec char_per_line
jnz next1
jmp ok1
blank: dec char_per_line
jz ok1
mov al,' '
stosw
stosd
jmp blank
ok1: pop ecx
pop esi
mov char_per_line,10h
next2: mov al,fs:[esi]
inc esi
cmp al,20h
jae print
mov al,'.'
print: stosw
dec ecx
jz ok2
dec char_per_line
jnz next2
ok2: ret
print_line ENDP
;-------------------------------------------------------------------------------
;¦¹°Æµ{¦¡¥ýŪ¨ú FS:00000000 ¶}©lªº string_len Ӧ줸²Õ¡A¨Ã§â¸ê®ÆÅã¥Ü¦b¿Ã¹õ¤W¡A
;µM«á§â DS:string_pm ©Ò§}ªº¦r¦ê¼g¤J FS:00000000¡A¦A§â¨ä¤º®e¦L¦b¿Ã¹õ¤W¡C
;FS:00000000 ¦ì§}¦ì©óª«²z¦ì§} tr_seg ³B¡C
main32 PROC
mov ax,stack_selector
mov ss,ax
mov esp,stack_len
mov ax,datasr_selector
mov ds,ax
mov ax,video_selector
mov es,ax
mov ax,datatr_selector
mov fs,ax
xor esi,esi
mov ecx,string_pm_len
cld
next3: call set_edi
call print_line
jecxz ok3
mov x,0
inc y
loop next3
ok3: mov esi,OFFSET string_pm
xor ebx,ebx
mov ecx,string_pm_len
next4: lodsb
mov fs:[ebx],al
inc ebx
loop next4
mov x,0
mov y,13
mov ecx,string_pm_len
xor esi,esi
next5: call set_edi
call print_line
jecxz ok4
mov x,0
inc y
loop next5
ok4: jmp2_16 code16_selector,<OFFSET main16>
main32 ENDP
;-------------------------------------------------------------------------------
pm_c_len = $-pm_code32_start
pm_code32_seg ENDS
;*******************************************************************************
pm_code16_seg SEGMENT USE16
ASSUME cs:pm_code16_seg
;-------------------------------------------------------------------------------
main16 PROC
mov ax,normal_selector
mov ds,ax
mov es,ax
mov ss,ax
mov eax,cr0
and al,11111110b
mov cr0,eax
jmp FAR PTR rm_entry
main16 ENDP
;-------------------------------------------------------------------------------
pm_code16_seg ENDS
;*******************************************************************************
END main
¸ò PM1 ¤@¼Ë¡A§Q¥Î¤å®Ñ³B²z³nÅé¡A¿é¤J¤Wzì©l½X«á¡A¦s¦¨ PM2.ASM ÀÉ¡A¶}±Ò Virtual PC¡A¨Ì¤U¹Ïºñ®Ø¤º①¡B②«ü¥O²ÕĶ¨Ã³sµ²¡G

²ÕĶ¨Ã³sµ²¦¨¥\«á¡A¿é¤J③³Bµµ®Ø¤º«ü¥O¡A°õ¦æ PM2¡A·|¬Ý¨£¦b»È¹õ¤¤¦L¥X¶À¦â¤º®e¡A¤W±¥H¬õ®Ø®Ø¦íªº¬Oì¨Ó 2MB ³Bªº 36 Ӧ줸²Õ¡A¤º®e§¡¬°¡u0¡v¡A¦ÓÂÅ®Ø®Ø¦íªº¬O PM2 ¶ñ¤Jªº¤º®e¡C«Ü©úÅ㪺¡A¨âªÌ¤£¬Û¦P¡C¹Ï¤¤³Ì¤U±⑥¥Õ®Ø³B¥i¥H¨£¨ì¡A¤wªð¦^ DOS¡A¥i¥HÄ~Äò¿é¤J«ü¥O¡A¤£·|·í¾÷¡C©³¤U»¡©ú PM2¡C
¨C¦¸©w¸q°Ï¬q´yz¾¹¡A³£»Ýn«·spºâ¡A«Ü¬O³Â·Ð¡A¦]¦¹¤p¤ì°¸ÁÙ¼¶¼g¤F descriptor ¥¨¶°¡A³oÓ¥¨¶°¥i¥H¿é¤J°Ï¬q´yz¾¹ªº¦WºÙ¡B°ò©³¦ì§}¡BÃä¬É¡BÄݩʡAµM«áÂàÅܦ¨^¯Sº¸©Ò©w¸qªº¨ººØ«Ü¤£ª½Ä±ªº°Ï¬q´yz¾¹®æ¦¡ ( °Ï¬q°ò©³¦ì§}¡B°Ï¬qÃä¬É³£¤À¦¨¨â³¡¥÷ )¡A³oÓ¥¨¶°¬O¡G
;¥H¥¨¶°«ü¥O©w¸q°Ï¬q¿ï¾Ü´yz¾¹©w¸q
;¥Îªk¡Gdescriptor °Ï¬q¦W,°ò©³¦ì§},°Ï¬q¤j¤p,ÄÝ©Ê
;descriptor¥¨¶°·|¦Û°Ê§â°ò©³¦ì§}¡B°Ï¬q¤j¤p¡BÄÝ©ÊÂkÃþ¨ì¦UÄæ¦ì
;¡A¥Bdescriptor¥¨¶°¥²¶·©M desc µ²ºcÅé¦@¥Î
descriptor MACRO desc_name,base,limit,attribute
limit_0 = limit AND 0ffffh
limit_1 = ( ( limit AND 0ffff0000h ) SHR 10h ) AND 0fh
attrib_0 = attribute AND 0ffh
attrib_1 = ( ( ( attribute SHR 8 ) SHL 4 ) OR limit_1 ) AND 0ffh
base_0 = base AND 0ffffh
base_1 = ( ( base AND 0ff0000h ) SHR 10h ) AND 0ffh
base_2 = ( ( base AND 0ff000000h ) SHR 18h ) AND 0ffh
desc_name desc <limit_0,base_0,base_1,attrib_0,attrib_1,base_2>
ENDM
¦¹³Bªº AND¡BSHR¡BSHL¡BOR µ¥¨Ã¤£¬O x86 «ü¥O¡A¦Ó¬O¹Bºâ¤l¡A¦b¨Ï¥Î®É¡Abase¡Blimit¡Battribute ³£¬O¤wª¾¼Æ¡A¤£¯à¬O¼È¦s¾¹©ÎÅܼơA¥¦Ì¦b²ÕͶ¥¬q´N¤w¸g½T©w¤F¡C¦³¤F³oÓ¥¨¶°¡A¥H«án©w¸q°Ï¬q´yz¾¹¡A¥u»Ýn¹³
descriptor pm_video, 0b8000h, 0ffffh, 92h
´N¥i¥H¤F¡C³o¬O©w¸q¤@Ó¦W¬° pm_video °Ï¬q´yz¾¹¡A°ò©³¦ì§}¬O 0B8000H¡A°Ï¬qÃä¬É¬O 0FFFFH¡AÄݩʬ° 92H¡C