²Ä¤E³¹¡@¦³¸¹¼Æ¡]¤G¡^

¥»³¹±µÄò«e¤@³¹¡AÄ~Äò¦³¸¹¼Æªº»¡©ú¡C¦b³o¤@³¹ùØ¡A±NÁ|­Ó¨Ò¤l¡ACALCULUS.ASM¡A»¡©ú¦p¦ó¦b©R¥O´£¥Ü¦r¤¸¤¤¡A§Q¥Î Win64 API ¿é¤J¦³¸¹¼Æ¡A¨Ã¶i¦æ¥|«h¹Bºâ¡A³Ì«áÁÙ¬O§Q¥Î Win64 API ±Nµ²ªGÅã¥Ü¦b¿Ã¹õ¤W¡C¦ý¦b»¡©ú CALCULUS.ASM ¤§«e¡AÄ~Äò¤¶²Ð³o­ÓÀ³¥Îµ{¦¡¥Î±o¨ì x64 «ü¥O¤Î Win64 API¡C


CALCULUS.ASM ¥Î±o¨ìªº x64 «ü¥O¤Î Win64 API

StrToIntEx API

StrToIntEx §â¥Ñ¼Æ¦r²Õ¦¨¥B¥H¹sµ²§Àªº¦r¦ê¡AÂà´«¦¨¼Æ­È¡A¨Ã¦s©ó¬Y­ÓÅܼÆùØ¡C¨ä»yªk¦p¤U¡G

BOOL StrToIntEx(
  [in]  PCWSTR     pszString,
        STIF_FLAGS dwFlags,
  [out] int        *piRet
);

StrToIntEx °Ñ¼Æ»¡©ú¦p¤U¡G

StrToIntEx ¬O StrToInt ªºÂX¥Rª©¡A°£¤F­×¥¿«áªÌ¹ï©ó¦r¦ê¡u"0",0¡v©Ò³y¦¨µLªk°Ï¤À¬OµLªkÂà´«¡AÁÙ¬O©Ò«üªº¦r¦êÂà´««á´N¬O 0 ¤§¥~¡AÁÙ¼W¥[¹ï¤Q¤»¶i¦ì¦r¦êªºÂà´«¡CpszString ©Ò«ü¦r¦êªº¤º®e¥i¤À¤T³¡¤À¡A¨ä®æ¦¡¦p¤U¡G

"¡]ªÅ¥Õ¡^¡]¥¿­t¸¹¡^¡]¼Æ¦r¡^",0

²Ä¤@³¡¤À¥i¥H¦h­ÓªÅ¥Õ¡A¦ý³£·|³Q StrToIntEx ©¿²¤¡C²Ä¤G³¡¤À¥i¥H¬Ù²¤©Î¬O¡u+¡v¡B¡u-¡v¤G¾Ü¤@¡F­Y¬Ù²¤ªí¥Ü¥¿­È¡C²Ä¤T³¡¤À¬Oªü©Ô§B¼Æ¦r²Õ¦¨ªº¦r¦ê¡A¦pªG«ü©w STIF_SUPPORT_HEX¡A³Ì«e­±¥i¥H¥[¤W¡u0x¡v©Î¡u0X¡v¡Aªí¥Ü¤Q¤»¶i¦ì¡A¨ä«á¥i¥H¨Ï¥Î¡uA¡ãF¡v¡]¤£°Ï¤À¤j¤p¼g¡^ªí¥Ü¤Q¤»¶i¦ì¼Æ¡F¦ý«ü©w STIF_SUPPORT_HEX ¤§«á¡AµLªk¨Ï¥Î¡u-¡v¡A§Y¨Ï¨Ï¥Î¡u-¡v¤´·|³Q StrToIntEx µø¬°¥¿­È¡CStrToIntEx ªº¦^¶Ç­È¬O¥¬ªL­È¡G­Y¦r¦ê¦¨¥\Âà´«¡A¶Ç¦^ TRUE¡F§_«h¶Ç¦^ FALSE¡C

¬Ý§¹©³¤Uªº¨Ò¤l·|§ó²M·¡ StrToIntEx ¨ç¦¡¡G

¼Æ¦r¦r¦êSTIF_DEFAULTSTIF_SUPPORT_HEX»¡©ú
µ²ªG¦^¶Ç­Èµ²ªG¦^¶Ç­È
"123",0123TRUE123TRUE¦r¦ê¨S¦³¡u0x¡v°_ÀY¡A¬Gµø¬°¤Q¶i¦ì
" + 123",00FALSE0FALSE¡u+¡v»Pªü©Ô§B¼Æ¦r¤§¶¡¤£¯à¦³ªÅ¥Õ¡A±µ¦¬ªºÅܼƷ|Åܦ¨ 0
"-123",0-123TRUE-123TRUE¦r¦ê¨S¦³¡u0x¡v°_ÀY¡A¬Gµø¬°¤Q¶i¦ì
"0x123",00TRUE291TRUESTIF_DEFAULT ®Éµø¬°¤Q¶i¦ì¡AÂà´«¨ì­º­Ó«D¼Æ¦rµ²§ô¡F
STIF_SUPPORT_HEX ®Éµø¬°¤Q¤»¶i¦ì¡A123h=291d
"-0x123",00TRUE291TRUESTIF_DEFAULT ®Éµø¬°¤Q¶i¦ì¡AÂà´«¨ì­º­Ó«D¼Æ¦rµ²§ô¡F
STIF_SUPPORT_HEX ®Éµø¬°¤Q¤»¶i¦ì¡u0x¡v¤§«eªº¡u-¡v·|³Q©¿²¤
"4F",04TRUE4TRUE¦r¦ê¨S¦³¡u0x¡v°_ÀYµø¬°¤Q¶i¦ì¡A¨ì²Ä¤@­Ó«D¼Æ¦r°±¤î

x64 «ü¥O¡GNEG

NEG «ü¥O¬O¥Î¨Ó­pºâ¤G¸É¼Æªº«ü¥O¡A»yªk¬O

NEG     ¥Øªº¹Bºâ¤¸

¥Øªº¹Bºâ¤¸¥i¥H¬O¼È¦s¾¹©ÎÅܼơANEG ·|­pºâ¥Øªº¹Bºâ¤¸ªº¤G¸É¼Æ¡AµM«á¦A¦s¦^¥Øªº¹Bºâ¤¸¡A¥Øªº¹Bºâ¤¸·|³Q¯}Ãa¡C«e¤@³¹´£¹L¡A¬Y¼Æªº¤G¸É¼Æ¨ä¹ê´N¬O¸Ó¼Æªº¬Û¤Ï¼Æ¡A¦]¦¹¥i¥H¥Î NEG ­pºâ¬Y¼Æªº­t­È¡C¦pªG¥Øªº¹Bºâ¤¸¬O 0¡A¨º»ò¶i¦ìºX¼Ð·|³Q²M°£¡A§_«h³Q³]©w¡C¨ä¾l·¸¦ì¡B²Å¸¹¡B¹s­È¨Ì¹Bºâµ²ªG§ïÅܺX¼Ð¡C

