Ch 30 ¯u¹ê¼Ò¦¡ªº DOS ¨Ï¥Î 80386 ¤Î§ó°ª¶¥ CPU

¦­¦b¦è¤¸ 1985 ¦~¡A­^¯Sº¸´N¤w¸g±À¥X¨ã¦³ 32 ¦ì¤¸¼È¦s¾¹ªº 80386 CPU¡A¦ý¬O¨º®É­Ôªº§@·~¨t²Î¤´¬O 16 ¦ì¤¸ªº DOS¡A¤j³¡¤Àªº³nÅ餴¨Ï¥Î 16 ¦ì¤¸ªº©w§}»P¼È¦s¾¹¡Aª½¨ì¤Q¦~«áªº¦è¤¸ 1995 ¦~¡A·L³n¤~±À¥X¤F Windows 95¡A§@·~¨t²Î»P³nÅé¤~³vº¥¦¨¬° 32 ¦ì¤¸¡C

¦b³o¬q´Á¶¡ªº 10 ¦~¤º¡A¬Æ¦Ü¬O¨ì²{¦b¡A¥«­±¤W¦³Ãö²Õ¦X»y¨¥ªº®ÑÄy¤j³¡¤À¤´¬O½Í½× 16 ¦ì¤¸ªº 8086/8088 CPU¡A¹ï 80386 ¤Î§ó°ª¶¥ªº CPU ¦Ó¨¥¡A¹ê¦b¬O¤j§÷¤p¥Î¡C¨Æ¹ê¤W¡A·L³n©Ò¥X«~ªº MASM 5.x ²ÕĶ¾¹¥i¥H¦b 16 ¦ì¤¸ªº DOS ¨t²Î¤¤¡A¦³­­¨îªº¨Ï¥Î 80386 ªº¯S©Ê¡A¥i¥H¨Ï±oµ{¦¡§ó¦³®Ä²v¡A¨Ò¦p¨Ï¥Î 32 ¦ì¤¸ªº¼È¦s¾¹¹Bºâ¡A¨Ï¥Î 80386 ¦h¥Xªº¨â­Ó¬q¼È¦s¾¹¡AFS »P GS¡A¨Ï¥Î¯S®í©w§}¤è¦¡µ¥µ¥¡C³o¤@³¹±N¹ï³o¨Ç¥DÃD°µ¤¶²Ð¡C


¨Ï¥Î 32 ¦ì¤¸¼È¦s¾¹°µ­¼ªk¹Bºâ

¦³³\¦h²Õ¦X»y¨¥ªº®ÑÄy±`¦³³o¼Ëªº§@·~¡G¼g¤@­Ó 32 ¦ì¤¸ªº­¼ªk¡C¨ä¸Ñªk±`±`¬O§â 32 ¦ì¤¸©î¦¨¨â­Ó 16 ¦ì¤¸¡AµM«á§Q¥ÎÃþ¦üª½¦¡­¼ªk¬Û­¼¡C¦ý¦¹³B¤p¤ì°¸´£¥X¥t¤@ºØ¸Ñªk¡A­ì©lµ{¦¡¡AMUL32.ASM¡A¦p¤U¡G

;70000*80000=5600000000 (11170h*13880h=14DC93800h)
        .386            ;02 ¨Ï¥Î 32 ¦ì¤¸¼È¦s¾¹»P«ü¥O¶°
;***************************************
code    segment use16   ;04 ¨Ï¥Î 16 ¦ì¤¸©w§}¤è¦¡
        assume  cs:code,ds:code
        org     100h
;---------------------------------------
start:  jmp     short begin
x       dd      70000   ;09 ³Q­¼¼Æ
y       dd      80000   ;10 ­¼¼Æ
p_low   dd      ?       ;11 ¿nªº§C¦ì§}¦r²Õ
p_high  dd      ?       ;12 ¿nªº°ª¦ì§}¦r²Õ
begin:  mov     eax,x   ;13 32 ¦ì¤¸¸ê®ÆÂಾ
        mov     ebx,y
        mul     ebx     ;15 32 ¦ì¤¸­¼ªk
        mov     p_low,eax
        mov     p_high,edx

        lea     bx,x    ;19 ¦L¥X³Q­¼¼Æ
        mov     ah,0
        call    print_dword

        mov     ah,2
        mov     dl,'*'
        int     21h

        lea     bx,y    ;27 ¦L¥X­¼¼Æ
        mov     ah,0
        call    print_dword

        mov     ah,2
        mov     dl,'='
        int     21h

        cmp     p_high,0        ;35 ¦L¥X­¼¿n
        jz      no_pnt_high
        lea     bx,p_high
        mov     ah,0
        call    print_dword
no_pnt_high:
        mov     bx,offset p_low
        call    print_dword

        mov     ax,4c00h
        int     21h
;---------------------------------------
;¥H¤Q¤»¶i¦ì¼Æ¦L¥X BX ©Ò«ü¦ì§}ªº¥|­Ó¦ì¤¸²Õ(Âù¦r²Õ)
;¿é¤J¡GBX¡G­n¦L¥XÂù¦r²Õªº¦ì§}
;    ¡GAH«D¹s¡GÅã¥Ü¥þ³¡32¦ì¤¸¡AAH=0¡G¥Ñ³Ì¤j¼Æ¤£¬°¹s¶}©lÅã¥Ü
;¿é¥X¡G¿Ã¹õ¤WÅã¥Ü¤Q¤»¶i¦ì¼Æ
;      AX¡BCX¡BDX ·|³Q¯}Ãa
print_dword     proc    near
        add     bx,3    ;53 ¥Ñ¸û¤j¦ì¼Æ¶}©l¦L
        mov     cl,4    ;54 ¦@¦L¥X 4 ­Ó¦ì¤¸²Õ
nxt:    mov     dl,[bx]
        call    pnt_dl
        dec     bx
        dec     cl
        jnz     nxt
        ret

pnt_dl: mov     ch,dl
        shr     dl,4    ;63 ¥u¦³¦b 286 ¥H¤Wªº CPU ¤~¥i¥H¨Ï¥Î
        call    pt0
        mov     dl,ch
        and     dl,0fh
pt0:    add     dl,'0'
        cmp     dl,'9'
        jbe     pt1
        add     dl,7
pt1:    cmp     dl,'0'  ;71 Àˬd¬O§_¬°¹s
        jne     pt2
        or      ah,ah   ;73 ­Y¬°¹s¡A«hÀˬd¬O§_¤w¸g
        jz      pt3     ;   ¦L¹L³Ì¤j¤£¬°¹sªº¼Æ¤F
pt2:    mov     ah,1
        push    ax
        mov     ah,2
        int     21h
        pop     ax
pt3:    ret
print_dword     endp
;---------------------------------------
code    ends
;***************************************
        end     start

¦¹µ{¦¡»Ý¥H²ÕĶ¾¹²ÕĶ¨ÃÂà´«¦¨ MUL32.COM ÀÉ¡A¤~¯à°õ¦æ¡C©³¤U¤p¤ì°¸¤j­P¸ÑÄÀ¦¹µ{¦¡ªº¹B§@¨Ã»¡©ú¦p¦ó°£¿ù¡C

80386 ¤Î¨ä¸û°ªµ¥ªº CPU ³£¥i¥H¨Ï¥Î 32 ¦ì¤¸ªº¼È¦s¾¹¡A·íµM¤]¥i¥Hª½±µ°µ 32 ¦ì¤¸ªº¥|«h¹Bºâ¥H¤ÎÅÞ¿è¹Bºâ¡A¨Ò¦p ADD¡BADC¡BOR¡BAND µ¥¹Bºâ¡CÁöµM DOS ¬O¤Q¤»¦ì¤¸ªº§@·~¨t²Î¡A¦ý¬O§@·~¨t²Î¥u´xºÞ¿é¥X¡B¿é¤J¤ÎºÞ²zºÏºÐ¡BÀɮסB¸ê·½µ¥¤u§@¡A¨Ã¤£¯A¤Î¹Bºâ¡A©Ò¥H¥»µ{¦¡¥i¥H¦b DOS ¤¤°õ¦æ¡C·íµM¦b¼¶¼g­ì©lµ{¦¡®É¡A¥²¶·°µ¬Y¨Ç«Å§i¨Ï±o²ÕĶ¾¹¯à«ö·Óµ{¦¡³]­p®vªº·N§Ó¤u§@¡AÃöÁ䤧³B´N¬O¦b .386 °²«ü¥O¤Î segment °²«ü¥Oªº use16 ³o¨â­Ó¦a¤è¡C

.386 °²«ü¥O»P .386P °²«ü¥O

.386 ¬Oªí¥Ü¥i¥H¥Î 80386 CPU ªº«ü¥O¶°¡A¦Ó .386P «h¬Oªí¥Ü¥i¥H¨Ï¥Î 80386 CPU ªº¯SÅv«ü¥O¶°¡A·íµM 80386 CPU ªº«ü¥O¶°¥]§t¤F©Ò¦³¤ñ¥¦µ¥¯Å§Cªº CPU¡A©Ò¥H 8088/8086/80186/80286 µ¥ CPU ªº©Ò¦³«ü¥O³£¯à¦b 80386 ¨Ï¥Î¡A¨Ã¥B 80386 ÁÙ¦h¥X¤@¨Ç¥¦­Ì©Ò¨S¦³ªº«ü¥O¡A³o´N¬O©Ò¿×ªº¦V¤U¬Û®e¡CÃþ¦üªº°²«ü¥OÁÙ¦³ .8088¡B.186¡B.286/286P¡B.8087¡B.287¡B.387¡A¸Ô²Ó±¡§Î¡A½Ð¦Û¦æ°Ñ¦Ò­^¯Sº¸ªº CPU «ü¥O¶°¤â¥U¡C

.386 ©Î .386P ¥H¤Î¨ä¥LÃþ¦üªº«Å§i¤@¯ë³£¬O©ñ¦b­ì©lµ{¦¡ªº¶}ÀY¡A¦ý¬O¤]¥i¥H©ñ¦b­ì©lµ{¦¡ªº¨ä¥L¦a¤è¡A¤£¹L¦pªG±z­n©ñ¦b¨ä¥L¦a¤è®É­nª`·N¦³¨â­Ó­­¨î¡C²Ä¤@¬O¥²¶·©ñ¦b¬q»P¬q¤§¶¡¡A´«¥y¸Ü»¡¡A¦b¦P¤@¬q¤ºªº«ü¥O¶°µLªkÅܧó¡C²Ä¤G¬O°ª¶¥ªº¯BÂI«ü¥O¤Î¤£¯à·f°t§C¶¥ªº CPU «ü¥O¶°¡A¨Ò¦p¡A¦pªG±z¦bµ{¦¡¤@¶}©l«Å§i .286¡A¦Ó«á¤S«ü©w .387¡A´N·|³Q²ÕĶ¾¹»{¬°¤£¦Xªk¡C

¹ï©ó¨Ï¥Î 32 ¦ì¤¸¹Bºâ¡AÁÙ¦³¤@­Ó°ÝÃD»Ý­n¸Ñ¨M¡C°²¦p«ü©w¤F .386 ©Î .386P ÁöµM¥i¥H¨Ï¥Î¸û°ª¶¥ªº«ü¥O¶°¡A¦ý¬O .386 ·|«ü©w¦¹°Ï¬q±N¥H 32 ¦ì¤¸¤è¦¡©w§}¡A¦¹®É¨C­Ó¬q³Ì¤j¥i¥H¦³ 4GB¡A³oºØ©w§}¤è¦¡µLªk¬°¯u¹ê¼Ò¦¡©Ò±µ¨ü¡C°²¦p¨S¦³«Å§i .386 ªº¸Ü¡A¨º»ò±N¤£¯à¨Ï¥Î 32 ¦ì¤¸¹Bºâ¡A¨Ã¥B²ÕĶ¾¹·|¥H¤º©wªº²ÕĶ¤è¦¡¡A§Y¨Ï¥Î 8088/8086 ¥H¤Î 8087 «ü¥O¶°²ÕĶ­ì©lµ{¦¡¡A¦P®É¨Ï¥Î¤Q¤»¦ì¤¸ªº©w§}¤è¦¡¡C©Ò¿×¤Q¤»¦ì¤¸ªº©w§}¤è¦¡´N¬O¦b²Ä¤@³¹¤Î²Ä¤G³¹©Ò´£¨ìªº¥H¡y¬q¡G°¾²¾¡zªº¤è¦¡¨Óªí¥Ü¦ì§}ªº¡A³o®É¤@­Ó¬q³Ìªø¥u¯à¦³ 64KB¡A³oºØ©w§}¤è¦¡¤~¬O¯u¹ê¼Ò¦¡¤U©Ò¯à±µ¨üªº¤è¦¡¡C

