²Ä¤Q³¹¡@°j°é

¹q¸£³Ì¾Õªøªº¤u§@¬O¯à°÷«Ü¦³­@¤ßªº¡A­«½Æ¼Æ¤d¦¸¡B¼Æ¸U¦¸¬\Àê¥F¨ýªº¨Æ±¡¡C³o¤@³¹¤¶²Ð²Õ¦X»y¨¥¤¤ªº°j°é¡A°j°é¬Oµ{¦¡³]­p¤¤ªº¤@ºØ¬yµ{¡AÅý¹q¸£¯à°÷­«½Æ°õ¦æ¦P¤@¬qµ{¦¡½X¦h¦¸¡Aª½¨ìº¡¨¬¯S©w±ø¥ó¤~°±¤î¡C

¤@¦p¬J©¹¡A¥»³¹·|¥H´X­Ó¨Ò¤l»¡©ú°j°é¡A³o¨Ç¨Ò¤l»Pµ¥®t¼Æ¦C¦³Ãö¡A©Ò¥H¥ý¤¶²Ð¤°»ò¬Oµ¥®t¼Æ¦C¡C¦pªG§â¤@¨t¦Cªº¼Æ­È±Æ¦C¦b¤@°_¡A¦Ó¥B¥ô¦ó¬Û¾F¨â¼Æªº®t§¡¬Ûµ¥¡A´NºÙ¦¹¼Æ¦C¬°µ¥®t¼Æ¦C¡]arithmetic sequence¡A¤]ºÙ¬°ºâ³N¼Æ¦C¡^¡C¸Ó®t­ÈºÙ¬°¤½®t¡]common difference¡^¡A³q±`¥H d ªí¥Ü¡F¨C­Ó¼Æ³£ºÙ¬°¶µ¡]term¡^¡F³o¼Æ¦CÁ`¦@¦³¦h¤Ö­Ó¶µ¡AºÙ¬°¶µ¼Æ¡]number of terms¡^¡F³o¨Ç¼Æªº²Ä¤@­ÓºÙ¬°­º¶µ¡]¥H a1 ªí¥Ü¡^¡A²Ä¤G­ÓºÙ¬°²Ä¤G¶µ¡]¥H a2 ªí¥Ü¡^¡K¡K¨Ì¦¹Ãþ±À¡A³Ì«á¤@¶µºÙ¬°¥½¶µ¡F³o­Ó¼ÆªºÁ`©M¡AºÙ¬°µ¥®t¯Å¼Æ¡]arithmetic series¡A³q±`¥H Sn ªí¥Ü¡^¡C¨Ò¦p©³¤Uªº¼Æ¦C¡A´N¬Oµ¥®t¼Æ¦C¡G

1¡B3¡B5¡B7¡B¡K¡K¡B99

¥¦ªº¤½®t¬O 2¡A­º¶µ¬O 1¡A²Ä¤G¶µ¬O 3¡A¥½¶µ¬O 99¡A¶µ¼Æ¬O 50¡C

·sªº x64 «ü¥O

x64 «ü¥O¡GLOOP

LOOP «ü¥Oªº»yªk¬O

LOOP    ¼Ð°O