x64 «ü¥O¡GCLC »P STC

CLC »P STC ¬O¥Î¨Ó§ïÅܶi¦ìºX¼Ð¤§­È¡CCLC ­ì¤å¬O clear carry flag¡A¤]´N¬O²M°£¶i¦ìºX¼Ð¡A§â¶i¦ìºX¼Ð³]¬°¹s¡CSTC ­ì¤å¬O set carry flag¡A¤]´N¬O³]©w¶i¦ìºX¼Ð¡A§â¶i¦ìºX¼Ð³]¬°¤@¡CCLC »P STC ¥u¼vÅT¶i¦ìºX¼Ð¡A¤£¼vÅT¨ä¥LºX¼Ð¡C


CALCULUS.ASM ­ì©lµ{¦¡

¨ì³o¨à¡ACALCULUS.ASM ©Ò»Ýªº©Ò¦³ x64 «ü¥O»P Win64 API ³£¤¶²Ð§¹²¦¡A©³¤UÀ³¸Ó­n§â CALCULUS.ASM ¹ê§@¥X¨Ó¡A§¹¾ãªº­ì©lµ{¦¡¦p¤U¡G

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
INCLUDE E:\masm64\include64\masm64rt.inc
;******************************************************************************
.DATA
hInput  DQ      ?       ;¼Ð·Ç¿é¤J¸Ë¸m±±¨î¥N½X
hOutput DQ      ?       ;¼Ð·Ç¿é¥X¸Ë¸m±±¨î¥N½X
n1      DD      ?       ;¨Ï¥ÎªÌ¿é¤Jªº¼Æ­È1
n2      DD      ?       ;¨Ï¥ÎªÌ¿é¤Jªº¼Æ­È2
sum          DD ?       ;©M
difference   DD ?       ;®t
product      DQ ?       ;¿n
quotient     DD ?       ;°Ó
remainder    DD ?       ;¾l¼Æ
szFmt   DB      40h DUP (0)
szAns   DB      80h DUP (0)
szCtFmt DB      "%%d¡B%%d¤§©M¡B®t¡B¿n¡B°Ó¤Î¾l¼Æ¨Ì§Ç¬°",0dh,0ah,\
                "%s¡B%s¡B%%I64d¡B%%d¾l%%d¡C",0
szFmtUp DB      "%u",0
szFmtUn DB      "-%u",0
szFmtI  DB      "%d",0
sHint   DB      "½Ð¿é¤J­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡ªº¾ã¼Æ¡G"
sErr0   DB      "µLªkÂà´«¦¨¾ã¼Æ¡I"
sErr1   DB      "±z¿é¤Jªº¼Æ¤£¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡¡I"
sErr2   DB      "°£¼Æ¤£¥i¬°¹s¡I"
;******************************************************************************
.CODE
;------------------------------------------------------------------------------
Input   PROC    USES rsi rdi hIn:QWORD,hOut:QWORD
maximum EQU 2000000000  ;¤G¤Q»õ=77359400h
;¿é¤J¡GhIn¡BhOut¡Ð¼Ð·Ç¿é¤J¡B¿é¥X¸Ë¸m±±¨î¥N½X
;¿é¥X¡GCYªí¥Ü¿é¤J¿ù»~¡AEAX=0ªí¥Ü¨Ï¥ÎªÌ¿é¤Jªº¸ê®ÆµLªkÂà´«¦¨¾ã¼Æ
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@EAX=1ªí¥Ü¨Ï¥ÎªÌ¿é¤Jªº¾ã¼Æ¤£¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡
;¡@¡@¡@NCªí¥Ü¿é¤J¥¿½T¡AEAX=¨Ï¥ÎªÌ¿é¤Jªº¼Æ­È
        LOCAL   n:DWORD,nWritn:DWORD,nRead:DWORD,buffer[16]:BYTE
    ;¦L¥XsHint¦r¦ê¡A¨Ã¥BÅý¨Ï¥ÎªÌ¿é¤J¼Æ¦r¦r¦ê
        invoke  WriteConsole,hOut,ADDR sHint,SIZEOF sHint,ADDR nWritn,0
        invoke  ReadConsole,hIn,ADDR buffer,SIZEOF buffer,ADDR nRead,0
    ;§â¨Ï¥ÎªÌ¿é¤Jªº¼Æ¦r¦r¦êÂà´«¦¨¼Æ­È
        invoke  StrToIntEx,ADDR buffer,0,ADDR n
        or      eax,eax
        jz      error
    ;Àˬd¨Ï¥ÎªÌ¿é¤Jªº¼Æ­È¬O§_¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡
        mov     edi,maximum
        mov     eax,n
        mov     esi,edi ;EDI=¤G¤Q»õ
        neg     esi     ;ESI=­t¤G¤Q»õ¡AESI¬OEDIªº2¸É¼Æ
        cmp     eax,edi ;ÀˬdEAX¬O§_¤j©ó¤G¤Q»õ
        jg      ov100m
        cmp     eax,esi ;ÀˬdEAX¬O§_¤p©ó­t¤G¤Q»õ
        jge     ok
ov100m: mov     rax,1
error:  stc             ;³]©w¶i¦ìºX¼Ð¡A¨ÃÂ÷¶}Input
        jmp     quit
ok:     clc
quit:   ret
Input   ENDP
;------------------------------------------------------------------------------
main    PROC
    ;¨ú±o¼Ð·Ç¿é¤J¡B¿é¥X¸Ë¸mªº±±¨î¥N½X
        invoke  GetStdHandle,STD_INPUT_HANDLE
        mov     hInput,rax
        invoke  GetStdHandle,STD_OUTPUT_HANDLE
        mov     hOutput,rax
    ;¿é¤J²Ä¤@­Ó¾ã¼Æ
        invoke  Input,hInput,hOutput
        jc      error   ;¦pªG¤£¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡©ÎµLªkÂà´«¡A¸õ¦Üerror
        mov     n1,eax
        mov     sum,eax
        mov     difference,eax
    ;¿é¤J²Ä¤G­Ó¾ã¼Æ
        invoke  Input,hInput,hOutput
        jc      error   ;¦pªG¤£¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡©ÎµLªkÂà´«¡A¸õ¦Üerror
        or      eax,eax ;Àˬd¿é¤Jªº¼Æ¬O§_¬°¹s¡A¦]¬°n2·|§@¬°°£¼Æ
        jz      zero
        mov     n2,eax
    ;³B²z¥[ªk¡A¨Ã¨M©w©Mªº®æ¦¡³W½d
        lea     r8,szFmtI    ;¥ý°²³]n1+n2¤£·¸¦ì
        add     sum,eax
        jno     nv1
        test    n1,80000000h ;­Yµo¥Í·¸¦ì¡A§PÂ_©M¬°¥¿¼Æ§í©Î­t¼Æ
        jz      pos1
        lea     r8,szFmtUn   ;·¸¦ì¥B©M¬°­t
        neg     sum
        jmp     nv1