¨º»ò³½»Pºµ´x¬O§_¥i¥H­Ý±o¡H½Ð¬Ý¤U­±»¡©ú¡C

SEGMENT °²«ü¥O

¦b²Ä¤Q¤@³¹®É¡A´¿´£¨ì segment °²«ü¥O¡A¨ì¤F MASM 5.x ª©¤§«á¡Asegment «á­±¨ä¹êÁÙ¦³¤@­Ó¿ï¶µ¡A´N¬O¡y¨Ï¥Î¡z¡A¨ä§¹¾ã»yªk¬O

°Ï¬q¦W  segment  ±Æ¦C«¬¦¡   ¦X¨Ö«¬¦¡   Ãþ§O¦W   ¨Ï¥Î

¡y¨Ï¥Î¡z¥u¯à¦b¦³«Å§i .386 ©Î .386P °²«ü¥O®É¤~¯à¦³³o­Ó¿ï¶µ¡A¡y¨Ï¥Î¡z¥u¦³¨â­Ó¿ï¾Ü¡Ause16 ©Î use32¡AÅU¦W«ä¸q¡Ause16 ´Nªí¥Ü¦¹°Ï¬q¨Ï¥Î¤Q¤»¦ì¤¸©w§}¤è¦¡¡Ause32 ¬Oªí¥Ü¦¹°Ï¬q¥Î 32 ¦ì¤¸©w§}¤è¦¡¡C

32 ¦ì¤¸ªº MOV «ü¥O

µ{¦¡²Ä 13¡B14 ¦æ¤Î²Ä 16¡B17 ¦æ¬O§Q¥Î¦b 80386 ¤Î¨ä¸û°ª¶¥ªº CPU ª½±µ¶i¦æ 32 ¦ì¤¸¸ê®ÆÂಾ«ü¥O¡A¦¹«ü¥Oªº¥Îªk©M 16 ¦ì¤¸®É¬Û¦P¡A¥u¬O¼È¦s¾¹©ÎÅܼơyªø¡zªø¤F¡A·íµM­n¦b DOS ¤U¥Î³o¨ÇÀu¶Õ¡A­n¥ý«Å§i .386 ©M use16 ³o¨â¼ËªF¦è¡C

32 ¦ì¤¸ªº MUL «ü¥O

µ{¦¡²Ä 15 ¦æ¬O¥O¥Î¦b 80386 ¤Î¨ä¸û°ª¶¥ªº CPU ª½±µ¶i¦æ 32 ¦ì¤¸¹Bºâ¡C¥H mul ¬°¨Ò¡A·í­¼¼Æ¬O 32 ¦ì¤¸ªº¼È¦s¾¹©ÎÅܼƮɡA·|§â­¼¿n¦s©ó EDX:EAX ùØ¡C

¥i¥H¨Ï¥Î 32 ¦ì¤¸¹Bºâ¤¸ªº«ü¥OÁÙ¦³ ADD¡BADC¡BSUB¡BSBB¡BIMUL¡BDIV¡BIDIV µ¥µ¥¡C³o¨Ç«ü¥Oªº¥Îªk©M 16 ¦ì¤¸®É¬Û¦P¡A¥u¬O¼È¦s¾¹©ÎÅܼơyªø¡zªø¤F¡A·íµM­n¦b DOS ¤U¥Î³o¨ÇÀu¶Õ¡A­n¥ý«Å§i .386 ©M use16 ³o¨â¼ËªF¦è¡C

¥[±jªº SHR «ü¥O

µ{¦¡²Ä 63 ¦æªº shr dl,4 ¬O¨Ï DL ¤§­È¦V¥k²¾¥|­Ó¦ì¤¸¡A¥H±o¨ì DL ¸û°ªªº¥|­Ó¦ì¤¸¡C8086/8088 µ¥¯Åªº CPU ¥i¥H¨Ï¥Î shr dl,1¡A¦ý¬O¦pªG¬O³sÄò¦V¥k²¾¼Æ­Ó¦ì¤¸®É¡A¥²¶·§â¥k²¾¦ì¤¸¼Æ¥ý©ñ¦b CL ¤¤¡A¦A°õ¦æ shr dl,cl¡C³o¼Ë«Ü³Â·Ð¡A©Ò¥H¨ì¤F 80286 ¤Î¨ä¸û°ª¶¥ªº CPU ¤w¸g¥i¥Hª½±µ§â¥k²¾¦¸¼Æ±µ¦b¹Bºâ¤¸¤§«á¡CÃþ¦üªº«ü¥OÁÙ¦³ SHL¡BROL¡BROR µ¥¡C

LEA «ü¥O

LEA «ü¥O¬O¥Î¨Ó¨ú±o¦ì§}ªº 8086/8088 «ü¥O¡A¨ä»yªk¬O¡G

lea     ¼È¦s¾¹,ÅܼÆ

LEA ·|§âÅܼƩҦb¤§¦ì§}­pºâ¥X¨Ó¡A¨Ã¦s¤J«e­±ªº¼È¦s¾¹ùØ¡C¨ä¥Î³~¦³ÂI¹³ offset¡A¦ý¬O¥¦¤ñ offset ¦hÂI¼u©Ê¡C¨Ï¥Î offset ®É¡A¥²¶·¦b²ÕĶ¶¥¬q´N¤w¸g½T©wªºÅܼƦì§}¤~¥i¥H¡Alea ¥i¥H¦b°õ¦æ®É¤~ª¾¹DÅܼƦì§}¡C