¼Ð°O¡]label¡^¬O¤@¦ê­^¤å¦r²Õ¦¨¡A¥i¥H¥]§t¡u_¡v¡Bªü©Ô§B¼Æ¦r¡A¥²¶·¥H¡u:¡vµ²§À¡C¥¦¥NªíµÛ¦ì§}¡A³q±`¦ì©ó LOOP «ü¥O¤§«eªº¦ì§}¡]©Î¸û§C¦ì§}¡^¡A¥B¶ZÂ÷ LOOP «ü¥O©Ò¦b¦ì§}¤£¥i¶W¹L 128 ­Ó¦ì¤¸²Õ¡A¦b¦¹¼Ð°O»P LOOP ¤§¶¡ªº«ü¥O·|­«½Æ°õ¦æ¡C

­n­«½Æ°õ¦æ¦h¤Ö¦¸¡A¥Ñ CX¡BECX ©Î RCX «ü©w¡F¦Ü©ó¬O­þ­Ó¼È¦s¾¹¡A¥Ñ¦ì§}¤j¤p¡]address size¡^¡v¨M©w¡C64 ¦ì¤¸ª©ªº Windows¡A¦ì§}¤j¤p¬O 64 ¦ì¤¸¡A¬G­«½Æ¦¸¼Æ©ñ¦b RCX¡F32 ¦ì¤¸ª©ªº Windows¡A¦ì§}¤j¤p¬O 32 ¦ì¤¸¡A¬G­«½Æ¦¸¼Æ©ñ¦b ECX¡FMS¡ÐDOS ¬O 16 ¦ì¤¸ªº¡A¦ì§}¤j¤p¤]¬O 16 ¦ì¤¸¡A¬G­«½Æ¦¸¼Æ¬O CX¡C¦]¬° CX¡BECX¡BRCX ¥Î©ó­p¼Æ¡A©Ò¥H¥¦­Ì¤]ºÙ¬°­p¼Æ¼È¦s¾¹¡]count register¡^¡C

·í CPU °õ¦æ¨ì LOOP «ü¥O®É¡ACPU ¥ý¨Ï­p¼Æ¼È¦s¾¹´î¤@¡AµM«á¦AÀˬd­p¼Æ¼È¦s¾¹¬O§_¬°¹s¡C¦pªG¤£¬O¹s¡A´N¸õÅD¦Ü¼Ð°O³B°õ¦æ¡F¦pªG¬O¹s¡A´N¤£¸õÅD¡A¦Ó¬O°õ¦æ LOOP ¤U¤@­Ó«ü¥O¡C

©³¤UÁ|­Ó¨Ò¤l»¡©ú¦p¦ó¨Ï¥Î LOOP «ü¥O¡C°²¦p­n¨Ï°O¾ÐÅ餤¶ñ¤J 1¡B2¡B3¡B¡K¡K¡B100 ªºµ¥®t¼Æ¦C¡A¥i¥H¨Ï¥Î¤U­±µ{¦¡¡C­º¥ý©w¸q¤@¦Ê­Ó¦ì¤¸²Õªøªº number ÅܼơA¨Cµ§¸ê®Æ§¡¤@­Ó¦ì¤¸²Õ¡C¦b again: ¼Ð°O¨ì LOOP «ü¥O¤§¶¡ªºµ{¦¡·|­«½Æ°õ¦æ¡A³o´N¬O°j°é¡C

number  DB      100 DUP (0)
         ⁝
        mov     rcx,100
        mov     al,0
        lea     rsi,number
again:  inc     al       ;─┐
        mov     [rsi],al ; ├─°j°é
        inc     rsi      ; │¡]Ãö©ó[RSI]ªº·N¸q¡A°Ñ¾\²Ä¤G³¹¡^
        loop    again    ;─┘

°²³]³o¬qµ{¦¡¸ü¤J°O¾ÐÅ餤®É¡Anumber ¦b¦ì§} 0EE2000h ³B¡C¨º»ò¦bÁÙ¥¼°õ¦æ°j°é¤§«e¡A°O¾ÐÅ餺®e¦p¤U¡G

0EE2000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0EE2000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
0EE2000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

⑴¡B³Ì«e­±ªº¤T­Ó«ü¥O¡A¬O¥Î¨Óªì©l¤Æ°j°é©Ò»ÝªºÅܼơG①³]©w­p¼Æ¼È¦s¾¹¬° 100¡Aªí¥Ü°j°é­n°õ¦æ 100 ¦¸¡C②§â AL ³]¬°¹s¡A¨C°õ¦æ¤@¦¸°j°é¡AAL ´N¼W¥[¤@¡C¦Ó¥B¬O±q¤@¶}©l¡A¨ì 100¡C③¨Ï RSI «ü¦V number ªº¦ì§}¡C

⑵¡B²Ä¤@¦¸¶i¤J°j°é®É¡AAL ­ì¬°¹s¡A¼W¥[¤@«áÅܦ¨¤@¡F¦A§â AL ¦s¤J RSI ©Ò«ü¦ì§}ªº°O¾ÐÅéùØ­±¡A³o®É RSI¡×EE2000h¡A¤]´N¬O§â AL ¤§­È¦s©ó¦ì§}¬° EE2000h ªº°O¾ÐÅ餧¤¤¡]¨£¤U­±°O¾ÐÅ餺®e¡^¡FµM«á¨Ï RSI ¥[¤@¡A«ü¦V¤U¤@­Ó°O¾ÐÅé¦ì§}¡AEE2001h¡C°j°é³Ì«á¬O LOOP «ü¥O¡ACPU §â RCX ´î¤@Åܦ¨ 99¡A¤£¬O¹s¸õ¦Ü again: ³B¡C

0EE2000  01 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00  ................

⑶¡B²Ä¤G¦¸°õ¦æ°j°é®É¡AAL ­ì¬°¤@¡A¼W¥[¤@«áÅܦ¨¤G¡F¦A§â AL ¦s¤J RSI ©Ò«ü¦ì§}ªº°O¾ÐÅéùØ­±¡A³o®É RSI¡×EE2001h¡A¤]´N¬O§â 2 ¦s©ó¦ì§}¬° EE2001h ªº°O¾ÐÅ餧¤¤¡]¨£¤U­±°O¾ÐÅ餺®e¡^¡FµM«á¨Ï RSI ¥[¤@¡A«ü¦V¤U¤@­Ó°O¾ÐÅé¦ì§}¡AEE2002h¡C±µ¤U¨Óªº LOOP ¨Ï RCX ´î¤@Åܬ° 98¡A¤£¬O¹s¸õ¦Ü again: ³B¡C

0EE2000  01 02 00 00 00 00 00-00 00 00 00 00 00 00 00 00  ................

⑷¡B¦p¦¹¤@ª½­«½Æ¡Aª½¨ì°j°é¤w¸g°õ¦æ¹L 99 ¦¸«á¡]¤]´N¬O°õ¦æ¹L 99 ¦¸ LOOP «ü¥O«á¡^¡A¥B¸õ¦Ü again: ®É¡ARCX¡×1¡AAL¡×99¡ARSI¡×0EE2063h¡C¦Ó³o®É­Ô¡A°O¾ÐÅ餺®e¦p¤U¡G

0EE2000  01 02 03 04 05 06 07 08-09 0A 0B 0C 0D 0E 0F 10  ................
0EE2010  11 12 13 14 15 16 17 18-19 1A 1B 1C 1D 1E 1F 20  ...............
0EE2020  21 22 23 24 25 26 27 28-29 2A 2B 2C 2D 2E 2F 30  !"#$%&'()*+,-./0
0EE2030  31 32 33 34 35 36 37 38-39 3A 3B 3C 3D 3E 3F 40  123456789:;<=>?@
0EE2040  41 42 43 44 45 46 47 48-49 4A 4B 4C 4D 4E 4F 50  ABCDEFGHIJKLMNOP
0EE2050  51 52 53 54 55 56 57 58-59 5A 5B 5C 5D 5E 5F 60  QRSTUVWXYZ[\]^_`
0EE2060  61 62 63 00 00 00 00 00-00 00 00 00 00 00 00 00  abc.............

