¥»³¹±µÄò«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
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¾Ü¤@¡FY¬Ù²¤ªí¥Ü¥¿È¡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È¡GY¦r¦ê¦¨¥\Âà´«¡A¶Ç¦^ TRUE¡F§_«h¶Ç¦^ FALSE¡C
¬Ý§¹©³¤Uªº¨Ò¤l·|§ó²M·¡ StrToIntEx ¨ç¦¡¡G
| ¼Æ¦r¦r¦ê | STIF_DEFAULT | STIF_SUPPORT_HEX | »¡©ú | ||
| µ²ªG | ¦^¶ÇÈ | µ²ªG | ¦^¶ÇÈ | ||
| "123",0 | 123 | TRUE | 123 | TRUE | ¦r¦ê¨S¦³¡u0x¡v°_ÀY¡A¬Gµø¬°¤Q¶i¦ì |
| " + 123",0 | 0 | FALSE | 0 | FALSE | ¡u+¡v»Pªü©Ô§B¼Æ¦r¤§¶¡¤£¯à¦³ªÅ¥Õ¡A±µ¦¬ªºÅܼƷ|Åܦ¨ 0 |
| "-123",0 | -123 | TRUE | -123 | TRUE | ¦r¦ê¨S¦³¡u0x¡v°_ÀY¡A¬Gµø¬°¤Q¶i¦ì |
| "0x123",0 | 0 | TRUE | 291 | TRUE | STIF_DEFAULT ®Éµø¬°¤Q¶i¦ì¡AÂà´«¨ìºÓ«D¼Æ¦rµ²§ô¡F STIF_SUPPORT_HEX ®Éµø¬°¤Q¤»¶i¦ì¡A123h=291d |
| "-0x123",0 | 0 | TRUE | 291 | TRUE | STIF_DEFAULT ®Éµø¬°¤Q¶i¦ì¡AÂà´«¨ìºÓ«D¼Æ¦rµ²§ô¡F STIF_SUPPORT_HEX ®Éµø¬°¤Q¤»¶i¦ì¡u0x¡v¤§«eªº¡u-¡v·|³Q©¿²¤ |
| "4F",0 | 4 | TRUE | 4 | TRUE | ¦r¦ê¨S¦³¡u0x¡v°_ÀYµø¬°¤Q¶i¦ì¡A¨ì²Ä¤@Ó«D¼Æ¦r°±¤î |
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
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
¨ì³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 "½Ð¿é¤Jt¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡ªº¾ã¼Æ¡G"
sErr0 DB "µLªkÂà´«¦¨¾ã¼Æ¡I"
sErr1 DB "±z¿é¤Jªº¼Æ¤£¦bt¤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ªº¾ã¼Æ¤£¦bt¤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§_¦bt¤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¤£¦bt¤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¤£¦bt¤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§_¬°¥¿¼Æ¡AY¬°¥¿¸õ¦Ü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 ¥\¯àÁöµM«Ü²³æ¡A¦ý¬On¦Ò¼{ªº²Ó¸`¡A«o¬O¤£¤Ö¡C
º¥ý¡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
ų©ó¤W±±¡§Î¡A¤p¤ì°¸±N Input ªº¦^¶Çȳ]¬°¨âÃþ±¡§Î¡G
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¥Î¡An¦Ò¼{ªº¬O¦p¦ó½Õ¾ã¡A¨Ï¾l¼ÆÅܬ°¥¿¼Æ¡A¥H²Å¦X¼Æ¾Ç¤Wªºn¨D¡C©³¤U´N³o¨Ç«ü¥O¤À§O»¡©ú¡C
°²¦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³ò¬Ot¤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¼Æ¡]¨Ò¦pt¤G¤Q»õ¥[t¤G¤Q»õ¡^¡B¸û¤jªº¥¿¼Æ´î¸û¤pªºt¼Æ¡]¨Ò¦p¤G¤Q»õ´ît¤G¤Q»õ¡^¡B¸û¤pªºt¼Æ´î¸û¤jªº¥¿¼Æ¡]¨Ò¦pt¤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¼Æ¡]¨Ò¦pt¥|¤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¬Ot¼Æ¡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¥¿¼ÆÁÙ¬Ot¼Æ¡A¦pªG¬O¥¿¼Æ¡Aªí¥Ü©M¶W¹L¤G¤Q¤@»õ¡A®æ¦¡³W½d¬O¡u%u¡v¡F¦pªG¬Ot¼Æ¡Aªí¥Ü©M¤p©ót¤G¤Q¤@»õ¡An¥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
¨ì¦¹¤jP¤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
¦^·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³yn¯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.½Ð¿é¤Jt. 0A12060 47 A4 51 BB F5 A6 DC A4 47 A4 51 BB F5 A4 A7 B6 .¤Q»õ¦Ü¤G¤Q»õ¤§.
¨Ï¥ÎªÌ¦b CALCULUS ¨â¦¸´£¥Ü¡u½Ð¿é¤Jt¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡ªº¾ã¼Æ¡G¡v®É¡A¥ý«á¿é¤Jt¤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
¸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¥Xn¦L¦b¿Ã¥ú¹õªº¦r¦ê¡A³Ì«á©I¥s WriteConsole ¦L¦b¿Ã¥ú¹õ¤W¡C
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¦ê¡Anª`·Nªº¬O¡Aproduct ¥H DQ ©w¸q¡A¨ä¬Û¹ïÀ³ªº®æ¦¡³W½d¬O¡u%I64d¡v¡C
°£ª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ÁÙ¬OtÈ¡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¼Æ¬OtÈ¡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°£¼Æ¬Ot¼Æ¡A×¥¿®É¨Ïì¨Ó¾l¼Æ´î¥h°£¼Æ§Y¥iÅܦ¨¥¿¼Æ¡A¦Ó°Ó«h¶·¥[¤@¡C