¥Î DEBUG/SYMDEB ¸ü¤J

¥Î DEBUG ¸ü¤J³o­Óµ{¦¡®É¡A¦]¬° DEBUG µLªk§¹¥þ»{±o 80386 «ü¥O¡A¦]¦¹¤Ï²ÕĶ®ÉÅã¥Ü¤£¤Ó¥¿½T¡G( °Ñ¦Òµù¤@ )

-U 100 L1 [Enter]
1784:0100 EB10          JMP     0112
-U 112 [Enter]
1784:0112 66            DB      66
1784:0113 A10201        MOV     AX,[0102]
1784:0116 66            DB      66
1784:0117 8B1E0601      MOV     BX,[0106]
1784:011B 66            DB      66
1784:011C F7E3          MUL     BX
1784:011E 66            DB      66
1784:011F A30A01        MOV     [010A],AX
1784:0122 66            DB      66
1784:0123 89160E01      MOV     [010E],DX
1784:0127 BB0201        MOV     BX,0102
1784:012A B400          MOV     AH,00
1784:012C E83100        CALL    0160
1784:012F B402          MOV     AH,02
1784:0131 B22A          MOV     DL,2A
-U [Enter]
1784:0133 CD21          INT     21
1784:0135 BB0601        MOV     BX,0106
1784:0138 B400          MOV     AH,00
1784:013A E82300        CALL    0160
1784:013D B402          MOV     AH,02
1784:013F B23D          MOV     DL,3D
1784:0141 CD21          INT     21
1784:0143 66            DB      66
1784:0144 833E0E0100    CMP     WORD PTR [010E],+00
1784:0149 0F            DB      0F
1784:014A 8408          TEST    CL,[BX+SI]
1784:014C 00BB0E01      ADD     [BP+DI+010E],BH
1784:0150 B400          MOV     AH,00
1784:0152 E80B00        CALL    0160

±z¥i¥H¬Ý¨£¤W­±¥Õ¦âªº³¡¥÷³£¤£¬O§Ú­Ìªºµ{¦¡¡A¬Æ¦Ü±zÁ٬ݤ£À´¡A¦ý¬O¨SÃö«Y¡A¥¦­Ì³£¥i¥H¦b DUBUG ¤¤³Q°õ¦æ¡A¨Ò¦p±z¤@¶i¤J DEBUG ¤U

-T [Enter]

AX=0000  BX=0000  CX=00A0  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1784  ES=1784  SS=1784  CS=1784  IP=0112   NV UP EI PL NZ NA PO NC
1784:0112 66            DB      66

³o®É¤w¸g±q 1784:0100 ¸õ¨ì 1784:0116 ªº mov eax,x¡AÁöµM DEBUG ¤Ï²ÕĶ¬° DB 66 ¤Î mov ax,x ( x ¦ì©ó¦ì§} 0102 ³B )¡A¦ý¬O§Ú­Ì¤£ºÞ¥¦¡A¤´µM¦A¤U T «ü¥O°lÂÜ¥¦¡G

-T [Enter]

AX=1170  BX=0000  CX=00A0  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1784  ES=1784  SS=1784  CS=1784  IP=0116   NV UP EI PL NZ NA PO NC
1784:0116 66            DB      66

µ²ªG¬O DEBUG ¤´¯à°õ¦æ¡A¥B¸õ¨ì¤U¤@­Ó¥¿½T¦ì§}¡Amov ebx,y¡A³o¦LÃÒ¤p¤ì°¸«e­zªº¸Ü¡AÁöµMÅã¥Ü¤£¥¿½T¡A¦ý¤´¥i¥¿½T°õ¦æ¡C©³¤U§Ú­Ìª½±µ°õ¦æ¨ì¦ì§} 143¡G

-G 143 [Enter]
11170*13880=
AX=023D  BX=0105  CX=8000  DX=003D  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1784  ES=1784  SS=1784  CS=1784  IP=0143   NV UP EI PL ZR NA PE NC
1784:0143 66            DB      66

±z¬Ý¤W­±µµ¦â³¡¥÷¬O°õ¦æªºµ²ªG¡C¦n¡A©³¤U¦A°õ¦æ¨â¦¸°lÂÜ«ü¥O¡G

-T [Enter]

AX=023D  BX=0105  CX=8000  DX=003D  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1784  ES=1784  SS=1784  CS=1784  IP=0149   NV UP EI PL NZ NA PO NC
1784:0149 0F            DB      0F
-T [Enter]

AX=023D  BX=0105  CX=8000  DX=003D  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1784  ES=1784  SS=1784  CS=1784  IP=014D   NV UP EI PL NZ NA PO NC
1784:014D BB0E01        MOV     BX,010E
-T [Enter]

AX=023D  BX=010E  CX=8000  DX=003D  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=1784  ES=1784  SS=1784  CS=1784  IP=0150   NV UP EI PL NZ NA PO NC
1784:0150 B400          MOV     AH,00