pos1:   lea     r8,szFmtUp   ;·¸¦ì¥B©M¬°¥¿
    ;³B²z´îªk¡A¨Ã¨M©w®tªº®æ¦¡³W½d
nv1:    mov     r9,OFFSET szFmtI
        sub     difference,eax
        jno     nv2
        test    n1,80000000h ;­Yµo¥Í·¸¦ì¡A§PÂ_®t¬°¥¿¼Æ§í©Î­t¼Æ
        jz      pos2
        mov     r9,OFFSET szFmtUn
        neg     difference
        jmp     nv2
pos2:   mov     r9,OFFSET szFmtUp
    ;»s§@szFmt¦r¦ê¡A§@¬°¿é¥X©M¡B®t¡B¿n¡B°Ó¡B¾lªº®æ¦¡±±¨î¦r¦ê
nv2:    invoke  wsprintf,ADDR szFmt,ADDR szCtFmt,r8,r9
        mov     eax,n1
        imul    n2      ;EDX:EAX=EAX¡Ñn2
        mov     DWORD PTR product,eax
        mov     DWORD PTR product[4],edx
        mov     eax,n1
        cdq             ;EDX:EAX=n1¡A¥B±NEAX²Å¸¹¦ì¤¸ÂX¥R¦ÜEAX
        idiv    n2      ;EDX:EAX=EDX:EAX¡Òn2
    ;¦pªG¾l¼Æ¤p©ó¹s¡A¥²¶·½Õ¾ã°Ó»P¾l¼Æ¡A§_«h¸õ¦Üdone¼Ð°O¡A¦L¥Xµ²ªG
        cmp     edx,0
        jge     done
    ;Àˬd°£¼Æ¡]§Yn2¡^¬O§_¬°¥¿¼Æ¡A­Y¬°¥¿¸õ¦Üpos³B
        test    n2,80000000h
        jz      pos
        inc     eax     ;­Y°£¼Æ¬°­t¼Æ
        sub     edx,n2
        jmp     done
pos:    dec     eax     ;­Y°£¼Æ¬°¥¿¼Æ
        add     edx,n2
done:   mov     quotient,eax
        mov     remainder,edx
    ;¥Í¦¨szAns¦r¦ê
        invoke  wsprintf,ADDR szAns,ADDR szFmt,n1,n2,sum,difference,product,quotient,remainder
        mov     rdx,OFFSET szAns
        jmp     pnt_it
error:  cmp     eax,0
        jnz     err1
        mov     rdx,OFFSET sErr0
        mov     eax,SIZEOF sErr0
        jmp     pnt_it
err1:   mov     rdx,OFFSET sErr1
        mov     eax,SIZEOF sErr1
        jmp     pnt_it
zero:   mov     rdx,OFFSET sErr2
        mov     eax,SIZEOF sErr2
    ;¦L¥XszAns¦r¦ê©Î¿ù»~°T®§
pnt_it: invoke  WriteConsole,hOutput,rdx,eax,0,0
        invoke  ExitProcess,0
main    ENDP
;******************************************************************************
END

²ÕĶ»P³sµ²¨BÆJ¡A¥H¤Î°õ¦æµ²ªG¦p¤U¹Ï¡]¶À¦â¦r¬O¨Ï¥ÎªÌ¿é¤Jªº«ü¥O¡^¡G


»¡©ú CALCULUS.ASM

CALCULUS.ASM ¥\¯àÁöµM«Ü²³æ¡A¦ý¬O­n¦Ò¼{ªº²Ó¸`¡A«o¬O¤£¤Ö¡C

Input °Æµ{¦¡

­º¥ý¡A¹q¸£¯à°÷³B²zªº¼Æ­È¥i¥H«Ü¤j¡A«o¤]¤£¬OµL­­¨î¡A©Ò¥H¥²¶·Åý¨Ï¥ÎªÌ¿é¤Jªº¼Æ¦b¬Y­Ó½d³ò¤º¡C¦Ò¼{¨ì x64 CPU ¯à³B²zªº 32 ¦ì¤¸¦³¸¹¼Æ½d³ò¬O¡Ð2147483648¡ã2147483647¡A¬ù­t¤G¤Q¤@»õ¦Ü¤G¤Q¤@»õ¤§¶¡¡A¦]¦¹¤p¤ì°¸³]©w CALCULUS ¥u¶i¦æ­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡ªº¦³¸¹¼Æ¥|«h¹Bºâ¡C

¿é¤J¨â­Ó¼Æ­Èªº¹Lµ{¬Û¦P¡A¥i¥H¥Î¤@­Ó°Æµ{¦¡§¹¦¨¡A³o­Ó°Æµ{¦¡ºÙ¬° Input¡C¦bµ²§ô Input °Æµ{¦¡®É¡A¶·Àˬd´X¥ó¨Æ¡G

  1. ¦pªG¨Ï¥ÎªÌ¿é¤Jªº¸ê®Æ¡AµLªkÂÇ¥Ñ StrToIntEx Âà´«¦¨¼Æ­È¡A¨º»ò¥²¶·±N¦¹¿ù»~¶Çµ¹ main¡A¥H«KÅý main ¦L¥X¿ù»~°T®§¡C
  2. ¦pªG¨Ï¥ÎªÌ¿é¤Jªº¼Æ­È¤£¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡¡A¤]±o±N¦¹¿ù»~¶Çµ¹ main¡A¥H«KÅý main ¦L¥X¿ù»~°T®§¡C
  3. ¨Ï¥ÎªÌ¿é¤Jªº²Ä¤G­Ó¼Æ·|³Q·í°µ°£¼Æ¡A¦Ó°£¼Æ¤£¥i¬°¹s¬O¹s¡A©Ò¥H²Ä¤G­Ó¼Æ¤£¥i¬°¹s¡F¦ý¬O²Ä¤@­Ó¼Æ¥i¥H¬O¹s¡A©Ò¥H¥²¶·¯S§O³B²z¨Ï¥ÎªÌ¿é¤J¹sªº±¡ªp¡C

ų©ó¤W­±±¡§Î¡A¤p¤ì°¸±N Input ªº¦^¶Ç­È³]¬°¨âÃþ±¡§Î¡G

  1. ¦pªG¨Ï¥ÎªÌ¿é¤Jªº¼Æ¦r¦r¦ê¯à¸g¥Ñ StrToIntEx ¦¨¥\Âà´«¦¨¼Æ­È¡A¥B¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡¡AInput ±N¸Ó¼Æ­È¦s©ó EAX¡A¨Ã²M°£¶i¦ìºX¼Ðªð¦^¡C³oºØ±¡§Î¥Nªí¥¿±`¹B§@¡C
  2. ¦pªG¨Ï¥ÎªÌ¿é¤Jªº¼Æ¦r¦r¦ê¯à¸g¥Ñ StrToIntEx ¦¨¥\Âà´«¦¨¼Æ­È¦ý¤£¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡¡A©ÎµLªkÂà´«¦¨¼Æ­È¡AInput ·|³]©w¶i¦ìºX¼Ð¡A¦P®É EAX ¥Nªíµo¥Í¿ù»~ªº­ì¦]¡C³o¨âºØ±¡§Î¥Nªí¿ù»~¡C