¤Uªí¬O±qªì©l¤Æ°j°é¶}©l¡A¥H¤Î¦U¦¸°õ¦æ¹L LOOP ¤§«á¡AAL¡BRCX¡BRSI ¼Æ­Èªº¾ã²z¡G

¡@¡@±¡ªp¡@¡@¡@¡@¡@¡@AL¡@RCX¡@¡@¡@RSI
------------------------------------------------
©|¥¼¶i¤J°j°é«eLOOP¡@0 ¡@100¡@¡@EE2000h
²Ä¤@¦¸°õ¦æ§¹LOOP¡@¡@1¡@¡@99¡@¡@EE2001h
²Ä¤G¦¸°õ¦æ§¹LOOP¡@¡@2¡@¡@98¡@¡@EE2002h
²Ä¤T¦¸°õ¦æ§¹LOOP¡@¡@3¡@¡@97¡@¡@EE2003h
 ⁝¡@¡@¡@¡@¡@¡@¡@¡@¡@ ⁝¡@¡@¡@⁝     ⁝
²Ä99¦¸°õ¦æ§¹LOOP¡@63h ¡@¡@1   EE2063h

⑸¡B¦A°õ¦æ°j°é®É¡AAL Åܬ° 100¡]§Y¤Q¤»¶i¦ìªº 64h¡^¡A±µ¤U¨Ó§â AL ¦s¤J RSI ©Ò«üªº°O¾ÐÅé¦ì§}¡]§Y¦ì§} 0EE2063h¡^¡C±µ¤U¨Ó¨Ï RSI ¥[¤@«ü¦V¤U¤@­Ó¦ì§}¡A¦ý³o¨BÆJ¨S¥Î¡A¦]¬°§Y±N¸õ²æ°j°é¡C¦A¨Ó¬O°õ¦æ LOOP «ü¥O¡A¦]¬°³o®É RCX¡×1¡A´î¤@¤§«áÅܬ°¹s¡A¨Ã¤£·|¸õ¦Ü again: ³B¡A¦Ó¬O°õ¦æ LOOP ªº¤U¤@­Ó«ü¥O¡A©ó¬O´N¸õÂ÷°j°é¤F¡C