±z¦AÆ[¹î¤W­zÂŦ⪺¦ì§}¨Ã¹ï·Ó³oùØ¡A±z·|µo²{¡A§Y¨Ï¤Ï²ÕĶ®É¦ì§}¿ù»~¡A¦ý¬O°lÂÜ®ÉÁÙ¬O·|¦b¥¿½Tªº¦ì§}°±¤U¨Ó¡C¤£¹L±z¦b°lÂܦ¹Ãþµ{¦¡®É¡AÁÙ¬O±o¤p¤ß¡A¤×¨ä¬O¤U¡yG¡z«ü¥O®É¡C¦pªG±z¥Î SYMDEB °£¿ù¡Aµ²ªG¤]¬O¤@¼Ë¡A¤Ï²ÕĶ¥i¯à·|¿ù»~¡A¦ý¬O°lÂܩΰõ¦æ®É¤£·|¿ù»~¡C³o­Óµ{¦¡ªº¨ä¥L³¡¥÷³£¤£Ãø¡A¤p¤ì°¸´N¤£¸ÑÄÀ¤F¡C

¥Î DEBUG32.EXE °£¿ù

ÁöµM DEBUG/SYMDEB ¥i¥H°£¿ù¡A¦ý¬OµLªk¥¿½TÅã¥Ü 386 «ü¥O¨Ó¡AÁ`¬O¬ü¤¤¤£¨¬¡A¤£¹L©¯¦n³o¤@¤Á¤w¸g¶êº¡¸Ñ¨M¤F¡A¨º´N¬O DEBUG32.EXE¡C¥i¨ì¤j³°ªºAoGo ·J½s¤p¯¸¤U¸ü¡A¸ÑÀ£ÁY«á´N¥iª½±µ¨Ï¥Î¡A¤£¶·¦w¸Ë¡C

DEBUG32 ¥Îªk»P DEBUG Ãþ¦ü¡A¦ý¥\¯à±j¤j¡A°£¤F¥i¶i¦æ¹ï 80386 ¥H¤Wªº CPU «ü¥O¶°°£¿ù¥~¡A¤]¼W¥[¤F³\¦h¤ñ DEBUG §ó±j¤Æªº¥\¯à¡A¨Ò¦p¥i¥H¹ïŪ¥X©Î¼g¤J°O¾ÐÅé®É³]©w¤¤Â_ÂI¡A¥H¤£¦P¸ê®Æ§ÎºAÅã¥Ü°O¾ÐÅ餺®eµ¥µ¥¡A¤£¹L©³¤U¶È´N³o¤@³¹¥Î±o¨ìªº³¡¥÷»¡©ú¡C­º¥ý¥Î DEBUG32.EXE ¸ü¤J­n°£¿ùªºµ{¦¡¡AMUL32.COM¡AµM«á«ö¡yr¡zÁäÆ[¹î¼È¦s¾¹¡G

E:\HOMEPAGE\SOURCE>debug32 mul32.com [Enter]
Unable to take over DPMI address query
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994

CPU = Pentium, Virtual 8086 Mode, Id/Step = 058C, A20 enabled
-r [Enter]
AX=0000  BX=0000  CX=00A0  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=2739  ES=2739  SS=2739  CS=2739  IP=0100  NV UP DI PL NZ NA PO NC
2739:0100 EB10             JMP     Short 0112
-t [Enter] ¡÷°lÂܨì¥Dµ{¦¡
AX=0000  BX=0000  CX=00A0  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=2739  ES=2739  SS=2739  CS=2739  IP=0112  NV UP DI PL NZ NA PO NC
2739:0112 66A10201         MOV     EAX,[0102]
Trace Interrupt

¦¹®É±N­n§â³Q­¼¼Æ¸ü¤J EAX ùØ¡A¦ý¬O DEBUG32 ¶È¶ÈÅã¥Ü¼È¦s¾¹¸û§C¦ìªº 16 ¦ì¤¸¡A¥i¥H¤U¡yr32¡z«ü¥O¡A¨Ï DEBUG32 Åã¥Ü¼È¦s¾¹ªº©Ò¦³¦ì¤¸¡A¦P²z¡yr16¡z·|¨Ï±o DEBUG32 ¶ÈÅã¥Ü¼È¦s¾¹¸û§C¦ìªº 16 ¦ì¤¸¡C¨£¤U­±¨BÆJ¡G

-r32 [Enter] ¡÷¨Ï¼È¦s¾¹Åã¥Ü©Ò¦³¦ì¤¸
EAX=00000000  EBX=00000000  ECX=000000A0  EDX=00000000  EBP=00000000
ESI=00000000  EDI=00000000  FS=2739  GS=2739   SS=2739  ESP=0000FFFE
DS=2739  ES=2739   CS=2739  EIP=00000112   NV UP DI PL NZ NA PO NC
2739:0112 66A10201         MOV     EAX,[0102]
-t [Enter]
EAX=00011170  EBX=00000000  ECX=000000A0  EDX=00000000  EBP=00000000
ESI=00000000  EDI=00000000  FS=2739  GS=2739   SS=2739  ESP=0000FFFE
DS=2739  ES=2739   CS=2739  EIP=00000116   NV UP DI PL NZ NA PO NC
2739:0116 668B1E0601       MOV     EBX,[0106]
Trace Interrupt

©³¤U¤p¤ì°¸¤£¸Ô²Ó°lÂܤF¡Aª½±µ°õ¦æ¨ì¦L¥X³Q­¼¼Æ¡C¥ý¿é¤J¡yu¡z¤Ï²ÕĶ¡A¬Ý¬Ý­n°õ¦æ¨ì¨º¤@¦ì§}¡C

-u [Enter] ¡÷¤Ï²ÕĶµ{¦¡½X
2739:011B 66F7E3           MUL     EBX
2739:011E 66A30A01         MOV     [010A],EAX
2739:0122 6689160E01       MOV     [010E],EDX
2739:0127 BB0201           MOV     BX,0102h
2739:012A B400             MOV     AH,00h
2739:012C E83100           CALL    0160
2739:012F B402             MOV     AH,02h
2739:0131 B22A             MOV     DL,2Ah
2739:0133 CD21             INT     21h
2739:0135 BB0601           MOV     BX,0106h
2739:0138 B400             MOV     AH,00h
2739:013A E82300           CALL    0160

»P­ì©l½X°t¦X¤ñ¹ï¡A«Ü§Ö´Nª¾¹D¤W­±¥Õ¦â¦ì§}¡A012F¡A´N¬O°õ¦æ§¹¦L¥X³Q­¼¼Æ«áªº¤U¤@«ü¥O¡C¿é¤J¡yg 12f¡zªí¥Ü°õ¦æ¨ì 12F ³o­Ó¦ì§}¡G

-g 12f ¡÷¥Ñ²{¦bªº IP ¦ì§}°õ¦æ¨ì 12F ³B°±¤î
EAX=4DC90100  EBX=00010101  ECX=00007000  EDX=00000030  EBP=00000000
ESI=00000000  EDI=00000000  FS=2739  GS=2739   SS=2739  ESP=0000FFFE
DS=2739  ES=2739   CS=2739  EIP=0000012F   NV UP DI PL ZR NA PE NC
2739:012F B402             MOV     AH,02h
Instruction Breakpoint

§A¥i¯à¬Ý¨£¿Ã¹õ¤W¼È¦s¾¹­È¡A¦³¦n´X³B¤Ï¥Õ¡A³o¬O¥¿±`ªº¡A­ì¨Ó¨C¦¸°±¤U¨Ó®É¡A DEBUG32 ·|§â§ïÅܪº¼Æ­È¥H¤Ï¥Õªí¥Ü¡C¦ý¬O·Ó²z»¡¡AÀ³¸Ó·|¦b¿Ã¹õ¤WÅã¥Ü¥X³Q­¼¼Æ¤~¹ï¡A¤£¹L«o¨S¬Ý¨£¡A³o¤]¬O¥¿±`ªº¡A­ì¨Ó DEBUG32 ªº°õ¦æµe­±»P°£¿ùµe­±¬O¤À¶}¨Óªº¡A³o¼Ë¤~¤£·|§âµe­±§Ë±o¤@¹Î¶Ã¡C¦pªG­nÆ[¹î°õ¦æµe­±¥i¥H¿é¤J¡yFL¡z¡G

E:\HOMEPAGE\SOURCE>debug32 mul32.com
Unable to take over DPMI address query
Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994

11170

¦pªG­n¤Á¦^°£¿ùµe­±®É¡A«ö¤U¥ô·NÁä´N¥i¥H¤F¡CFL ¬O flip¡A§Y¤Á´«¤§·N¡C¨ä¥LÁÙ¦³³\¦h«ü¥O¡A¨Ò¦p³]©w¤¤Â_ÂI¡BÂ÷¶} DEBUG32 µ¥µ¥³£»P DEBUG/SYMDEB ¬Û¦ü¡A¤]¥i¥H©ó DEBUG32 ´£¥Ü²Å¸¹¡y-¡z¤§«á«ö¡y?¡z±o¨ì¨ó§U¡A¤p¤ì°¸´N¤£¦h»¡¤F¡C


¦b DOS ¨t²Î¤¤ªº 32 ¦ì¤¸©w§}¤è¦¡

¦b 8086/8088/80286 µ¥ CPU ¥u¯à¥Î BX¡BSI¡BDI¡BBP¡BSP µ¥¼È¦s¾¹©w§}¡A¦ý¬O¦b 80386 ¤Î¨ä°ª¶¥ªº CPU ³£¥i¥H¨Ï¥Î¥ô¦óªº³q¥Î¼È¦s¾¹©w§}¡A¨Ò¦p EAX¡BECX¡BEDX ³£¥i¥H¥Î¨Ó©w§}¡C¨Ò¦p

        mov     bx,[eax]
        mov     bl,[edx]

¤£¹L AX¡BCX¡BDX µ¥¼È¦s¾¹§Y¨Ï¤w¸g«Å§i .386 «á¡A¤´¤£¯à¥Î¨Ó©w§}¡A©Ò¥H¤U­±ªº¼gªk¡A¤´¬O¿ù»~ªº¡G

        mov     bx,[ax]
        mov     bl,[dx]

¨Ï¥Î³o¨Ç 32 ¦ì¤¸¼È¦s¾¹©w§}ÁÙ±oª`·N³o¨Ç¼È¦s¾¹¬O 32 ¦ì¤¸ªº¡A¦Ó¦b¯u¹ê¼Ò¦¡¤¤ªº¦ì§}¥u»Ý 16 ¦ì¤¸¡A¸û°ªªº 16 ¦ì¤¸¬O¥Î¤£µÛªº¡C©Ò¥H¦pªG­n¨Ï¥Î³o¨Ç 32 ¦ì¤¸¼È¦s¾¹©w§}®É¡A¥²¶·½T©w¥¦­Ì¸û°ªªº 16 ¦ì¤¸¤§­È¬°¹s¡A§_«h·|³y¦¨¤£¥i¹w´Á¤§¿ù»~¡C

