¹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
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Àˬdp¼Æ¼È¦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°²¦pn¨Ï°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①³]©wp¼Æ¼È¦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
LOOPZ »P LOOPE ¬O¬Û¦Pªº«ü¥O¡A¥¦¥ý±Np¼Æ¼È¦s¾¹´î¤@¡AµM«á¦AÀˬdp¼Æ¼È¦s¾¹¬O§_¤£µ¥©ó¹s¡A¥B¹sȺX¼Ð¬O§_¬°¤@¡F¥u¦³¦b¨âªÌ¦P®É¦¨¥ß®É¡A¤~·|¸õ¦^¼Ð°O¦ì§}³BÄ~Äò°j°é¡C
LOOPNZ »P LOOPNE ¬O¬Û¦Pªº«ü¥O¡A¥¦¥ý±Np¼Æ¼È¦s¾¹´î¤@¡AµM«á¦AÀˬdp¼Æ¼È¦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
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
©³¤Uªº¨Ò¤l¬Opºâ 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
²Ä¤GÓ¨Ò¤l¤]¬Opºâµ¥®t¼Æ¦Cªº©M¡A¦ý¬O¥¦¥i¥HÅý¨Ï¥ÎªÌ¦Û¥Ñ¿é¤Jº¶µ¡B¤½®t¥H¤Î¶µ¼Æ¡AµM«á¦Apºâ¥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ªº¾ã¼Æ¤£¦bt¤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§_¦bt¤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
;¶}©lpºâ¥½¶µ¤Îµ¥®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¦]¬°¦bpºâ¨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¥¿¼ÆÁÙ¬Ot¼Æ¡A¦pªG¬Ot¼Æ´Nn¥[¤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