¦³Ãö LOOP «ü¥OÁÙ¦³¥ó¨Æ­È±oª`·N¡A¬Y¨Ç±¡§Î¤U§â­p¼Æ¼È¦s¾¹³]¬°¹s¡A¨Ã¤£¬O¤£°õ¦æ°j°é¡A¦³¥i¯à°õ¦æ«Ü¦h¦¸¡C¨Ò¦p

        mov     rcx,0
        mov     al,0
        lea     rsi,number
again:  inc     al
        mov     [rsi],al
        inc     rsi
        loop    again

¨Ã¤£¬O¤£°õ¦æ°j°é¡A¦Ó¬O·|°õ¦æ«Ü¦h¦¸¡C¦]¬°²Ä¤@¦¸°õ¦æ¨ì LOOP ®É¡A·|¥ý§â RCX ´î¤@¡A¨Ï¥¦Åܦ¨ 264-1¡A¦]¦¹²z½×¤W·|¶i¦æ 264 ¦¸°j°é¡C¦ý¥Ñ©óµ{¦¡·|¤£Â_¼g¤J°O¾ÐÅé¡A«Ü§Ö´N·|¶W¥X¦Xªk°O¾ÐÅé½d³ò¨Ã²£¥Í¦s¨ú¹H¨Ò¡]access violation¡^¡A¾É­Pµ{¦¡±Y¼ì¡C

x64 «ü¥O¡GLOOPZ/LOOPE »P LOOPNZ/LOOPE

LOOPZ »P LOOPE ¬O¬Û¦Pªº«ü¥O¡A¥¦¥ý±N­p¼Æ¼È¦s¾¹´î¤@¡AµM«á¦AÀˬd­p¼Æ¼È¦s¾¹¬O§_¤£µ¥©ó¹s¡A¥B¹s­ÈºX¼Ð¬O§_¬°¤@¡F¥u¦³¦b¨âªÌ¦P®É¦¨¥ß®É¡A¤~·|¸õ¦^¼Ð°O¦ì§}³BÄ~Äò°j°é¡C

LOOPNZ »P LOOPNE ¬O¬Û¦Pªº«ü¥O¡A¥¦¥ý±N­p¼Æ¼È¦s¾¹´î¤@¡AµM«á¦AÀˬd­p¼Æ¼È¦s¾¹¬O§_¤£µ¥©ó¹s¡A¥B¹s­ÈºX¼Ð¬O§_¬°¹s¡A¥u¦³¦b¨âªÌ¦P®É¦¨¥ß®É¡A¤~·|¸õ¦^¼Ð°O¦ì§}³BÄ~Äò°j°é¡C

¦³Ãö LOOPZ »P LOOPNZ ÁÙ¦³¤@¥ó¨Æ­nª`·N¡A¥¦­Ì¥»¨­¤£·|§ïÅܹs­ÈºX¼Ð¡A¦Ó¬O¨Ì¿à¥ý«e«ü¥O¹ï¹s­ÈºX¼Ðªº¼vÅT¡A¨Ó§PÂ_¬O§_Ä~Äò°j°é¡C