80386 ¹ï¼È¦s¾¹©w§}¤è¦¡ÁÙ°µ¤F³Ì¨Î¤Æªº§V¤O¡C¦]¬°¦bµ{¦¡ùر`¥Î¦r²Õ¡BÂù¦r²Õµ¥¸ê®Æ¡A©Ò¥H¬°¤F§ïµ½®Ä²v¡A¦b 80386 ªº©w§}¤è¦¡ÁÙ¥i¥H¼g¦¨¹³©³¤Uªº¼Ò¦¡

        mov     cx,x[eax*n+y]
        mov     cx,x[ebx+eax*n+y]

¤W¨â¦¡ªº n ¥i¥H¬O 1¡B2¡B4¡B8 ¥|ºØ¼Æ­È¡Ax ¬OÅÜ¼Æ ( °}¦C ) ¦W¡Ay ¬O±`¼Æ¡C¦b³oºØ©w§}¤è¦¡ùØ¡A¦³¡y*n¡zªº¼È¦s¾¹ºÙ¬°¯Á¤Þ¼È¦s¾¹¡A³Ñ¤Uªº¥t¤@­Ó¼È¦s¾¹ºÙ¬°°ò©³¼È¦s¾¹¡F°²¦p¨S¦³¡y*n¡zªº¹Bºâ¡A«h¼g¦b«á­±ªº¬O¯Á¤Þ¼È¦s¾¹¡A«e­±ªº¬O°ò©³¼È¦s¾¹¡F°²¦p¥u¦³¤@­Ó¼È¦s¾¹¡A«h¦¹¼È¦s¾¹¬O°ò©³¼È¦s¾¹¡C¥Î³oºØ¤è¦¡©w§}®É¡A¤º©wªº¬q¼È¦s¾¹¬O¥Ñ°ò©³¼È¦s¾¹¨M©w¡A°ò©³¼È¦s¾¹¬° EBP ®É¤º©wªº¬q¼È¦s¾¹¬° SS¡A§_«h§¡¬° DS¡C½Ð¬Ý¥H¤U¨Ò¤l¡G

        mov     ax,x[eax*2+ebp]     ;¨ú±o¦ì§} SS:[EAX*2+EBP+x] ¤§­È¨Ã¦s©ó AX
        mov     ax,x[eax+ebp*2]     ;¨ú±o¦ì§} DS:[EAX+EBP*2+x] ¤§­È¨Ã¦s©ó AX
        mov     ax,x[ebp*1]         ;¨ú±o¦ì§} SS:[EBP] ¤§­È¨Ã¦s©ó AX
        mov     ax,x[ebx*1]         ;¨ú±o¦ì§} DS:[EBX] ¤§­È¨Ã¦s©ó AX

¥H¤W¥|­Ó¨Ò¤l³£¨S«ü©w¬q¼È¦s¾¹¡A¦ý¬O¦³®É¬O¦Û DS ¨ú±o¡A¦³®É¬O¦Û SS ¨ú±o¡A¤£¥i¤£·V¡C°²¦p±z·Q§ïÅܦs¨úªº¬q¦ì§}¤]¥i¥H¡A´N¬O¦b¦ì§}«e¥[¤W¡y¬q¼È¦s¾¹:¡z§Y¥i¡A¨Ò¦p±z·Q¨ú±o¦ì§} FS:[EDX*2] ªº¼Æ­È¡A¥i¥H¥Î¤U­±ªº¤èªk¡G

        mov     ax,fs:[edx*2]

©³¤U¤p¤ì°¸¼¶¼g¤@­Óµ{¦¡¡AADDR32.ASM¡A¦¹µ{¦¡¥i¥H¦b¿Ã¹õ¤W¦L¥X¤@­Ó±m¦â¦r¦ê¡A¥¦°£¤F§Q¥Î ECX¡BEDX ©w§}¥~¡AÁ٥ΤF¤@­Ó 80386 ·sªº¬q¼È¦s¾¹¡AGS¡A©w§}¡C

;***************************************
stack   segment stack   ;02 °ïÅ|¬q
        dw      80h dup (?)
stack   ends
;***************************************
data    segment         ;06 ¸ê®Æ¬q
string  db      2 dup ('0123456789ABCDEF'),0
data    ends
;***************************************
        .386            ;10 ¨Ï¥Î 80386
code    segment use16   ;11 ¨Ï¥Î 16 ¦ì¤¸©w§}¤è¦¡
        assume  cs:code,ds:data
;---------------------------------------
start:  push    ds      ;14 µ{¦¡½X¬q¶}©l
        push    0       ;15 ±À¤J¥ß§Y­È
        mov     ax,data
        mov     ds,ax

        mov     ax,0b800h
        mov     gs,ax   ;20 ¨Ï GS «ü¦VÅã¥Ü°O¾ÐÅé

        sub     edx,edx ;22 EDX «ü¦VÅã¥Ü°O¾ÐÅé
        mov     bh,0    ;23 BH ¬°¦rªºÃC¦â©Î©³¦â
        mov     ecx,edx ;24 ECX «ü¦V¦r¦ê¦ì§}
        mov     cx,offset string

next:   mov     al,[ecx]
        mov     ah,bh
        and     ah,0fh  ;29 ¨ÏÃC¦â¦b 0¡ã0fh ¤§¶¡¡A©³¦â¬°¶Â¦â
        mov     gs:[10*160+edx*2],ax    ;30
        shl     ah,4    ;31 ¨Ï¤å¦r¬°¶Â¦â¡A©³¦â¦b 0¡ã0fh ¤§¶¡
        mov     gs:[11*160+edx*2],ax    ;32
        inc     bh
        inc     edx
        inc     ecx
        or      al,al
        jnz     next

        mov     ax,4c00h
        int     21h
;---------------------------------------
code    ends
;***************************************
        end     start