Input ªð¦^ main ¤§«á¡A¦pªG¬O²Ä 2 ºØ±¡§Î¡A¨Ì¾Ú EAX ¦L¥X­þ¤@ºØ¿ù»~°T®§¡C¦pªG¬O²Ä 1 ºØ±¡§Î¡A´N¶i¦æ¤U¤@¨BÆJ¡G①Ä~Äò¿é¤J²Ä¤G­Ó¼Æ­È©Î②¶i¦æ¥|«h¹Bºâ¡C¦pªG¬O¤w¸g¿é¤J§¹²Ä¤G­Ó¼Æ­È¡A»ÝÀˬd EAX ¬O§_¬°¹s¡C¦pªG¬O¹s¡A´N¦L¥X¡u°£¼Æ¤£¥i¬°¹s¡I¡v«á°h¥X CALCULUS¡C°²¦p³£¨S¦³°ÝÃD¡A´N¶i¤J¥|«h¹Bºâ¡C

¦b x64 CPU «ü¥O¤¤¡A¶i¦æ¦³¸¹¼Æªº¥|«h¹Bºâ¤À§O¬O ADD¡BSUB¡BIMUL¡BIDIV¡A¨ä¤¤ ADD¡BSUB ¥²¶·¦Ò¼{·¸¦ìªº±¡§Î¸û¬°½ÆÂø¡FIMUL ªº³æ¹Bºâ¤¸§Î¦¡¡A¤£»Ý¦Ò¼{·¸¦ì¡A¦ý­n¦Ò¼{¦p¦ó»P wsprintf ·f°t¡A±o¨ì 64 ¦ì¤¸¦³¸¹¼Æ¡F¦Ó IDIV «h¬O¦Ò¼{¤F¤]¨S¥Î¡A­n¦Ò¼{ªº¬O¦p¦ó½Õ¾ã¡A¨Ï¾l¼ÆÅܬ°¥¿¼Æ¡A¥H²Å¦X¼Æ¾Ç¤Wªº­n¨D¡C©³¤U´N³o¨Ç«ü¥O¤À§O»¡©ú¡C

¥[´îªk·¸¦ì°ÝÃD

°²¦p¶i¦æ 32 ¦ì¤¸ªº¦³¸¹¼Æ¥[ªk¹Bºâ¡A¨Ò¦p¤G¤Q»õ¥[¤G¤Q»õ¡Aµ{¦¡¼g¦¨¡G

sAnswer DB      20 DUP (0)
szFmt   DB      "%d",0
        ⁝
        mov     eax,2000000000
        add     eax,2000000000
        invoke  wsprintf,ADDR sAnswer,ADDR szFmt,eax

°õ¦æ«á sAnswer ¦r¦ê¬O¡u-294967296¡v¨Ã«D¥|¤Q»õ¡A³o¬O¦]¬°µ²ªG¤w¸g¶W¹L¦³¸¹¼Æ©Ò¯àªí¥Üªº½d³ò¡]32 ¦ì¤¸¦³¸¹¼Æªº½d³ò¬O­t¤G¤Q¤@»õ¦Ü¤G¤Q¤@»õ¤§¶¡¡A¨£«e¤@³¹¡^¡C¹³³oºØ±¡§Î¡A¸û¤jªº¥¿¼Æ¥[¸û¤jªº¥¿¼Æ´N¦³¥i¯àµo¥Í·¸¦ì¡]³o¨à¸û¤jªº¥¿¼Æ«üªº¬O±µªñ¤G¤Q»õªº¥¿¼Æ¡A¨â­Ó¦¹Ãþ¼Æ¬Û¥[´N¦³¥i¯à¶W¹L¤G¤Q¤@»õ¡^¡A³o®É­ÔÀ³¸Ó§â®æ¦¡±±¨î¦r¦ê¡]¤]´N¬O szFmt¡^¤ºªº®æ¦¡³W½d¡]¤]´N¬O %d¡^§ï¦¨¥HµL¸¹¼ÆÃþ«¬³B²z¡A¤]´N¬O¡G

szFmt   DB      "%u",0

¨º»òÁÙ¦³¨S¦³¨ä¥L±¡§Î·|³y¦¨·¸¦ì©O¡H¨Æ¹ê¤WÁÙ¦³¤TºØ¡G¸û¤pªº­t¼Æ¥[¸û¤pªº­t¼Æ¡]¨Ò¦p­t¤G¤Q»õ¥[­t¤G¤Q»õ¡^¡B¸û¤jªº¥¿¼Æ´î¸û¤pªº­t¼Æ¡]¨Ò¦p¤G¤Q»õ´î­t¤G¤Q»õ¡^¡B¸û¤pªº­t¼Æ´î¸û¤jªº¥¿¼Æ¡]¨Ò¦p­t¤G¤Q»õ´î¤G¤Q»õ¡^¡Cµo¥Í·¸¦ìªº¥|ºØ±¡§Î¡A¦A¥[¤W¨S¦³µo¥Í·¸¦ìªº±¡§Î¡A¾ã²z¦p¤Uªí¡G

¬O§_·¸¦ìµo¥Í·¸¦ì±¡§Î¨Ò¤l®æ¦¡±±¨î¦r¦ê
·¸
¦ì
¸û¤jªº¥¿¼Æ¥[¸û¤jªº¥¿¼Æ¡@¤G¤Q»õ¡Ï¡@¤G¤Q»õ¡×¡@¥|¤Q»õ"%u",0
¸û¤pªº­t¼Æ¥[¸û¤pªº­t¼Æ­t¤G¤Q»õ¡Ï­t¤G¤Q»õ¡×­t¥|¤Q»õ"-%u",0
¸û¤jªº¥¿¼Æ´î¸û¤pªº­t¼Æ¡@¤G¤Q»õ¡Ð­t¤G¤Q»õ¡×¡@¥|¤Q»õ"%u",0
¸û¤pªº­t¼Æ´î¸û¤jªº¥¿¼Æ­t¤G¤Q»õ¡Ð¡@¤G¤Q»õ¡×­t¥|¤Q»õ"-%u",0
¤£·¸¦ì¨ä¥L±¡§Î¤Q»õ¡Ï¤Q»õ¡×¤G¤Q»õ"%d",0

¤Wªí¤¤ªº²Ä¤@¡B²Ä¤TºØ±¡§Î¡A©Ò±oªº©M©Î®t¤Ó¤j¡A¬O¶W¹L¤G¤Q¤@»õªº¥¿¾ã¼Æ¡A¶W¹L¤T¤Q¤G¦ì¤¸¦³¸¹¼Æªº©Ò¯àªí¥Üªº½d³ò¡CÁöµM¥i¥H±N¨äÂX¥R¦¨¤»¤Q¥|¦ì¤¸¦AÅã¥Ü©ó¿Ã¥ú¹õ¤W¡A¦ý¥»³¹¥Î¥t¥~¤@ºØ§Þ¥©¡A¤]¯à¹F¨ì¥Øªº¡C¬JµM¤£¯à¥Î¦³¸¹¼Æªí¥Ü¡A´N§ï¥ÎµL¸¹¼Æªí¥Ü¡A¦]¬°¤Ï¥¿³£¬O¥¿¼Æ¡C¦Ó¤Wªí¤¤ªº²Ä¤G¡B¥|ºØ±¡§Î¡A©Ò±oªºµ²ªG¬O«Ü¤pªº­t¼Æ¡]¨Ò¦p­t¥|¤Q»õ¡^¡A¨º´N¥ý¥Î NEG «ü¥O±N¨äÅܸ¹¡A³o¼Ë´NÅܦ¨­ì¼Æªº¬Û¤Ï¼Æ¡A¤]´N¬O¥¿¼Æ¡AµM«á¥ÎµL¸¹¼Æªí¥Ü¡A¤£¹L®æ¦¡±±¨î¦r¦ê»Ý¥[¤W¡u-¡v¡A³o¼Ë¦b¿Ã¥ú¹õ¤W¬Ý°_¨Ó´N¬O­t¼Æ¡C¨Ò¦p¤U­±ªºµ{¦¡¡G

sAnswer DB      20 DUP (0)
szFmt   DB      "-%u",0
        ⁝
        mov     eax,-2000000000
        add     eax,-2000000000
        neg     eax
        invoke  wsprintf,ADDR sAnswer,ADDR szFmt,eax

¹ï¥[ªk§@Á`¾ã²z¡C¦pªG¬Û¥[«á¡A¤£·¸¦ì¡A¨º»ò®æ¦¡³W½d¬O¡u%d¡v¡C¦pªGµo¥Í·¸¦ì¡A¨º»ò­n§PÂ_µ²ªG¬O¥¿¼ÆÁÙ¬O­t¼Æ¡A¦pªG¬O¥¿¼Æ¡Aªí¥Ü©M¶W¹L¤G¤Q¤@»õ¡A®æ¦¡³W½d¬O¡u%u¡v¡F¦pªG¬O­t¼Æ¡Aªí¥Ü©M¤p©ó­t¤G¤Q¤@»õ¡A­n¥H­ì¼Æªº¬Û¤Ï¼Æ³B²z¡AÀ³°õ¦æ NEG «ü¥O¦P®É¡u%u¡v¤§«e¥²¶·¥[¤W¡u-¡v¡AÅܦ¨¡u-%u¡v¡C¹ï©ó´îªkªº³B²z¤è¦¡¤]¬O¤@¼Ë¡A´N¤£ÂØ­z¡C

¨ì¦¹¤j­P¤w¸Ñ¨Mµo¥Í·¸¦ìªº°ÝÃD¡A¶È³Ñ¤U¦p¦ó¼¶¼g®æ¦¡±±¨î¦r¦ê¡C¥ý¨Ó¬Ý¬Ý°²¦p¤£µo¥Í·¸¦ì¡A®æ¦¡±±¨î¦r¦êÀ³¸Óªøªº«ç»ò¼Ë¡AµM«á¦AºCºC­×¥¿¡CCALCULUS ³Ì«á­n§â¨Ï¥ÎªÌ¿é¤Jªº¨â­Ó¼Æ»P³o¨â¼Æ¤§©M¡B®t¡B¿n¡B°Ó»P¾l¼Æ¦L¦b¿Ã¥ú¹õ¤W¡C©Ò¥H¤@¶}©l¡A¦L¥X³o¨Ç¼Æ­Èªº®æ¦¡±±¨î¦r¦ê¬O¡G

"%d¡B%d¤§©M¡B®t¡B¿n¡B°Ó¤Î¾l¼Æ¨Ì§Ç¬°%d¡B%d¡B%I64d¡B%d¾l%d¡C",0

¦A¨Ó¬Ý¬Ý®æ¦¡±±¨î¦r¦ê¸Ó¦p¦ó­×¥¿¡C³o­Ó®æ¦¡±±¨î¦r¦ê¥i¤À¬°¤T³¡¤À°Q½×¡G

  1. ³Ì«e­±ªº¨â­Ó¡u%d¡B%d¡v¡A¬O¨Ï¥ÎªÌ¿é¤Jªº¨â­Ó¦³¸¹¼Æªº®æ¦¡³W½d¡A¬O©T©w¤£Åܪº¡C
  2. ²Ä¤T¡B²Ä¥|­Ó¡A¡u%d¡B%d¡v¬O©M»P®tªº®æ¦¡³W½d¡C®Ú¾Ú«e­±´y­z¡A³o¨â­Ó®æ¦¡³W½d¦³¥i¯à¦]·¸¦ìªºÃö«Y¡A©Ò¥H¤£¤@©w¬O¡u%d¡v¡A¦³¥i¯à¬O¡u%d¡v¡B¡u%u¡v¡B¡u-%u¡v¡A¤T¿ï¤@¡C
  3. ³Ì«á­±ªº¤T­Ó¡A¡u%I64d¡v¡B¡u%d¾l%d¡v¬O¿n¡B°Ó»P¾l¼Æªº®æ¦¡³W½d¡A³o¤T­Ó¬O©T©w¤£Åܪº¡C

¦^·Q²Ä¤­³¹¤¶²Ð wsprintf ¨ç¦¡ªº»¡©ú¡A®æ¦¡±±¨î¦r¦ê¥i¥H¨Ï¥Î¡u%s¡v®æ¦¡³W½d¡A¥Í¦¨¤£¦Pªº¦r¦ê¡FÁÙ¦³¡A¦pªG¬O¨â­Ó¡u%¡v³s¦b¤@°_¡A¨º»ò¡u%¡v¨Ã«D¥Nªí®æ¦¡³W½dªº°_ÀY¡A¦Ó´N¬O¥Nªí¡u%¡v³o­Ó¦r¤¸¡C¦b CALCULUS ùØ¡A°õ¦æ¨â¦¸ wsprintf¡A²Ä¤@¦¸¬O¨Ì¾Ú¬O§_µo¥Í·¸¦ì¡A»s³y¥X®æ¦¡±±¨î¦r¦ê¡F²Ä¤G¦¸¤~¬O¨Ì¾Ú²Ä¤@¦¸³y¥Xªº®æ¦¡±±¨î¦r¦ê¡A»s³y¥X¯u¥¿­n¦L¦b¿Ã¥ú¹õ¤Wªº©M¡B®t¡B¿n¡B°Ó¤Î¾l¼Æ¦r¦ê¡C³o¾ã¬q¬yµ{¦p¤U¹Ï©Ò¥Ü¡G¤W¹Ï¤¤¡A¾í¦â¦rªº szCtFmt ®æ¦¡±±¨î¦r¦ê¡A´N¬O¥Î¨Ó»s³y­n¯u¥¿¦L¦b¿Ã¥ú¹õ¤Wªº®æ¦¡±±¨î¦r¦ê¡C¦³Ãö¨Ì¾Ú szCtFmt ®æ¦¡±±¨î¦r¦ê¥Í¦¨·sªº szFmt ®æ¦¡±±¨î¦r¦êªºµ{¦¡½X¦p¤U¡G

szCtFmt DB "%%d¡B%%d¤§©M¡B®t¡B¿n¡B°Ó¤Î¾l¼Æ¨Ì§Ç¬°",0dh,0ah,"%s¡B%s¡B%%I64d¡B%%d¾l%%d¡C",0
        ⁝
        invoke  wsprintf,ADDR szFmt,ADDR szCtFmt,r8,r9

¦b szCtFmt ®æ¦¡±±¨î¦r¦ê¤¤¡A¨â­Ó¡u%s¡v·|§â R8¡BR9 ©Ò«ü¦ì§}¤Wªº¦r¦ê¥N¤J¡A¦Ó²£¥Í·sªº szFmt¡F¦Ó¨ä¥Lªº¡u%%¡v¡Awsprintf ¥u·|§â¥¦­Ì·í°µ¤@­Ó¡u%¡vªº´¶³q¦r¤¸¡A·Ó§Û¶i szFmt¡CÁ|­Ó¨Ò¤l»¡©ú¡A¥i¯à·|§ó²M·¡¡C

°²³]¬Y¦¸¥Î x64dbg ¸ü¤J CALCULUS.EXE¡A¸ê®Æ°Ï¬qªº³¡¤À¸ê®Æ¦p¤U¡G

0A12000  00 00 00 00 00 00 00 00 00 00 00 00 25 25 64 A1  ............%%d.
0A12010  42 25 25 64 A4 A7 A9 4D A1 42 AE 74 A1 42 BF 6E  .%%d¤§©M¡B®t¡B¿n
0A12020  A1 42 B0 D3 A4 CE BE 6C BC C6 A8 CC A7 C7 AC B0  ¡B°Ó¤Î¾l¼Æ¨Ì§Ç¬°
0A12030  0D 0A 25 73 A1 42 25 73 A1 42 25 25 49 36 34 64  ..%s¡B%s¡B%%I64d
0A12040  A1 42 25 25 64 BE 6C 25 25 64 A1 43 00 25 75 00  ¡B%%d¾l%%d¡C.%u.
0A12050  2D 25 75 00 25 64 00 BD D0 BF E9 A4 4A AD 74 A4  -%u.%d.½Ð¿é¤J­t.
0A12060  47 A4 51 BB F5 A6 DC A4 47 A4 51 BB F5 A4 A7 B6  .¤Q»õ¦Ü¤G¤Q»õ¤§.

¨Ï¥ÎªÌ¦b CALCULUS ¨â¦¸´£¥Ü¡u½Ð¿é¤J­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡ªº¾ã¼Æ¡G¡v®É¡A¥ý«á¿é¤J­t¤G¤Q»õ©M¤G¤Q»õ¡A¨º»ò¨Ì¾Ú¤W­±¬yµ{¹Ï¡A³o¨â¼Æ¬Û¥[¬°¹s¡A¤£·¸¦ì¡AR8 ·|«ü¦V¦r¦ê¡u"%d",0¡vªº¦ì§}¡A§Y A12054h¡]¤Wªí¤¤¥Õ¦â¦r©Ò¥Ü¡^¡F¨â¼Æ¬Û´î¬°­t¥|¤Q»õ¡Aµo¥Í·¸¦ì¡AR9 ·|«ü¦V¦r¦ê¡u"-%u",0¡vªº¦ì§}¡A§Y A12050h¡]¤Wªí¤¤µµ¦â¦r©Ò¥Ü¡^¡C

·í°õ¦æ¨ì¡uinvoke wsprintf,ADDR szFmt,ADDR szCtFmt,r8,r9¡v®É¡Awsprintf ·|¨Ì¾Ú szCtFmt ªº¤º®e¡]¦p¤U¡^¡A§â szFmt ³v¨B»s³y¥X¨Ó¡A¹Lµ{¦p¤U¡G

szCtFmt DB "%%d¡B%%d¤§©M¡B®t¡B¿n¡B°Ó¤Î¾l¼Æ¨Ì§Ç¬°",0dh,0ah,"%s¡B%s¡B%%I64d¡B%%d¾l%%d¡C",0
  1. szCtFmt ¤@¶}©l¬O¨â­Ó¡u%%d¡v¡A¨ä¤¤ªº¡u%%¡v·|³Q wsprintf µø¬°´¶³q¦r¤¸¡u%¡v¦Ó¤£¬O®æ¦¡³W½dªº¶}©l¡C©Ò¥H¡u%%d¡v¥Nªí§â¡u%d¡v¶ñ¤J szFmt ¤¤¡A©ó¬O szFmt Åܬ°¡u"%d¡B%d"¡v¡C
  2. szCtFmt ±µ¤U¨Óªº´X­Ó¦r¤¸¡]¥]§t¡u0dh¡B0ah¡v©Ò¥Nªíªº´«¦æ²Å¸¹¡^¨ÃµL¯S®í¤§³B¡A·Ó§Û¶i¤J szFmt¡C©Ò¥H szFmt ªº¤º®eÅܦ¨¡u"%d¡B%d¤§©M¡B®t¡B¿n¡B°Ó¤Î¾l¼Æ¨Ì§Ç¬°",0dh,0ah¡v¡C
  3. szCtFmt ±µ¤U¨Óªº¬O®æ¦¡³W½d¡u%s¡v¡A¥Nªí­n¨ì wsprintf ªº²Ä¤T­Ó°Ñ¼Æ¡AR8¡A©Ò«ü¦ì§}¤Wªº¦r¡A¨Ã±N¸Ó¦r¦ê½Æ»s¨ì szFmt ùØ­±¡CR8¡×A12054h¡A©Ò¥H´N¨ì¦ì§} A12054h¡A§â¸Ó¦ì§}ªº¦r¦ê¡u"%d"¡v¥[¶i¨ì szFmt ùØ¡C©ó¬O szFmt Åܦ¨¡u"%d¡B%d¤§©M¡B®t¡B¿n¡B°Ó¤Î¾l¼Æ¨Ì§Ç¬°",0dh,0ah,"%d"¡v¡C
  4. ±µ¤U¨Ó¬O¡u¡B%s¡B%%I64d¡B%%d¾l%%d¡C¡v¡A°£¤F¡u%s¡v¬O®æ¦¡³W½d¤§¥~¡A¨ä¾l³£¬O´¶³q¦r¤¸·Ó§Û¼g¤J szFmt¡C¦Ó¡u%s¡v¶·¨ì²Ä¥|­Ó°Ñ¼Æ¡AR9¡A©Ò«üªº¦ì§}¡A¤]´N¬O¦ì§} A12050h¡A§â¸Ó¦ì§}ªº¦r¦ê¡u"-%u"¡v´O¤J¨ì szFmt ¤º¡C©ó¬O szFmt Åܦ¨¡u"%d¡B%d¤§©M¡B®t¡B¿n¡B°Ó¤Î¾l¼Æ¨Ì§Ç¬°",0dh,0ah,"%d¡B-%u¡B%I64d¡B%d¾l%d¡C"¡v

¸g¥Ñ¤W­±´X­Ó¨BÆJ©Ò¥Í¦¨ªº®æ¦¡±±¨î¦r¦ê¡AszFmt¡A·|¦b±µ¤U¨Óªºµ{¦¡¤¤¡A¦A¦¸¦¨¬°©I¥s wsprintf ªº°Ñ¼Æ¡A´N¬O¤W­±¬yµ{¹Ïªº³Ì«á¤@¨BÆJ¡C³o¤@¦¸·|»s³y¥X­n¦L¦b¿Ã¥ú¹õªº¦r¦ê¡A³Ì«á©I¥s WriteConsole ¦L¦b¿Ã¥ú¹õ¤W¡C

³B²z 64 ¦ì¤¸ªº­¼¿n

CALCULUS ¥Î 32 ¦ì¤¸ªº¦³¸¹¼Æ­¼¥H 32 ¦ì¤¸ªº¦³¸¹¼Æ¡A©Ò±oªº¿n¬° 64 ¦ì¤¸¡A¦s©ó¨â­Ó 32 ¦ì¤¸ªº¼È¦s¾¹ EDX¡BEAX ùØ­±¡A¥H EDX:EAX ªí¥Ü¡AEDX ¬O°ª¥b³¡ªº 32 ¦ì¤¸¡AEAX §C¥b³¡ªº 32 ¦ì¤¸¡C¦Ó CALCULUS ¦b¸ê®Æ°Ï¬q¤º¡A«o¬O¥Î DQ ©w¸q product ¬° 64 ¦ì¤¸¡C¦]¦¹¥²¶·¤À¨â¦¸±N EAX¡BEDX ¦s¤J product¡A³o®É­Ô¥²¶·¥Î DWORD PTR ±j¨î§ïÅÜ product ªº¸ê®ÆÃþ«¬¡C

product DQ      ?       ;¿n
         ⁝
        mov     eax,n1
        imul    n2      ;EDX:EAX=EAX¡Ñn2
        mov     DWORD PTR product,eax
        mov     DWORD PTR product[4],edx
         ⁝
        invoke  wsprintf,ADDR szAns,ADDR szFmt,n1,n2,sum,difference,product,quotient,remainder

µM«á©I¥s wsprintf ±N product Âà´«¦¨¼Æ¦r¦r¦ê¡A­nª`·Nªº¬O¡Aproduct ¥H DQ ©w¸q¡A¨ä¬Û¹ïÀ³ªº®æ¦¡³W½d¬O¡u%I64d¡v¡C

³B²z°£ªkªº°ÝÃD

°£ªkªº°ÝÃD¦³¨â­Ó¡G①·¸¦ì¡B②¾l¼Æªº¥¿­t¡C

ÁöµM DIV ©Î IDIV «ü¥O¬O¦³¥i¯àµo¥Í·¸¦ìªº±¡§Î¡A¦ý¬O«oµLªk¥Ñ·¸¦ìºX¼Ð¤¤±o¨ì¡C¦]¬°¥»³¹¼ÐÃD¬O¦³¸¹¼Æ¡A©Ò¥HÁ|¤@­Ó 32 ¦ì¤¸ªº IDIV ¬°¨Ò¤l¡A»¡©úµo¥Í·¸¦ìªº±¡§Î¡FDIV ¤]¬O¤@¼Ëªº¹D²z¡AÁo©úªº§AÀ³¸Ó¯àIJÃþ®Ç³q¡CIDIV «ü¥O°õ¦æ«e¶·±N 64 ¦ì¤¸ªº³Q°£¼Æ©ñ¦b EDX:EAX ùØ¡A32 ¦ì¤¸ªº°£¼Æ©ñ¦b¼È¦s¾¹©ÎÅܼÆùØ¡C°²¦p¥Î¥|¤Q»õ°£¥H¤@¡A±o¨ìªº°Ó¬O¥|¤Q»õ¡A¾l¼Æ¬O¹s¡A¦p¤U­±µ{¦¡¡G

        mov     eax,0EE6B2800h
        mov     edx,0
        mov     r8d,1
        idiv    r8d

©Ò±oªº°Ó¦s©ó EAX¡AÅãµM¶W¹L 32 ¦ì¤¸¦³¸¹¼Æ©Ò¯àªí¥Üªº½d³ò¡C¹³³o¼Ë¡A³Q°£¼Æ¤Ó¤j¦Ó°£¼Æ¤Ó¤p¡A¾É­P°ÓµLªk¦s©ó²Ö¥[¾¹¤¤¡]x64 CPU ¤¤ªº AX ºÙ¬°²Ö¥[¾¹¡Aaccumulator¡A³oùØ¥]§t EAX¡BRAX¡^¡A¶i¦Óµo¥Í·¸¦ì¡CµM¦Ó¦b x64 CPU ¤¤¡A³oºØ·¸¦ì·|¤Þµo°£ªk¿ù»~¨Ò¥~¡]²ºÙ #DE¡^¡A¤£·|¦bºX¼Ð¤¤ªí²{¥X¨Ó¡C

x64 CPU ¦b°õ¦æ«ü¥Oªº¹Lµ{¤¤¡A¦pªG°»´ú¨ì²§±`©Î¯S®í±¡ªp¡A»Ý­n¼È®É¤¤Â_¥Ø«eªºµ{¦¡¡AÂà¦Ó°õ¦æ±Mªù³B²z¸Ó±¡ªpªºµ{¦¡½X¡]ºÙ¬°¡u¨Ò¥~³B²z±`¦¡¡v¡^¡A³oºØ±¡§ÎºÙ¬°¨Ò¥~¡]exception¡^¡Cx64 CPU ªº¨CºØ¨Ò¥~³£¥H¡u#¡v¶}ÀY¡A¨Ã¥HÁY¼gªí¥Ü¡A¨Ò¦p #DE ªí¥Ü°£ªk¿ù»~¨Ò¥~¡]divide error exception¡^¡A#GP ªí¥Ü¤@¯ë«OÅ@¿ù»~¡]general protection exception¡^¡K¡K¡C¦Ó¨Ò¥~³B²z±`¦¡¤@¯ë³£¥]§t¦b§@·~¨t²Î¤º¡AÀ³¥Îµ{¦¡³q±`¤£³B²z¨Ò¥~¡C

À³¥Îµ{¦¡¯à°µªº¬O¹w¨¾ #DE µo¥Í¡C°£¤F­è­è»¡ªº³Q°£¼Æ¤Ó¤j¦Ó°£¼Æ¤Ó¤p¡A¾É­P°Ó¶W¹L©Ò¯àªí¥Üªº½d³ò·|¤Þµo #DE ¤§¥~¡A°£¥H¹s¤]·|¤Þµo #DE¡C¹ï©ó«áªÌ¡ACALCULUS ¤w°µ¹w¨¾¡C¹ï©ó«eªÌ¡A¥i¥H°Ñ¦Ò DOS ²Õ¦X»y¨¥²Ä¤C³¹µù¤@¡A¦Û¦æ§ï¨} CALCULUS¡C

±µµÛ»¡©ú¾l¼Æªº¥¿­t­È¡C«e¤@³¹´¿´£¹L¡A¤£½×³Q°£¼Æ©Î°£¼Æ¬O¥¿­È¡BÁÙ¬O­t­È¡A³£À³¿í¦u¨äµ´¹ï­È¤p©ó°£¼Æªºµ´¹ï­È¡C³o¼Ë´N³y¦¨¨âºØ©w¸q¡G①¾l¼Æ¬°¥¿­È¡A³o¬O¦h¼Æ¼Æ¾Ç®a±Ä¥Îªº¡C②¾l¼Æ»P³Q°£¼Æ¦P¸¹¡A³o¬O IDIV ±Ä¥Îªº¡C¬°¤F²Å¦X¦h¼Æ¼Æ¾Ç®a±Ä¥Îªº©w¸q¡ACALCULUS ¥²¶·¹ï°õ¦æ IDIV «áªºµ²ªGµy§@­×§ï¡AÅý§Ú­Ì±qÀY¶}©l»¡©ú°£ªkªº¹B§@¹Lµ{¡C

CALCULUS Åý¨Ï¥ÎªÌ¿é¤J 32 ¦ì¤¸ªº¦³¸¹¼Æ¡A¶i¦æ 32 ¦ì¤¸ªº¦³¸¹¼Æ°£ªk¡A³Q°£¼ÆÀ³¬° 64 ¦ì¤¸¡A¦s©ó EDX:EAX ùØ¡C§C¥b³¡ªº 32 ¦ì¤¸¥i¥H¨Ï¥Î MOV «ü¥O¡A¦Ó°ª¥b³¡ªº 32 ¦ì¤¸¥²¶·¬O§C¥b³¡ªº²Å¸¹¦ì¤¸©µ¦ù¡A©Ò¥H¶·¨Ï¥Î CDQ «ü¥O¡C¨£ CALCULUS.ASM ²Ä 101¡ã102 ¦æ¡C±µ¤U¨Ó°õ¦æ IDIV «ü¥O¡A¦pªG¾l¼Æ¬O¥¿­È¡A¨º»ò´N¨S°ÝÃD¥i¥H§â°Ó»P¾l¼Æ¦s¤J quotient¡Bremainder ÅܼÆùØ¡F¦pªG¾l¼Æ¬O­t­È¡A¤~¶·½Õ¾ã¡C

³Q°£¼Æ»P°£¼Æ¥i¯à¬°¥¿¡B¥ç¥i¯à¬°­t¡A¦@¦³¥|ºØ±¡§Î¡A¨£¤Uªí¡G

³Q°£¼Æ°£¼Æ¨Ò¤l¨Ï¾l¼Æ¬°¥¿
¥¿¼Æ¥¿¼Æ(+23)¡Ò(+4)¡×+5¡K¡K+3¤£¶·­×¥¿
¥¿¼Æ­t¼Æ(+23)¡Ò(-4)¡×-5¡K¡K+3¤£¶·­×¥¿
­t¼Æ¥¿¼Æ(-23)¡Ò(+4)¡×-5¡K¡K-3(-23)¡Ò(+4)¡×-6¡K¡K+1
­t¼Æ­t¼Æ(-23)¡Ò(-4)¡×+5¡K¡K-3(-23)¡Ò(-4)¡×+6¡K¡K+1

Æ[¹î¤Wªí·í¥iµo²{¡A¦pªG³Q°£¼Æ¬°¥¿¼Æ¡A¾l¼Æ¥²¬°¥¿¼Æ¡A¤£¶·­×¥¿¾l¼Æ¡F³Q°£¼Æ¬°­t¼Æ¡A¾l¼Æ¥ç¬°­t¼Æ¡A¤~­n­×¥¿¾l¼Æ¡C­×¥¿¾l¼Æ¤´±o¿í¦u©³¤Uªº¤èµ{¦¡¡G

a¡×dq¡Ïr¡A¥B 0¡Õ|r|¡Õ|d|

¨ä¤¤ a¡Bd¡Bq¡Br ¨Ì§Ç¬O³Q°£¼Æ¡B°£¼Æ¡B°Ó¤Î¾l¼Æ¡A¦Ó¥B³£¬O¾ã¼Æ¡C²{¦b¬Ý¤Wªí¤¤¶·­n­×¥¿¾l¼Æªº±¡§Î¡A¹³²Ä¤TºØ±¡§Î¡A°£¼Æ¬O¥¿¼Æ¡A­×¥¿®É¨Ï­ì¨Ó¾l¼Æ¥[¤W°£¼Æ§Y¥iÅܦ¨¥¿¼Æ¡A¦Ó°Ó«h¶·´î¤@¡F²Ä¥|ºØ±¡§Î¡A°£¼Æ¬O­t¼Æ¡A­×¥¿®É¨Ï­ì¨Ó¾l¼Æ´î¥h°£¼Æ§Y¥iÅܦ¨¥¿¼Æ¡A¦Ó°Ó«h¶·¥[¤@¡C