x64 «ü¥O¡GJO »P JNO

JO «ü¥O¥Î©óÀˬd¹Bºâµ²ªG¬O§_µo¥Í·¸¦ì¡A¦pªGµo¥Í·¸¦ì¡A¨º»ò CPU ·|§â·¸¦ìºX¼Ð³]¬°¤@¡FJO ÀË´ú¨ì·¸¦ìºX¼Ð¬°¤@¡A´N·|µo¥Í¸õÅD¡C¦pªG¨S¦³µo¥Í·¸¦ì¡ACPU ·|§â·¸¦ìºX¼Ð³]¬°¹s¡FJO ÀË´ú¨ì·¸¦ìºX¼Ð¬°¹s¡A¤£µo¥Í¸õÅD¡CJNO «ü¥O«h¬O¤Ï¹L¨Ó¡A¦pªG¤£µo¥Í·¸¦ì¡A¤~¸õÅD¡Fµo¥Í·¸¦ì¡A¤£¸õÅD¡C

¥t¥~¦³³\¦h±`¥Îªº±ø¥ó¸õÅD«ü¥O¡A¤w¾ã²z¦¨¤@±iªí¡A½Ð°Ñ¾\²Ä¤K³¹¡C


¨Ò¤l¤@

©³¤Uªº¨Ò¤l¬O­pºâ 1+2+3+¡K¡K+100 µ¥©ó¦h¤Ö¡H

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
;­pºâ1+2+3+¡K¡K+100µ¥©ó¦h¤Ö¡H
INCLUDE E:\masm64\include64\masm64rt.inc
number_of_terms EQU 100
;******************************************************************************
.DATA
hStdOut DQ      ?
szFmt   DB      "1+2+3+¡K¡K+%d=%d",0
buffer  DB      20h DUP (0)
;******************************************************************************
.CODE
;------------------------------------------------------------------------------
main    PROC
        LOCAL   written:DWORD
    ;¨ú±o¼Ð·Ç¿é¥X±±¨î¥N½X
        invoke  GetStdHandle,STD_OUTPUT_HANDLE
        mov     hStdOut,rax
    ;­pºâ1+2+3+¡K¡Kµ¥©ó¦h¤Ö¡H
    ;¨ä¤¤R8D¬°¼Æ¦C¡A¥Ñ1¶}©l¨C¦¸¼W¥[¤@¡CR9D¬°¨äÁ`©M¡C
        xor     r8d,r8d
        xor     r9d,r9d
        mov     rcx,number_of_terms
again:  inc     r8d
        add     r9d,r8d
        loop    again
    ;¦L¥X1+2+3+¡K¡Kªºµ²ªG
        invoke  wsprintf,ADDR buffer,ADDR szFmt,r8d,r9d
        invoke  WriteConsole,hStdOut,ADDR buffer,eax,ADDR written,0
        invoke  ExitProcess,0
main    ENDP
;------------------------------------------------------------------------------
END

±N¥¦¦s¦¨ AS1.ASM¡AµM«á¦b©R¥O´£¥Ü¦r¤¸¤¤¿é¤J©³¤U©R¥O¡A±N¨ä²ÕĶ¡B³sµ²¡G

path E:\masm64\bin64;%path%
set link=/subsystem:console /entry:main
ml64 as1.asm

»¡©ú