²ÕĶ³o­Óµ{¦¡¡A¥H¤Î°õ¦æµe­±¦p¤U¡G

ADDR32 °õ¦æµe­±

ºîÆ[³o­Óµ{¦¡¡A³£¨S¦³µo²{¥ô¦ó¦b¿Ã¹õ¤W¦L¥X¦r¨ÓªºªA°Èµ{¦¡¡A¦ý¬O«o¯uªº¦L¥X¦r¨Ó¡A¤£¶È¦p¦¹¡AÁÙ¬O±m¦âªº¡A³o¬O«ç»ò°µ¨ìªº©O¡H

VGA/AGP Åã¥Ü°O¾ÐÅé¦ì§}

­ì¨Ó IBM PC ¤Î¨ä¬Û®e¾÷ºØ°õ¦æ DOS §@·~¨t²Î®É¡A©ÒÅã¥Üªº¤º®e³£¦s¦b¤@¶ôºÙ¬°Åã¥Ü°O¾ÐÅé ( ¤]¦³¤HºÙ¬°µø°T°O¾ÐÅé ) ªº°O¾ÐÅ餺¡A©Ò¥H¦pªG§Ú­Ìª½±µ§ïÅÜ°O¾ÐÅ餺®e¡A´N¥i¥H§ïÅÜÅã¥Üªº¤å¦r¡C¦Ó³o¨Ç PC ¾÷ºØ¹ïÅã¥Ü¼Ò¦¡¤À¦¨¤å¦r¼Ò¦¡»Pø¹Ï¼Ò¦¡¨âºØ¼Ò¦¡¡A¤å¦r¼Ò¦¡§â¿Ã¹õ¤À¦¨ 80*25 ©Î 40*25 ¨âºØ¡C

±`¥Îªº¬O 80*25 ªº¤å¦r¼Ò¦¡¡A¦¹¼Ò¦¡¨C¦C¥iÅã¥Ü 80 ­Ó¤å¦rÁ`¦@ 25 ¦C ( ¥Ñ¥ª¦Ó¥kºÙ¬°¦C¡A¥Ñ¤W¦Ó¤UºÙ¬°¦æ )¡A©Ò¥H¤@­Óµe­±¥i¥HÅã¥Ü 2000 ­Ó¤å¦r¡A¥Î¥h 2000 ­Ó¦ì¤¸²Õ¡A¦A¥[¤W¨C­Ó¤å¦r³£¥Î¤@­Ó¦ì¤¸²Õ¨Óªí¥ÜÅã¥ÜªºÃC¦â¡C³o¼Ë­pºâ°_¨Ó¡A¦b 80*25 ¤å¦r¼Ò¦¡¤U¡AÅã¥Ü¤@­Óµe­±»Ý 4000 ¦ì¤¸²Õ¡A¬ù 4KB ªº°O¾ÐÅé¡C

¹ï±m¦âÅã¥Ü¥d ( CGA/EGA/VGA/AGP ) ¨Ó»¡¡AÅã¥Ü°O¾ÐÅé¥Ñ¬q¦ì§} 0B800H ³B¶}©l¡A¿Ã¹õ¤W²Ä¹s¦C²Ä¹s¦æªº¤å¦r¦b¦ì§} B800:0000 ³B¡A¨äÃC¦â¦b B800:0001¡A²Ä¹s¦C²Ä¤@¦æ¦b B800:0002¡A¨äÃC¦â¦b B800:0003¡K¡K¡C©Ò¥H¨C¤@¦C»Ý¦û¥Î 160 ­Ó¦ì¤¸²Õ¡A¬G²Ä¤@¦æ«K±q¦ì§} B800:00A0 ¶}©l ( 160d=0A0h )¡A¨Ì¦¹Ãþ±À¡A²Ä R ¦Cªº²Ä¹s­Ó¦r¬O±q¦ì§} 160*(R¡Ð1) ¶}©l¡C½Ð°Ñ¦Ò¤U¹Ï¡G

Åã¥Ü°O¾ÐÅé¦ì§}»¡©ú¹Ï
¤W¹Ï¤¤ªº¨C¤@­Ó¶À¦â®Ø®Ø¬Oªí¥Ü¿Ã¹õ¤W¤@­Ó¦r¤¸¡A¹Ï¤W¥ª½t¤Î¤W½t¦³²Ä´X¦æ²Ä´X¦C¡A¦Ó®Ø®Ø¤ºªº¥Õ¦â¼Æ¦r´N¬O¸Ó¦æ¸Ó¦C¦bÅã¥Ü°O¾ÐÅ骺¦ì§}¡A¹Ï¤¤ªº¦ì§}¬Ò¥H¤Q¤»¶i¦ìªí¥Ü¡C³Ì«á¦A¬Ý¬Ý²Ä 24 ¦C²Ä 79 ¦æªº¦ì§}¬O 0F9E¡A¨äÃC¦â©ñ¦b¦ì§} 0F9F¡A±q 0H ¨ì 0F9FH ¦@ 0FA0H ¦ì¤¸²Õ¡A¤Q¤»¶i¦ìªº 0FA0 §Y¤Q¶i¦ìªº 4000¡C

¦Ü©ó©ÒÅã¥Ü¦r¤¸ªºÃC¦â¬O¥Ñ¤ñÅã¥Ü°O¾ÐÅé°ª¤@­Ó¦ì§}ªø«×¤@­Ó¦ì¤¸²Õªº¤º®e¨Ó¨M©w¡C¦¹¦ì¤¸²Õ¸û°ªªº¥|­Ó¦ì¤¸¨M©w­I´ºÃC¦â¡A¸û§Cªº¥|­Ó¦ì¤¸¨M©w¦rªºÃC¦â¡CÃC¦â¦p¦óªí¥Ü½Ð°Ñ¦Ò²Ä¤Q¤E³¹ªº»¡©ú¡C

­ì©lµ{¦¡ªº²Ä 22¡ã25 ¦æ¬O¥Î¨Ó³]©w­nÅã¥Üªº¦r¦ê¦ì§}¡BÅã¥Ü°O¾ÐÅé¦ì§}¤ÎÃC¦â¥X©l­È¡A²Ä 27¡ã29 ¦æ¨ú±o¦r¤ÎÃC¦â¶ñ¤J AX ùØ¡A²Ä 30 ¦æ§â AX ¤§­È¶ñ¤JÅã¥Ü°O¾ÐÅ餤¡A´N¯à¦b¿Ã¹õ¤WÅã¥Ü±a¦³ÃC¦âªº¦r¨Ó¡C

PUSH ¼Æ­È