¦]¬° AS1.ASM ¨Ã¤£Ãø¡A©Ò¥H¤£¥´ºâÁ¿¸Ñ¡A¥u¦C¥X¦b¶i¤J°j°é«e¡A¥H¤Î°õ¦æ°j°é­Y¤z¦¸ RCX¡BR8D¡BR9D ªºÅܤơAÁo©ú¦p§AÀ³·í¥i¥H±ÀºV¦Ó±o¨ì¡G

¡@¡@±¡ªp¡@¡@¡@¡@¡@¡@R8D¡@¡@R9D¡@¡@RCX
------------------------------------------------
©|¥¼¶i¤J°j°é«eLOOP¡@0¡@¡@¡@¡@0¡@¡@100
²Ä¤@¦¸°õ¦æ§¹LOOP¡@¡@1¡@¡@¡@¡@1¡@¡@99
²Ä¤G¦¸°õ¦æ§¹LOOP¡@¡@2¡@¡@¡@¡@3¡@¡@98
²Ä¤T¦¸°õ¦æ§¹LOOP¡@¡@3¡@¡@¡@¡@6¡@¡@97
¡@¡@⁝¡@¡@¡@¡@¡@¡@ ¡@ ⁝¡@¡@¡@¡@⁝     ⁝
²Ä99¦¸°õ¦æ§¹LOOP¡@100 ¡@¡@1   EE2063h

¨Ò¤l¤G