¦b 8088/8086 CPU ùØ¡A¥u¯à§âÅܼƩμȦs¾¹±À¤J°ïÅ|¡A¦ý¦b 80186 µ¥¯Å¥H¤Wªº CPU ¤]¥i¥Hª½±µ¨Ï¤@­Ó¼Æ±À¤J°ïÅ|¡C©Ò¥H¥»¨Ó¤@¶i¤Jµ{¦¡®É­n«O¯d­ì DS:0000 ªº«ü¥O¡Aµy§@­×§ï¥H¼W¶i®Ä²v¡AÅܦ¨­ì©lµ{¦¡ 14¡ã17 ¦æ¡C°£¦¹¤§¥~¡A¦b 80386 µ¥¯Å¥H¤Wªº CPU ÁÙ¥i¨Ï¥Î PUSHA/PUSHAD «ü¥O¡C

PUSHA/PUSHAD »P POPA/POPAD «ü¥O

PUSHA «ü¥O¬O§â AX¡BBX¡BCX¡BDX¡BSP¡BBP¡BSI¡BDI ¤K­Ó¼È¦s¾¹¤@¦¸¥þ³¡±À¤J°ïÅ|¡A±zª`·N¨ì¥¦¤]¥i¥H§â­ì¨Óªº SP ±À¤J°ïÅ|¡A©Ò¿×­ì¨Ó¬O«üÁÙ¨S°õ¦æ PUSHA ®Éªº SP¡CPOPA ¬O¼u¥X°ïÅ|³»ªº 8 ­Ó¦r²Õ¡A¨Ã¨Ì§Ç¦s¤J DI¡BSI¡BBP¡BSP¡BDX¡BCX¡BBX¡BAX ùØ¡C±z¥i¥H§â PUSHA/POPA ªº¡yA¡z·Q¦¨¬O all¡C

PUSHAD ¬O§â EAX¡BEBX¡BECX¡BEDX¡BESP¡BEBP¡BESI¡BEDI ¤K­Ó¼È¦s¾¹¤@¦¸¥þ³¡±À¤J°ïÅ|¡A¦P²z POPAD ¬O§â°ïÅ|ùتº¤K­ÓÂù¦r²Õ¼u¥X¡A¨Ã¨Ì§Ç¦s¤J EDI¡BESI¡BEBP¡BESP¡BEDX¡BECX¡BEBX¡BEAX ùØ¡APUSHAD/POPAD ùتº¡yD¡z¬O«üÂù¦r²Õ¤§·N¡C


80386 ¨ä¥L·s¼W«ü¥O

©³¤U¦A¤¶²Ð´X­Ó 80386 ·s¼Wªº«ü¥O¡G

BT «ü¥O

³o­Ó«ü¥OºÙ¬°¡ubit test¡v¡A¦ì¤¸´ú¸Õ¤§·N¡A»yªk¬°¡G

        BT      ÅܼƩμȦs¾¹,¼È¦s¾¹
        BT      ÅܼƩμȦs¾¹,¥ß§Y­È

³o¨âºØ»yªkªº¡uÅܼƩμȦs¾¹¡vºÙ¬°¥Øªº¹Bºâ¤¸¡A«á­±ªº¼È¦s¾¹©Î¥ß§Y­ÈºÙ¬°¡u¨Ó·½¹Bºâ¤¸¡v¡CBT «ü¥O¬O¦b¥Øªº¹Bºâ¤¸¤¤¿ï©w¤@­Ó¦ì¤¸¡A±N¥¦½Æ»s¨ì¶i¦ìºX¼Ð¡A¦Ó©Ò¿ï©wªº¬O²Ä´X­Ó¦ì¤¸¡A¥Ñ¨Ó·½¹Bºâ¤¸«ü©w¡C°õ¦æ§¹«á¡A­ì¨Óªº¥Øªº¹Bºâ¤¸»P¨Ó·½¹Bºâ¤¸ªº­È³£¤£ÅÜ¡C¦b²Ä¤@­Ó»yªk¤¤¡A¥Øªº¹Bºâ¤¸»P¨Ó·½¹Bºâ¤¸ªºªø«×¡A³£­n¬Û¦P¡A¥i¥H³£¬O 16 ¦ì¤¸¡A©Î³£¬O 32 ¦ì¤¸¡C¦b²Ä¤G­Ó»yªkùØ¡AÅܼƩμȦs¾¹¥i¥H¬° 16 ¦ì¤¸©Î 32 ¦ì¤¸¡A¦Ó¥ß§Y­È³Ì¦h¥u¯à¬O 8 ­Ó¦ì¤¸ªºªø«× ( ¨Æ¹ê¤W 8 ­Ó¦ì¤¸¯àªí¥Üªº¼Æ¡A¥i±q 0 ¨ì 255¡A¦­¤w¯à³B²z 16 ¦ì¤¸©Î 32 ¦ì¤¸ªºÅܼƩμȦs¾¹¤F)¡C¨Ò¦p¡G

        mov     edx,1001b
        bt      edx,3

¤W­±¨â±ø«ü¥O°õ¦æ§¹¡AEDX ¤´¬° 1001B¡A¦Ó¶i¦ìºX¼Ð·|³Q³]©w¡A¥ç§Y¶i¦ìºX¼Ð¬° 1¡A¦b DEBUG ùØÅã¥Ü CY¡A³o¬O¦]¬° EDX ªº²Ä¤T­Ó¦ì¤¸¬° 1 ( ¬õ¦âªº¡u1¡v)¡A¨Ì·ÓºD¨Ò¡A²Ä´X­Ó¦ì¤¸³£¬O±q 0 ¶}©l¡C

BTC «ü¥O

³o­Ó«ü¥OºÙ¬°¡ubit test and complement¡v¡A¦ì¤¸´ú¸Õ¨Ã°µ¸É¼Æ¤§·N¡A¨ä»yªk¬O¡G

        BTC     ÅܼƩμȦs¾¹,¼È¦s¾¹
        BTC     ÅܼƩμȦs¾¹,¥ß§Y­È

BTC «ü¥O¬O¦b¥Øªº¹Bºâ¤¸¤¤¿ï©w¤@­Ó¦ì¤¸¡A±N¥¦½Æ»s¨ì¶i¦ìºX¼Ð¡A¨Ã¨Ï¸Ó¦ì¤¸°µ¸É¼Æ¹Bºâ ( ¦pªG­ì¨Ó¸Ó¦ì¤¸¬° 1¡A´NÅܦ¨ 0¡F¦pªG­ì¨Ó¸Ó¦ì¤¸¬° 0¡A´NÅܦ¨ 1 )¡A¦Ó©Ò¿ï©wªº¬O²Ä´X­Ó¦ì¤¸¡A¦b¨Ó·½¹Bºâ¤¸«ü©w¡C¥Øªº¹Bºâ¤¸©M¨Ó·½¹Bºâ¤¸ªº­­¨î¡A©M BT «ü¥O¤@¼Ë¡C¨Ò¦p¡G

        mov     edx,1001b
        btc     edx,3
        mov     ecx,1001b
        btc     ecx,2

¸g¹L«e¨â¹D«ü¥O«á¡AEDX Åܬ° 1¡A¶i¦ìºX¼Ð³Q³]©w¡C¸g¹L«á¨â¹D«ü¥O«á¡AECX Åܬ° 1101B¡A¶i¦ìºX¼Ð³Q²M°£ ( ¥ç§Y¶i¦ìºX¼ÐÅܬ° 0¡A¦b DEBUG Åã¥Ü NC )¡C

BTR «ü¥O

BTR ¬O¡ubit test and reset¡v¤§·N¡A·N§Y¦ì¤¸´ú¸Õ¨Ã²M°£¡A¨ä»yªk¬O¡G

        BTR     ÅܼƩμȦs¾¹,¼È¦s¾¹
        BTR     ÅܼƩμȦs¾¹,¥ß§Y­È

BTR «ü¥O·|¦b¥Øªº¹Bºâ¤¸¤¤¿ï©w¤@­Ó¦ì¤¸¡A±N¥¦½Æ»s¨ì¶i¦ìºX¼Ð¡A¨Ã²M°£¸Ó¦ì¤¸¡A¨Ï¤§Åܬ° 0¡A¦Ó©Ò¿ï©wªº¬O²Ä´X­Ó¦ì¤¸¡A¦b¨Ó·½¹Bºâ¤¸«ü©w¡C¥Øªº¹Bºâ¤¸©M¨Ó·½¹Bºâ¤¸ªº­­¨î¡A©M BT «ü¥O¤@¼Ë¡C¨Ò¦p¡G

        mov     edx,1001b
        btr     edx,3
        mov     ecx,1001b
        btr     ecx,1

¸g¹L³o¨â¹D«ü¥O«á¡AEDX Åܬ° 1¡A¶i¦ìºX¼Ð³Q³]©w¡C¦A¸g¹L«á¨â¹D«ü¥O¡AECX Åܬ° 1001B¡A¶i¦ìºX¼Ð³Q²M°£¡C

BTS «ü¥O

BTS ¬O¡ubit test and set¡v¤§·N¡A·N§Y¦ì¤¸´ú¸Õ¨Ã³]©w¡A¨ä»yªk¬O¡G

        BTS     ÅܼƩμȦs¾¹,¼È¦s¾¹
        BTS     ÅܼƩμȦs¾¹,¥ß§Y­È

BTS «ü¥O·|¦b¥Øªº¹Bºâ¤¸¤¤¿ï©w¤@­Ó¦ì¤¸¡A±N¥¦½Æ»s¨ì¶i¦ìºX¼Ð¡A¨Ã³]©w¸Ó¦ì¤¸¡A( ³]©w¸Ó¦ì¤¸ªº·N«ä¬O¡A¨Ï¸Ó¦ì¤¸Åܬ° 1 )¡A¦Ó©Ò¿ï©wªº¬O²Ä´X­Ó¦ì¤¸¡A¦b¨Ó·½¹Bºâ¤¸«ü©w¡C¥Øªº¹Bºâ¤¸©M¨Ó·½¹Bºâ¤¸ªº­­¨î¡A©M BT «ü¥O¤@¼Ë¡C¨Ò¦p¡G

        mov     edx,1001b
        bts     edx,2

¸g¹L³o¨â¹D«ü¥O«á¡AEDX Åܬ° 1101B¡A¶i¦ìºX¼Ð³Q²M°£¡C


µù¤@¡G«e¸m½X ( ¤S¥s«ü¥O¦r­º¡AInstruction Prefixes )

³o¤@³¹¡A´£¨ì¤F§Y¨Ï¬O¦b DOS ³oºØ 16 ¦ì¤¸ªº§@·~¨t²Î¤¤¡A¤]¯à°÷¤@¦¸³B²z 32 ¦ì¤¸ªº¸ê®Æ¡A·íµM±z±o¦³ 80386 ©Î¤ñ¥¦§ó°ªµ¥¯Åªº CPU¡A¤p¤ì°¸¤]¤w¹ê§@¤F³oºØµ{¦¡¡C¦b«e­±§Ú­Ì¥H DEBUG/SYMDEB °£¿ù³o¤@Ãþªºµ{¦¡®É¡A·|µo²{¦ü¥G³o¨Ï¥Î¨ì EAX µ¥ 32 ¦ì¤¸ªº¼È¦s¾¹©Î¹Bºâ¤¸®É¡A«e­±³£·|¦³¤@­Ó¦ì¤¸²Õ¡A66H¡A¬O DEBUG/SYMDEB ¤£»{ÃѪº¡C³o­Ó¦ì¤¸²Õ¬O¤°»ò©O¡H

·í§Ú­Ì¦b­ì©l½X¤¤¡A¦pªG¨S¦³©w¸q¡u.386¡v¤§Ãþªº°²«ü¥O¡A¨º»ò MASM ·|°²©w³o­Óµ{¦¡¬O­n¦b 16 ¦ì¤¸ªºÀô¹Ò¤¤¡A¨Ò¦p DOS¡A°õ¦æªº¡A©Ò¦³ªº¼È¦s¾¹¡B¹Bºâ¤¸¡B¦ì§}µ¥¬Ò¬° 16 ¦ì¤¸¡A¦p¹J¡uMOV AX,1234H¡v¡A«h·|³Q½s¦¨¡uB8 34 12¡v¡A¤]´N¬O»¡¡uMOV AX,¡v³Q MASM ²ÕĶ¦¨ B8¡A¦Ó¹Bºâ¤¸¡u1234H¡v²ÕĶ¬°¡u34 12¡v¡C¦pªG¦b­ì©l½X¤¤©w¸q¤F¡u.386¡v¤§Ãþªº°²«ü¥O¡A¨º»ò MASM ·|°²©w¦¹µ{¦¡·|¦b 32 ¦ì¤¸ªºÀô¹Ò¤¤¡A¨Ò¦p Windows 9x/Me/NT/XP µ¥¡A°õ¦æªº¡A©Ò¦³ªº¼È¦s¾¹¡B¹Bºâ¤¸¡B¦ì§}µ¥¬Ò¬° 32 ¦ì¤¸¡A¦p¹J¡uMOV EAX,1234H¡v¡A¤´µM·|³Q½s½X¦¨¡uB8 34 12 00 00¡v¡A¡uMOV EAX,¡v¤´³Q MASM ²ÕĶ¦¨ B8¡C

¥H¤W©Ò»¡ªº¬O¤@¯ë±¡§Î¡C¤£¹L¦b³o¤@³¹ùØ¡A¤p¤ì°¸¦b­ì©l½XùØ©w¸q¡u.386¡v¡A¦ý¬O¤S¦b°Ï¬q©w¸q¤¤¨Ï¥Î¡uUSE16¡v¡Aªí¥Ü¥i¥H¨Ï¥Î 32 ¦ì¤¸ªº¼È¦s¾¹¡B¹Bºâ¤¸µ¥¡A«o¤S¬° 16 ¦ì¤¸ªºµ{¦¡¡C³o®É MASM ·|¦b½s¦¨¾÷±ñ½X®É¡A¤º©w¬° 16 ¦ì¤¸ªº¹Bºâ¤¸¡B¼È¦s¾¹¡A¬G©Ò²ÕĶ¥X¨Óªº¡uB8¡vµø¬°¡uMOV AX,¡v¡C¦pªG¬O¨Ï¥Î 32 ¦ì¤¸ªº¼È¦s¾¹¡B¹Bºâ¤¸¡A·|¦Û°Ê¦b«e­±¥[¤W«e¸m½X¡A66H¡A¥Hµø°Ï§O¡C¨Ò¦p¡A¹J¨ì¡uMOV EAX,1234H¡v³oÃþ«ü¥O¡A·|³Q½s½X¬°¡u66 B8 34 12 00 00¡v¡Aªí¥Ü¦¹³Bªº¼È¦s¾¹¡B¹Bºâ¤¸¬° 32 ¦ì¤¸¡C·í CPU °õ¦æ¨ì³o¸Ì¡A¦]¬° CPU ª¾¹D¦¹®É¬O¦b 16 ¦ì¤¸¤¤¡A¹J¨ì«e¸m½X 66H¡A´Nª¾¹D¦¹®Éªº¼È¦s¾¹¡B¹Bºâ¤¸¬° 32 ¦ì¤¸¡C

¤Ï¹L¨Ó¡A¦pªG¦b 32 ¦ì¤¸ªºÀô¹Ò¤¤¡AMASM ·|¤º©w¨Ï¥Î 32 ¦ì¤¸ªº¼È¦s¾¹¡B¹Bºâ¤¸µ¥¡A·íµM¤]¥i¥H°µ 16 ¦ì¤¸ªº¹Bºâ¡A¨Ò¦p¡uMOV AX,1234H¡v¡AMASM ¦b½s½X®É¡A¤]·|¦Û°Ê¥[¤W 66H §@¬°«e¸m½X¡C¦]¦¹¡A§Y¨Ï¡uMOV AX,¡v¡B¡uMOV EAX,¡vÁöµM¦b­ì©l½X¤¤§¡³Q²ÕĶ¬°¡uB8¡v¡A«o¤£·|²V²c¤£²M¡C

Á¿¤F³o»ò¦h¡A¤p¤ì°¸´N¬O¤@¥y¸Ü¡C§Ú­Ì¦b­ì©l½X¤¤©w¸qªº°Ï¬q¡A¨M©w¤F³o­Ó°Ï¬q¤º©w¬° 16 ¦ì¤¸©Î 32 ¦ì¤¸¡A¦pªG­n¦b¦¹°Ï¬q¤º¨Ï¥Î¤£¦P¦ì¤¸ªº¼È¦s¾¹¡B¹Bºâ¤¸µ¥¡A´N·|³Q²ÕĶ¾¹¥[¤W«e¸m½X¡C¦b³o³¹ùØ¡A¤p¤ì°¸¨Ï¥Î§¹¾ãªº°Ï¬q©w¸q¡A¦p¤Uªí¥ªÃ䪺µ{¦¡¡A²Ä¤@¬O­n«Å§i¡u.386¡v°²«ü¥O¡A¨Ã¦b©w¸q°Ï¬q®É¨Ï¥Î¡uUSE16¡v¡F¤]¥i¥H¨Ï¥Î²©ö°Ï¬q©w¸q¡A¦p¤Uªí¥kÃä¡A¥ý«Å§i¡u.MODEL¡v¡A¦A«Å§i¡u.386¡v¡G

        .386
;***************************************
code    SEGMENT USE16
        ASSUME  cs:code,ds:code
        ORG     100h
;---------------------------------------
main    PROC    FAR
        mov     eax,4c00h
        mov     ax,4c00h
        int     21h
main    ENDP
;---------------------------------------
code    ENDS
;***************************************
END     main
        .MODEL  TINY
        .386
        .CODE
        ASSUME  cs:@code
;---------------------------------------
main    PROC    FAR
        mov     eax,4c00h
        mov     ax,4c00h
        int     21h
main    ENDP
;***************************************
END     main

³o¨âºØ¤èªk©Ò±oªºµ{¦¡½X¬Ò¬Û¦P¡A²ÕĶ¡B³s±µ¨ÃÂàÅܦ¨ COM ÀÉ«á¡A¥H DEBUG32 ¸ü¤JÆ[¹î¡A±o¨ì¤U­±µe­±¡G

Debug32 - Version 1.0 - Copyright (C) Larson Computing 1994

CPU = ?86, Virtual 8086 Mode, Id/Step = 0F10, A20 enabled
-u [Enter]
291C:0100 66B8004C0000     MOV     EAX,00004C00h
291C:0106 B8004C           MOV     AX,4C00h
291C:0109 CD21             INT     21h
291C:010B 0000             ADD     [BX+SI],AL
291C:010D 0000             ADD     [BX+SI],AL

·íµM¡A¦pªG±z¤£¥´ºâ¨Ï¥Î 80386 «ü¥O¡A§@ 32 ¦ì¤¸ªº¹Bºâ¡A¨º»ò´N¤£¶·«Å§i¡u.386¡v¡A¨º»òµ{¦¡¤¤¡A´NµLªk¥X²{¹³¡uEAX¡v³oºØ 32 ¦ì¤¸ªº¼È¦s¾¹©Î¹Bºâ¤¸¤F¡C

¦b Windows 9x/NT/XP/Vista µ¥ 32 ¦ì¤¸ªº§@·~¨t²Î¤¤¡A°Ï¬qªº³]©w¤è¦¡¡A¥²¶·¥ý«Å§i¡u.386¡v¡A¦A«Å§i¡u.MODEL¡v¡A³o¼Ë MASM ´N·|¥H 32 ¦ì¤¸ªº¤è¦¡²ÕĶ¡A¹J¨ì¡uMOV EAX,¡v´N½s½X¦¨¡uB8¡v¡C¦b Windows §@·~¨t²Î¤¤¡AÃø§K¤]·|¹J¨ì¡uMOV AX,¡v³oÃþ«ü¥O¡AMASM ·|±N¨ä½s½X¬°¡u66 B8¡v¡C


¦^¨ì­º­¶¡A ¨ì²Ä¤G¤Q¤E³¹¡A ¨ì²Ä¤T¤Q¤@³¹