²Ä¤G­Ó¨Ò¤l¤]¬O­pºâµ¥®t¼Æ¦Cªº©M¡A¦ý¬O¥¦¥i¥HÅý¨Ï¥ÎªÌ¦Û¥Ñ¿é¤J­º¶µ¡B¤½®t¥H¤Î¶µ¼Æ¡AµM«á¦A­pºâ¥Xµ¥®t¼Æ¦CªºÁ`©M¡C

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
INCLUDE E:\masm64\include64\masm64rt.inc
;******************************************************************************
.DATA
hInput  DQ      ?       ;¼Ð·Ç¿é¤J¸Ë¸m±±¨î¥N½X
hOutput DQ      ?       ;¼Ð·Ç¿é¥X¸Ë¸m±±¨î¥N½X
a1      DD      ?       ;­º¶µ
a2      DD      ?       ;²Ä¤G¶µ
a3      DD      ?       ;²Ä¤T¶µ
an      DD      ?       ;¥½¶µ
d       DD      ?       ;¤½®t
n       DD      ?       ;¶µ¼Æ
sum     DD      0       ;Á`©M
szFmt   DB      20h DUP (0)
szSum   DB      40 DUP (0)
szCtFmt DB      "%s+%s+%s+¡K¡K+%s=%%d",0
sStr1   DB      "­pºâµ¥®t¼Æ¦CªºÁ`©M¡C",0dh,0ah,"½Ð¿é¤J­º¶µ¡G"
sStr2   DB      "½Ð¿é¤J¤½®t¡G"
sStr3   DB      "½Ð¿é¤J¶µ¼Æ¡]¶µ¼Æ¥²¶·¬O¥¿¾ã¼Æ¡^¡G"
sErr0   DB      "µLªkÂà´«¦¨¾ã¼Æ¡I"
sErr1   DB      "¶µ¼Æ¤£¯à¤p©ó©Îµ¥©ó¹s¡C"
sErr2   DB      "µo¥Í·¸¦ì¡AAS2²×¤î°õ¦æ¡C"
szNeg   DB      "(%d)",0
szPos   DB      "%d",0
;******************************************************************************
.CODE
;------------------------------------------------------------------------------
Input   PROC    USES rsi rdi hIn:QWORD,hOut:QWORD,pHint:LPSTR,lenHint:DWORD
maximum EQU 2000000000  ;¤G¤Q»õ=77359400h
;¿é¤J¡GhIn¡BhOut¡Ð¼Ð·Ç¿é¤J¡B¿é¥X¸Ë¸m±±¨î¥N½X
;¡@¡@¡@pHint¡Ð´£¥Ü¦r¦ê¦ì§}
;¡@¡@¡@lenHint¡Ð´£¥Ü¦r¦êªø«×
;¿é¥X¡GCYªí¥Ü¿é¤J¿ù»~¡AEAX=0ªí¥Ü¨Ï¥ÎªÌ¿é¤Jªº¸ê®ÆµLªkÂà´«¦¨¾ã¼Æ
;¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@¡@EAX=1ªí¥Ü¨Ï¥ÎªÌ¿é¤Jªº¾ã¼Æ¤£¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡
;¡@¡@¡@NCªí¥Ü¿é¤J¥¿½T¡AEAX=¨Ï¥ÎªÌ¿é¤Jªº¼Æ­È
        LOCAL   num:DWORD,nWritn:DWORD,nRead:DWORD,buffer[16]:BYTE
    ;¦L¥XsHint¦r¦ê¡A¨Ã¥BÅý¨Ï¥ÎªÌ¿é¤J¼Æ¦r¦r¦ê
        invoke  WriteConsole,hOut,pHint,lenHint,ADDR nWritn,0
        invoke  ReadConsole,hIn,ADDR buffer,SIZEOF buffer,ADDR nRead,0
    ;§â¨Ï¥ÎªÌ¿é¤Jªº¼Æ¦r¦r¦êÂà´«¦¨¼Æ­È
        invoke  StrToIntEx,ADDR buffer,0,ADDR num
        or      eax,eax
        jz      error
    ;Àˬd¨Ï¥ÎªÌ¿é¤Jªº¼Æ­È¬O§_¦b­t¤G¤Q»õ¦Ü¤G¤Q»õ¤§¶¡
        mov     edi,maximum
        mov     eax,num
        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­º¶µ¡B¤½®t¤Î¶µ¼Æ¡A¨Ã­pºâ­º¶µ¡B²Ä¤G¶µ¡B²Ä¤T¶µ
        invoke  Input,hInput,hOutput,ADDR sStr1,SIZEOF sStr1
        jc      err0
        mov     a1,eax  ;a1¡×­º¶µ
        mov     a2,eax
        mov     a3,eax
        invoke  Input,hInput,hOutput,ADDR sStr2,SIZEOF sStr2
        jc      err0
        mov     d,eax   ;d¡×¤½®t
        add     a2,eax  ;a2¡×²Ä¤G¶µ
        mov     r10d,a2
        add     r10d,eax
        mov     a3,r10d ;a3¡×²Ä¤T¶µ
        invoke  Input,hInput,hOutput,ADDR sStr3,SIZEOF sStr3
        jc      err0
        cmp     eax,0   ;¶µ¼Æ¤£¯à¤p©ó©Îµ¥©ó¹s
        jle     err1
        mov     n,eax   ;n¡×¶µ¼Æ
        cdqe
    ;¶}©l­pºâ¥½¶µ¤Îµ¥®t¯Å¼Æ
        mov     r11d,a1 ;R11D¥Ñ­º¶µ¶}©l¡A¨C¦¸¼W¥[¤@­Ó¤½®t¡Aª½¦Ü¥½¶µ
        mov     sum,0
        mov     rcx,rax
again:  add     sum,r11d
        jo      err2
        add     r11d,d
        jo      err2
        loop    again
        sub     r11d,d
        mov     an,r11d ;an¡×¥½¶µ
    ;»s³yszFmt®æ¦¡±±¨î¦r¦ê
        mov     r8,OFFSET szPos
        test    a1,80000000h
        jz      chk_a2
        mov     r8,OFFSET szNeg
chk_a2: mov     r9,OFFSET szPos
        test    a2,80000000h
        jz      chk_a3
        mov     r9,OFFSET szNeg
chk_a3: mov     r10,OFFSET szPos
        test    a3,80000000h
        jz      chk_an
        mov     r10,OFFSET szNeg
chk_an: mov     r11,OFFSET szPos
        test    an,80000000h
        jz      crt_fm
        mov     r11,OFFSET szNeg
crt_fm: invoke  wsprintf,ADDR szFmt,ADDR szCtFmt,r8,r9,r10,r11
        invoke  wsprintf,ADDR szSum,ADDR szFmt,a1,a2,a3,an,sum
        lea     rdx,szSum
        jmp     pnt_it
err0:   lea     rdx,sErr0
        mov     eax,SIZEOF sErr0
        jmp     pnt_it
err1:   lea     rdx,sErr1
        mov     eax,SIZEOF sErr1
        jmp     pnt_it
err2:   lea     rdx,sErr2
        mov     eax,SIZEOF sErr2
    ;¦L¥XszAns¦r¦ê©Î¿ù»~°T®§
pnt_it: invoke  WriteConsole,hOutput,rdx,eax,0,0
        invoke  ExitProcess,0
main    ENDP
;------------------------------------------------------------------------------
END

±N¥¦¦s¦¨ AS2.ASM¡AµM«á¦b©R¥O´£¥Ü¦r¤¸¤¤¿é¤J©³¤U©R¥O¡A±N¨ä²ÕĶ¡B³sµ²¡G

path E:\masm64\bin64;%path%
set link=/subsystem:console /entry:main
ml64 as2.asm

»¡©ú

AS2.ASM ¤¤¦³´X³B¦a¤è­È±o»¡©ú¡C

­º¥ý¬O²Ä 83 ¦æªº CDQE «ü¥O¡C¦]¬°¶µ¼Æ¥²¬°¥¿¼Æ¡Aªp¥B¤p¤ì°¸¤]¤£¤Ó§Æ±æ¯à AS2 ³B²z¶µ¼Æ«Ü¦hªºµ¥®t¼Æ¦C¡A©Ò¥H Input °Æµ{¦¡¥uÅý¨Ï¥ÎªÌ¿é¤J 32 ¦ì¤¸ªº¥¿¾ã¼Æ¡C¦ý¬O LOOP °j°éªº­p¼Æ¼È¦s¾¹¬O RCX¡A¥²¶·¥Î³o­Ó«ü¥O¬O§â EAX ¤ºªº²Å¸¹¦ì¤¸©µ¦ù¨ì RAX ªº²Ä 32¡ã63 ¦ì¤¸¡A¤]´N¬O§â RAX ¥b°ª³¡ªº¨C­Ó¦ì¤¸³£¶ñ¤J EAX ªº²Å¸¹ºX¼Ð¡CµM«á¦b²Ä 87 ¦æ¡A±N¶µ¼Æ«ü©wµ¹ RCX §@¬° LOOP ªº­«½Æ¦¸¼Æ¡C

²Ä¤G¬O¦b°j°é¤§¤¤¡A¤]´N¬O²Ä 89¡B91 ¨â¦æ¡A¨Ï¥Î JO «ü¥O¡A³o¬O¦]¬°¦b­pºâ¨C¤@¶µ¡A©Î¬OÁ`©Mªº®É­Ô¡A³£¥i¯àµo¥Í·¸¦ì¡C¬°¤F¤£¨Ï¿ù»~ªºµ²ªGÅã¥Ü¦b¿Ã¹õ¤W¡A©Ò¥H·íµo¥Í·¸¦ì®É¡A¦b¿Ã¹õ¤W¦L¥Xªº¬Oµo¥Í·¸¦ìªº¿ù»~°T®§¡C

²Ä¤T¬O²Ä 95¡ã112 ¦æ¡A³o´X¦æ¬O¥Î¨ÓÀˬd­º¶µ¡B²Ä¤G¶µ¡B²Ä¤T¶µ¤Î¥½¶µ¬O¥¿¼ÆÁÙ¬O­t¼Æ¡A¦pªG¬O­t¼Æ´N­n¥[¤W¤@¹ï¡u(¡v¡B¡u)¡v¡A¦pªG¬O¥¿¼Æ´N¤£¥[¡C°²³]­º¶µ¬O 5¡A¤½®t¬O -3¡A¶µ¼Æ¬O 10¡A¦L¥X¨Óªº¬O

5+2+(-1)+¡K¡K+(-22)=-85

¦pªG¦L¥X¤U­±ªº¼Ë¤l¡A¸ûÃø¾\Ū

5+2+-1+¡K¡K+-22=-85