¥ý¬Ý¤@¬qµ{¦¡¡G
.DATA array DD 20h DUP (3388h) ⁝ .CODE ⁝ mov r8,2 mov eax,array[r8*4] ⁝
¥Î UASM64.EXE ²ÕĶ¤Wzµ{¦¡·|µo¥Í¿ù»~¥¢±Ñ¡A¨Ãµ¹§A¤@¬q¿ù»~°T®§¡G
Error A2031: invalid addressing mode with current CPU setting
¤¤¤åªº·N«ä¬O¡u·í«eªº CPU ³]©w¤U¬°µL®Äªº©w§}¼Ò¦¡¡v¡C
¦ý¬O¦pªG§â¡umov eax,array[r8*4]¡v§ï¦¨¨ä¥L«ü¥O¡A¨Ò¦p¡uadd eax,array[r8*4]¡v¡B¡usub eax,array[r8*4]¡v¡K¡Kµ¥«o¯à²ÕĶ¦¨¥\¡C°²¦p§ï¥Î ML64.EXE¡A¨º»ò¤£ºÞ¬O¡umov eax,array[r8*4]¡v©Î¡uadd eax,array[r8*4]¡v¡B¡usub eax,array[r8*4]¡v¡K¡K¡A³£¯à²ÕĶ¦¨¥\¡C«D±`©_©Ç¡A²ö«D¹q¸£¤¤¨¸¤F¡H
·íµM¤£¬O¡A³oÀ³¸Ó¬O UASM64.EXE ªº¿ù»~¡A¤]´N¬O bug¡C¦b²Ä¤Q¤»³¹¡A¤¶²Ð¹LÅܳqªº¤èªk¡C¦ý³o¥u¬Oªv¼Ðªº¤èªk¡Aªv¥»ªº¤èªkÀ³¸Ónקï²ÕĶ¾¹¡C°²¦pn³o¼Ë°µ¡A´N±oÁpµ¸¨ì§@ªÌ¡A½Ð¥L¤U¦¸§ó·sª©¥»®É×¥¿¡C¦b³o´Á¶¡¦³¨S¦³¤èªk¥i¥HÀ±¸É³oÓ¿ù»~©O¡H¨Æ¹ê¤W¡AÁÙ¯uªº¦³¡A³oÓªþ¿ý¡A´N¬O°O¸ü¤p¤ì°¸×¥¿³oÓ¿ù»~ªº¹Lµ{¡C
nקï³oºØ UASM64.EXE µLªk²ÕĶªº¿ù»~¡A¥²¶·ÁA¸Ñ¨ÓÀs¥h¯ß¡C¥ý»¡¤°»ò¬O©w§}¡C·í CPU n¹ï¦b°O¾ÐÅ餺ªº¸ê®Æ¶i¦æ¹Bºâ¡B·h²¾©Î¨ä¥L°Ê§@®É¡A¥²¶·¦b´XÓ G ªº°O¾ÐÅ餤¡A«ü©wn³B²zªº¸ê®Æ¦ì©óþ¤@Ó¥|¦r²Õ¡BÂù¦r²Õ¡B¦r²Õ©Î¦ì¤¸²Õ¤º¡FÁ¿±o§ó¾Ç³N¤@¨Ç¡A´N¬O¦p¦ó«ü©wþ¤@Ó°O¾ÐÅé¡A¹³³o¼Ëªº¹Lµ{ºÙ¬°©w§}¡]addressing¡^¡C
©w§}¤è¦¡¦³¨âºØ¡G①ª½±µ©w§}¡B②¶¡±µ©w§}¡C¥Î UASM64.EXE ¯à¥¿½T²ÕĶª½±µ©w§}¡A¬G¤£¦b³oÓªþ¿ýªº°Q½×½d³ò¡C¶¡±µ©w§}¦³¤»ºØ¡A¦b²Ä¤G³¹¤Î²Ä¤Q¤»³¹Á`¦@¤¶²Ð¤F¥|ºØ¶¡±µ©w§}¤è¦¡¡A¦p¤U¡G
⑴¡B[ reg1 ] ⑵¡Barray [ reg1 ] ¡]»P [ reg1¡Ïarray ] ¦P¸q¡^ ⑶¡B[ reg2*s ] ⑷¡Barray [ reg2*s ] ¡]»P [ reg2*s¡Ïarray ] ¦P¸q¡^
¨Æ¹ê¤WÁÙ¦³¨âºØ¶¡±µ©w§}¡A¨ä¼Ë¤l¦p¤U¡G
⑸¡B[ reg1¡Ïreg2*s ] ⑹¡Barray [ reg1¡Ïreg2*s ]¡]»P [ reg1¡Ïreg2*s¡Ïarray ] ¦P¸q¡^
¤W±¤»ºØ¶¡±µ©w§}¤¤¡Aarray ¬O°}¦C¦WºÙ©ÎÅܼƦWºÙ¡Fs ºÙ¬°¿²v¡]scale¡^¡A¥u¯à¬O 1¡B2¡B4¡B8¡A¦¹¥|¼Æ³£¬O¤Gªº¾¦¸¤è¡Creg1¡Breg2 §¡¬° 64 ¦ì¤¸ªº³q¥Î¼È¦s¾¹¡A¨Ò¦p RAX¡BRBX¡K¡KR15¡A¤@¯ë§â¦³¼¥H¤G¾¤èªº reg2 ºÙ¬°¯Á¤Þ¼È¦s¾¹¡]index register¡^¡A¥t¤@Ó reg1 ºÙ¬°°ò©³¼È¦s¾¹¡]base register¡^¡C¯Á¤Þ¼È¦s¾¹¼¥H¤Gªº¾¤è©Ò±o¼¿n¡A§Y reg2*s¡AºÙ¬°¯Á¤Þ¿²v¡C
¦³®É¤]·|¦b¤Wz¹Bºâ¤¸¤§«e¡A¥[¤W BYTE PTR¡BWORD PTR¡BDWORD PTR ©Î QWORD PTR µ¥¸ê®ÆÃþ«¬¡A±j¨î«ü©w¸ê®ÆÃþ«¬¡C¤×¨ä¬O¹Bºâ¤¸¨S¦³¯S§Oªí©ú¸ê®Æªø«×®É¡A¨Ò¦p⑴¡B⑶¡B⑸¡C
·íµM¤W±¶È¶È»¡©ú©w§}¤è¦¡¡AÁÙ¥²¶··f°t¹Bºâ¡B·h²¾©Î¨ä¥L°Ê§@¡A¤~¬O¤@¹D§¹¾ãªº«ü¥O¡C¨Ò¦p
mov reg, [ reg1 ] mov reg, array [ reg1 ] mov [ reg2*s ], reg ⁝
¨ä¤¤ reg ¤]¬O³q¥Î¼È¦s¾¹¡A¦ý¤£¤@©w¬O 64 ¦ì¤¸ªº¼È¦s¾¹¡A¨Ì array ¸ê®ÆÃþ«¬¦Ó©w¡A¤]¥i¥H¬O 8¡B16¡B32 ¦ì¤¸ªº¼È¦s¾¹¡C¤U±ªº¨Ò¤l¡A¬O±q¤@ӥѦr²Õ²Õ¦¨¡A¦W¬° array ªº°}¦C¤¤¡A¨ú¥X²Ä¤GÓ¤¸¯À¤§È¡A¨Ã¦s©ó CX ¼È¦s¾¹¤º¡Aµ{¦¡¤ù¬q¬°
array DW 0,11h,22h,33h,44h,55h,66h
⁝
mov rax,2
mov cx, array[rax*2] ;*¥Nªí¼¸¹¡A¼¥H2¬O¦]¬°¨CÓ¦r²Õ¦û¥Î¤F2Ӧ줸²Õ
array °}¦C¦ì©ó°O¾ÐÅé¬YÓ¦ì§}¡A³oÓ¦ì§}¥H array ¥N´À¡C°²¦pµ{¦¡¸ü¤J°O¾ÐÅé«á¡A¨t²ÎÅý array ¦ì©ó°O¾ÐÅé¦ì§} 8500H ³B¡A¨º»ò array ªº²Ä¹sÓ¤¸¯À´N¦b¦ì§} 8500H¡A²Ä¤@Ó¤¸¯À¦b¦ì§} 8502H¡A²Ä¤GÓ¦ì§}¦b 8504H¡K¡K¡C¡umov cx, array[rax*2]¡v¤¤ªº RAX*2 µ¥©ó 4¡A¦Ó array ¥Nªíªº¦ì§}¬O 8500H¡A¦X°_¨Ó´N¬O¦ì§} 8504H¡A¤]´N¬O§â array ªº²Ä¤GÓ¤¸¯À¨ú¥X¨Ó¦s©ó CX ¤º¡A¬G CX ¤§È¬° 22H¡C¦pªG§â¡u[array[rax*2]¡v¼g¦¨¡u[array¡Ïrax*2]¡v¤]¬O¥i¥Hªº¡A¨ä¤¤ªº¤@¹ï¡u[ ]¡v¬O«ü°O¾ÐÅ骺¤º®e¡C
§è»·¤F¡A¨¥Âk¥¿¶Ç¡I¸g¤p¤ì°¸´ú¸Õ¡A¥u¦³²Ä⑷ºØ§Î¦¡ªº©w§}¤è¦¡°t¦X MOV «ü¥OÁöµM²Å¦X²Õ¦X»y¨¥ªº»yªk¡A¦ý«o³Q UASM64.EXE µø¬°¿ù»~¡C¦pªG²Ä⑷ºØ§Î¦¡»P¨ä¥L«ü¥O¡A¹³ ADD¡BSUB¡BXOR¡BMOVSZ µ¥°t¦X¡AUASM64.EXE ÁÙ¬O¯à¥¿½T²ÕĶªº¡C¤]´N¬O»¡¡A¥u¦³ MOV «ü¥Oªº²Ä⑷ºØ¶¡±µ©w§}¤è¦¡»Ýn×¥¿¡A¦A¦Ò¼{¨ìþÓ¬O¥Øªº¹Bºâ¤¸þÓ¬O¨Ó·½¹Bºâ¤¸¡A¦Ó¦³¤U±¤TÃþ«ü¥O»Ýn§ó¥¿¡G
1. MOV reg, array [ reg2*s ]
2. MOV array [ reg2*s ], reg
3. MOV array [ reg2*s ], imm
¤p¤ì°¸´£¥Xªº¸Ñ¨M¤è®×¬O¨Ï¥Î¥¨¶°¡C¤p¤ì°¸¥´ºâ¼¶¼g¤@Ó¡umova¡v¥¨¶°¡A¨ä¤¤ªº a ¥Nªí°}¦C¡]array¡^¡A¨ä·N¬°³oÓ mova ¥¨¶°¬O°w¹ï°}¦Cªº MOV «ü¥O¡Cmova ¥u¦³¨âӰѼơAargument1¡Bargument2¡A«eªÌ¬O¥Øªº¹Bºâ¤¸¡A«áªÌ¬O¨Ó·½¹Bºâ¤¸¡A»Pì¨Óªº MOV «ü¥O¤@¼Ë¡A¥u¦h¤FÓ a ¦Ó¤w¡C¤W±¤TºØ±¡§Î¥H mova ¥¨¶°§Î¦¡¤Þ¥Î¡A´NÅܦ¨©³¤Uªº¼Ë¤l¡F¤]¥i¥H»¡¡A´N¬O¥H¤U±¤T¦¡¥N´À¤W±¤T¦¡¡A´N¥i¥H×¥¿ UASM64.EXE ªº¿ù»~¡G
¥Ò¡Gmova reg1, DATA_TYPE array [ reg2*s ]
¤A¡Gmova DATA_TYPE array [ reg2*s ], reg1
¤þ¡Gmova DATA_TYPE array [ reg2*s ], imm
¤Wz¤T¦¡¤¤¡ADATA_TYPE ¬O«ü BYTE PTR¡BWORD PTR¡BDWORD PTR ©Î QWORD PTR µ¥¸ê®ÆÃþ«¬¡A³o¬°¤F»P MOV «ü¥O¦³Ãþ¦ü¥\¯à¡C°²¦p¬O¥Ò¡B¤A¨âºØ±¡§Î¡ADATA_TYPE ¥i¥H¬Ù²¤¡A¦]¬°¥i¥H¥Ñ reg1 §PÂ_¸ê®ÆÃþ«¬¡A¦pªG¥[¤W¤F DATA_TYPE¡A´N¥²¶·¨âªÌ¤@P¡A§_«h·|Åã¥Ü¿ù»~°T®§¡C¦Ü©ó¤þªº±¡§Î¡A¤£¥[ DATA_TYPE ®É¡A¥i¥H¥Ñ°}¦C¦WºÙ§PÂ_¡A¦pªG¥[¤J«h±j¨î¥H DATA_TYPE ©Ò«ü©wªº¸ê®ÆÃþ«¬¬°·Ç¡C¦¹¥~¡Areg1 ¥i¯à¬O 8¡B16¡B32¡B64 ¦ì¤¸ªº¼È¦s¾¹¡A¦ý¬O reg2 ¬O¯Á¤Þ¼È¦s¾¹¡A²o¯A¨ì¦ì§}¥u¯à¬O 64 ¦ì¤¸ªº³q¥Î¼È¦s¾¹¡C
mova ªº¥Îªk¦p¤U¡A°²³]n§â f_sequence °}¦C¤¤ªº²Ä¤GÓ¤¸¯À³]¬° 1¡G
;©³¤U¬O mova ªº©w¸q mova MACRO argument1,argument2 ⁝ ENDM ⁝ .DATA f_sequence DD (?) ⁝ .CODE ⁝ mov rax,2 mova f_sequence[rax*4],1 ;¦]¬°f_sequence¤¤¨CÓ¤¸¯À¦û4Ӧ줸²Õ¡A©Ò¥H¼¥H4
³Ì«á¤@¦æ¡A¤Þ¥Î mova ®É¡Aargument1 ·|µ¥©ó¡uf_sequence[rax*4]¡v¦r¦ê¡Aargument2 ·|µ¥©ó¡u1¡v¦r¦ê¡A¸g mova ¤ÀªR²£¥Í¾A·íªº¾÷±ñ½X¡A¨Ï CPU ¯à°õ¦æ¡C
mova ¥¨¶°ªºì²z¨ä¹ê«Ü²³æ¡A¥¦·|¤ÀªR argument1¡Bargument2¡AµM«á±N¨äÂà´«¦¨¾÷±ñ½X¡A¶ñ¤Jµ{¦¡¤¤¡A´N¸ò²ÕĶ¾¹°µªº¨Æ¤@¼Ë¡C»¡¨ì¾÷±ñ½X¡A¥ý¬Ý¤U±ªº¹Ï¡G ¤W¹Ï¬O 64 ¦ì¤¸¼Ò¦¡¤U¡A¤@¹D«ü¥Oªº¾÷±ñ½X¡A¤À¤C³¡¤À¡GLegacy Prefixes¡BREX prefix¡BOpCode¡BModR/M¡BSIB¡BDisplacement¡BImmediate¡C³o¤C³¡¤À¡A¥u¦³ OpCode ¤@©w·|¥X²{¡A¨ä¾l³¡¤À¨Ì»Ýn¨M©w¡A¦pªG¤£»Ýn´N¤£·|¥X²{¦Ó¸õ¹L¡C¨Ò¦p¡uSUB RSP,28H¡v¾÷±ñ½X¬O¡u48 83 EC 28¡v¡A¨Ì§Ç¬O REX prefix¡BOpCode¡BModR/M¡BImmediate¡A¦Ó¨S¦³ Legacy Prefixes¡BSIB¡BDisplacement ¦]¦¹´N¸õ¹L¥¦Ì¡C
x64 CPU ªº«ü¥O«Ü¦h¡A¦Ó¥»ªþ¿ý«ÂI¬O¡A»s§@¥¨¶°§ó¥¿ UASM64.EXE µLªk²ÕĶ¦Ó»Ýnק諸¤TÃþ«ü¥O¡A³o¤TÃþ«ü¥O¦p¤U¡G
¥Ò¡Gmova reg1, DATA_TYPE array [ reg2*s ]
¤A¡Gmova DATA_TYPE array [ reg2*s ], reg1
¤þ¡Gmova DATA_TYPE array [ reg2*s ], imm
¤£©¯ªº¬O¡A³o¤TÃþ«ü¥O¥i¯à³£·|¥X²{¤Wz¾÷±ñ½X¤C³¡¤À¡Cmova ¥²¶·¤ÀªR¿é¤Jªº¨âÓ¹Bºâ¤¸¡A¨Ì¾Ú¾÷±ñ½Xªº³W«h¡A²£¥Í³o¤C³¡¤À¾÷±ñ½X¡C²{¦b²²¤»¡©ú³o¤C³¡¤À·N¸q¡G
①¡BLegacy Prefixes¡GºÙ¬°¶Ç²Î«e¸m½X¡A¶Ç²Î«e¸m½X¦³³\¦hºØ¡C¦ý mova ¥u·|¥Î¨ì¹Bºâ¤¸«e¸m½X¡A66H¡A¦bµy«á¤@¨Ö»¡©ú¡C
②¡BREX Prefix¡GºÙ¬° REX «e¸m½X¡C²Ä 4¡ã7 ¦ì¤¸¤@©w¬O 0¡B0¡B1¡B0¡A¦X°_¨Ó´N¬O 4¡C²Ä 0¡ã2 ¦ì¤¸¥Îªí¥Ü·s¼Wªº¼È¦s¾¹¡C32 ¦ì¤¸ªº x86 CPU¡A¨ä³q¥Î¼È¦s¾¹¥u¦³¤KÓ¡A¨ì¤F x64 ®É¥NÅܦ¨ 16 Ó¡A´N¥Î REX Prefix ªº B¡BX¡BR ¨Óªí¥Ü·s¼Wªº¼È¦s¾¹¡C
③¡BOpCode¡GºÙ¬°¾Þ§@½X©Î¹Bºâ½X¡A¥¦¨M©w¤F CPU n°õ¦æªº«ü¥O¡C¥»ªþ¿ýn§ó¥¿ªº«ü¥O¬O MOV¡A¦³Ãöªº¾Þ§@½X¦³ 8AH¡B8BH¡B88H¡B89H¡BC6H¡BC7H¡A¾ã²z¦p¤Uªí¡G
bits | W | legacy prefixes |
¥Ò MOV reg1, array[ reg2*s ] | ¤A MOV array[ reg2*s ], reg1 | ¤þ MOV array[ reg2*s ], imm |
8 | 0 | 8A | 88 | C6 | |
16 | 0 | 66 | 8B | 89 | C7 |
32 | 0 | 8B | 89 | C7 | |
64 | 1 | 8B | 89 | C7 |
Æ[¹î¤Wªí¡AÀ³¥iª¾¨s³º¬On¥Îþ¤@Ó¾Þ§@½X¡A¥²¶·ª¾¹D¹Bºâ¤¸ªø«×¡C³o¤TºØ MOV «ü¥O¥u¦³¹Bºâ¤¸¬O¦ì¤¸²Õ®É¡A¾Þ§@½X»P¨ä¥L¤TªÌ¤£¦P¡A¦Ó¥B³£¬O°¸¼Æ¡]¯à³Q¤G¾ã°£¡^¡F¦Ó¨ä¾lªº¾Þ§@½X¬O«eªÌ¦h¤@¡C¦pªG¬O¥Ò¡B¤A±¡§Î¡An§PÂ_¹Bºâ¤¸ªø«×¡A¥i¥H±q reg1 µÛ¤â¡F¦pªG¬O¤þ¡A´N¥²¶·¥Ñ array[reg2*s] ªº array µÛ¤â¡C
⑤¡BSIB¡GSIB ¤¤ªº Scale »P Index »P¹Bºâ¤¸¤¤ªº¯Á¤Þ¿²v¦³Ãö¡A¨ä¤¤ªº¿²v¨M©w¤F Scale¡A¯Á¤Þ¼È¦s¾¹¨M©w¤F Index »P REX prefix ªº X ¦ì¤¸¡C¦b mova ¥¨¶°¤¤¤£»Ýn°ò©³¼È¦s¾¹¡A¦Ó¯Á¤Þ¼È¦s¾¹»P°¾²¾¦ì§}¡A¬d¾\ DOS ²Õ¦X»y¨¥²Ä¤G¤Q¥|³¹ 64-Bit Mod »P Base ªºÃö«Y¡A±oª¾ mova ¥¨¶°¤¤¡ABase ¥²©w¬O 101¡C
Scale | 00 | 01 | 10 | 11 |
¿²v | 1 | 2 | 4 | 8 |
¦b x64 CPU ¤º¡A¦³ 16 Ó 64 ¦ì¤¸ªº³q¥Î¼È¦s¾¹¡A¨CÓ³q¥Î¼È¦s¾¹ªº²Ä 0¡ã31 ¦ì¤¸¥i©î¦¨ 32 ¦ì¤¸ªº¼È¦s¾¹¡F¦Ó²Ä 0¡ã15 ¦ì¤¸¤S¥i©î¦¨ 16 ¦ì¤¸¼È¦s¾¹¡A²Ä 0¡ã7 ¦ì¤¸¤S¥i©î¦¨¤K¦ì¤¸ªº¼È¦s¾¹¡F¯S§Oªº¬OÁÙ¦³¥|Ó¤K¦ì¤¸ªº¼È¦s¾¹¬O¦ì©ó²Ä 8¡ã15 ¦ì¤¸¡A³o¥|ӼȦs¾¹¬O AH¡BCH¡BDH¡BBH¡C³o¼Ëºâ°_¨Ó¡A¦@¦³ 68 ºØ¼È¦s¾¹¡C
68 ӼȦs¾¹¤Ó¦h¤Ó½ÆÂø¡A©Ò¥H±q x64 ªº¦Ñ¯ª©v¡A8086/8088 CPU ¶}©l»¡°_¡C8086/8088 ¬O 16 ¦ì¤¸ªº CPU¡A¥u¦³¤KÓ 16 ¦ì¤¸ªº³q¥Î¼È¦s¾¹¡GAX¡BCX¡BDX¡BBX¡BSP¡BBP¡BSI¡BDI¡F«e¥|ªÌ¡A¨CÓ³£¥i¥H¦A©î¦¨¨âÓ 8 ¦ì¤¸ªº¼È¦s¾¹¡A©Ò¥H¤S¦³¤KÓ¤K¦ì¤¸ªº¼È¦s¾¹¡FSP¡BBP¡BSI¡BDI ¤£¯à©î¶}¡C¦pªGnªí¥Ü 16 ¦ì¤¸ªº¼È¦s¾¹¡A¶È»Ý¤TӦ줸§Y¥i¡G
¤G¶i¦ì¼Æ | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
8 ¦ì¤¸ | AL | CL | DL | BL | AH | CH | DH | BH |
16 ¦ì¤¸ | AX | CX | DX | BX | SP | BP | SI | DI |
¨ì¤F IA¡Ð32 ªº®É¥N¡A¹³ 80386/80486 µ¥ CPU¡A±N³o¤KӼȦs¾¹ÂX¥R¦¨ 32 ¦ì¤¸¡A©Ò¥H¤WªíÅܦ¨¡G
¤G¶i¦ì¼Æ | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
8 ¦ì¤¸ | AL | CL | DL | BL | AH | CH | DH | BH |
16 ¦ì¤¸ | AX | CX | DX | BX | SP | BP | SI | DI |
32 ¦ì¤¸ | EAX | ECX | EDX | EBX | ESP | EBP | ESI | EDI |
¨ì¤F x64 ®É¥N¡A¤£¶È¼È¦s¾¹Åܦ¨ 64 ¦ì¤¸¡A¦P®É¼È¦s¾¹¤]¥Ñ¤KÓÅܦ¨¤Q¤»Ó¡C¦h¥X¨Óªº 64 ¦ì¤¸¼È¦s¾¹ºÙ¬° R8¡ãR15¡A¥²¶·¦h¥Î¤@Ӧ줸¨Óªí¥Ü¡C¦]¦¹·s¼W REX Prefix ¨Óªí¥Ü·s¼Wªº¼È¦s¾¹¡C¦pªG¦¹¼È¦s¾¹¦b¥Øªº¹Bºâ¤¸©Î¨Ó·½¹Bºâ¤¸¡A¥Î REX Prefix ¤¤ªº R ¦ì¤¸ªí¥Ü¡F¦pªG¼È¦s¾¹¬O¦b¶¡±µ©w§}¤¤¡A¾á¥ô¯Á¤Þ¼È¦s¾¹¡A¨º»ò¥Î REX Prefix ¤¤ªº X ¦ì¤¸ªí¥Ü¡F¦pªG¬O°ò©³¼È¦s¾¹¡A¨º»ò¥Î REX Prefix ¤¤ªº B ¦ì¤¸ªí¥Ü¡C¨£¤Uªí¡G
REX. R/X/B | ¼È¦s¾¹ ªø«× | Reg¡BIndex ©Î Base Äæ¦ì | |||||||
000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | ||
0 | ¤K¦ì¤¸ | AL | CL | DL | BL | AH/SPL | CH/BPL | DH/SIL | BH/DIL |
¤Q¤»¦ì¤¸ | AX | CX | DX | BX | SP | BP | SI | DI | |
¤T¤Q¤G¦ì¤¸ | EAX | ECX | EDX | EBX | ESP | EBP | ESI | EDI | |
¤»¤Q¥|¦ì¤¸ | RAX | RCX | RDX | RBX | RSP | RBP | RSI | RDI | |
1 | ¤K¦ì¤¸ | R8B | R9B | R10B | R11B | R12B | R13B | R14B | R15B |
¤Q¤»¦ì¤¸ | R8W | R9W | R10W | R11W | R12W | R13W | R14W | R15W | |
¤T¤Q¤G¦ì¤¸ | R8D | R9D | R10D | R11D | R12D | R13D | R14D | R15D | |
¤»¤Q¥|¦ì¤¸ | R8 | R9 | R10 | R11 | R12 | R13 | R14 | R15 |
¦b¤Wªí¤¤¡A¦³¥|¹ï¤K¦ì¤¸ªº¼È¦s¾¹¡A¨â¨â¨ã¦³¬Û¦Pªº½s½X¡A¨º´N¬O AH/SPL¡BCH/BPL¡BDH/SIL¡BBH/DIL¡A¨ºn«ç»ò°Ï§O©O¡H¤Wªí¤¤¥Hµµ¦âªí¥Üªº¼È¦s¾¹¬O IA¡Ð32 ®É¥N´N¤w¸g¦³ªº¼È¦s¾¹¡A¤£»Ýn¥[¤W REX Prefix ´N¯àªí¥Ü¡A©Ò¥H¨Ã¨S¦³ REX.R ¦ì¤¸¬°¹s©Î¤@ªº°ÝÃD¡C¤]´N¬O»¡¨S¦³ REX Prefix ´Nªí¥Ü AH¡A¦³ REX Prefix ¦ý¬Û¹ïÀ³ªº¦ì¤¸¬°¹s¥Nªí SPL¡A¨ä¾l¤T¹ï¤]¬O¦p¦¹¡C
±q¤W±ªº»¡©ú¡A©Î³\¥i¥H¸Õ¸Õ´XÓ¨Ò¤l¡A§â²Õ¦X»y¨¥¡u½Ķ¡v©Î¡u¤H¤u²ÕĶ¡v¦¨¾÷±ñ½X¡C
²ÕĶ¹Lµ{¦p¤U¡G
²ÕĶ¹Lµ{¦p¤U¡G
¦pªG§â SPL §ï¦¨ AH¡AÅܦ¨ MOV BYTE PTR array[r10*2+ 28h],ah¡A¨º»ò´N·|µo¥Í¿ù»~¦ÓµLªk²ÕĶ¡C³o¬O¦]¬° AH »P SPL ¬O¥H¦³¨S¦³ REX Prefix ¨Ó°Ï§Oªº¡AAH ¥²¶·¨S¦³ REX Prefix¡A¦ý¬O¦]¬° R10 ¤@©w·|n¨Ï¥Î REX Prefix¡A©Ò¥H´NµLªk²ÕĶ¡C¦pªG¤@©wn¨Ï¥Î AH¡A¨º»ò´N±o§â R10 ´«¦¨ RAX¡ãRDI ¤¤ªº¨ä¤¤¤@Ó¡C
²ÕĶ¹Lµ{¦p¤U¡G
»¡§¹¤F mova ªºì²z¤§«á¡AÁÙ¶·¹ê§@ÅçÃÒ¤~¬O¤ý¹D¡Cmova ¥¨¶°«Üªø¡A¥]§t mova ¤Þ¥Îªº¥¨¶°¡A±µªñ¤¦Ê¦æ¡A©Ò¥H¤£¦C¥Xµ{¦¡½X¡A½Ð¨ì³o¨à¤U¸ü¡A¨ä¬[ºc¤jP¹³¥k¹Ï¡C«e±´£¹L¡Amova ¥¨¶°¶È¶È¨ú¥N¥H¤U¤TºØ MOV «ü¥O¡G
¥Ò¡Gmova reg1, DATA_TYPE array[ reg2*s ] ¤A¡Gmova DATA_TYPE array[ reg2*s ], reg1 ¤þ¡Gmova DATA_TYPE array[ reg2*s ], imm
DATA_TYPE ¥i¥H¬O BYTE PTR¡BWORD PTR¡BDWORD PTR¡BQWORD PTR¡A¥¦Ì¤¤¶¡ªºªÅ¥Õ¥i¥H¬O¤@Ó¡B¨âÓ¡K¡K¡Areg2¡B*¡Bs¡B[¡B] ¤§¶¡ªºªÅ¥Õ¤]¬O¤@¼Ë¡C³o¨Ç¤£¦PӼƪºªÅ¥Õ³£·|¼W¥[³]p mova ¥¨¶°ªº§xÃø¡A¬G±N¨ä§R°£¡C³o¬q§R°£ªÅ¥Õªºµ{¦¡¬O¤@ÓºÙ¬° remove_space ªº¥¨¶°©Òt³d¡A¦b¤Uªí¥k°¼¡F¥ª°¼«h¬O mova ¶}©lªº«e´X¦æ¡A¤À§O§â argument1 ·í°µ¤Þ¼Æ¡u©I¥s¡vremove_space ¥¨¶°¡Aremove_space °£¥hªÅ¥Õ¤§«á¡A±N¨ä¶Ç¦^¦Ü mova¡A¦s¤J arg1 ¦r¦êÅܼƤ¤¡C²Ä¤GӤ޼ơAargument2¡A¤]¦pªk¬¶»s¡A¨Ã¦s¤J arg2 ùØ¡C
mova MACRO argument1,argument2 ;±N¨âӰѼƤºªºªÅ¥Õ°£¥h¡AÅܬ°arg1¡Barg2 remove_space argument1,arg1 remove_space argument2,arg2 ⁝ ENDM |
remove_space MACRO input,output
;§R°£input¦r¦ê¤¤ªº©Ò¦³ªÅ¥Õ¡AÅܦ¨output¦r¦ê
temp TEXTEQU <>
FORC char,<input>
IFDIF <char>,< >
temp CATSTR temp,<char>
ENDIF
ENDM
output TEXTEQU temp
ENDM |
remove_space §R°£ªÅ¥Õªºì²z«Ü²³æ¡A¥ý³]©w¤@ӪŦr¦ê¡Atemp¡CµM«á¨Ï¥Î FORC/ENDM «½Æ°Ï¶ô¡A¨C¦¸¥Ñ input ¦r¦ê¤¤¨ú¥X¤@¦r¤¸¡A³]¬° char¡C¦pªG char ¤£¬OªÅ¥Õ´N±µ¦b temp ¤§«á¡A¦pªG¬OªÅ¥Õ´N¤£°µ¥ô¦ó¨Æ¦^¨ì FORC/ENDM ¶}©l³B«½Æ¤U¤@´`Àô¡Aª½¦Ü©Ò¦³ input ¤ºªº¦r¤¸³£³B²z§¹²¦¡C³o¼Ë temp ´N¬O input §R°£ªÅ¥Õ«áªºµ²ªG¡C
§R°£ªÅ¥Õ¤§«á¡A±µ¤U¨Ó´N¬O§PÂ_¬Oþ¤@ºØ±¡§Î¡A¥Ò¡B¤AÁÙ¬O¤þ¡A°Ñ¦Ò¤W¹Ï¡C°²¦p arg1 ¬O¼È¦s¾¹¡]¥i¯à¬O 64¡B32¡B16 ©Î 8 ¦ì¤¸ªº¼È¦s¾¹¡^¡A¨º´N¬O¥Ò±¡§Î¡F¦pªG arg2 ¬O¥ß§YÈ´N¬O¤þ±¡§Î¡A³Ñ¤Uªº´N¬O¤A±¡§Î¡Cn§PÂ_¹Bºâ¤¸¬O¤£¬O¼È¦s¾¹¡A¦³¨âºØ¤èªk¡G¤@¬O¨Ï¥Î OPATTR ¹Bºâ¤l¡A¤G¬O³v¤@Àˬd¬O§_¬°¨º 68 ºØ¼È¦s¾¹ªº¨ä¤¤¤@ºØ¡C«eªÌÁöµM²«K¦ýµ²ªG¤]«Ü²³æ¡AµLªk§PÂ_¬O¨º¤@ӼȦs¾¹¡C¦]¦¹¤p¤ì°¸±Ä¥Î«á¤@ºØ¤èªk¡A³v¤@Àˬd¡A¦ý¬O¯àÀò±o¨ì©³¬OþӼȦs¾¹¡C
¤p¤ì°¸§âÀˬd¹Bºâ¤¸¬O¤£¬O¼È¦s¾¹ªºµ{¦¡¿W¥ß¦¨¤@¥¨¶°¡AºÙ¬° get_reg¡A¨äµ{¦¡½X¦b¤U±¥k°¼¡C¥ª°¼Åã¥Ü mova ¦p¦ó¤Þ¥Î get_reg ¥¨¶°¡A¤Þ¥Î®É¶·§â arg1 »P reg64 ·í¦¨¤Þ¼Æ¶Çµ¹ get_reg¡Carg1 ¥i¯à¬O¼È¦s¾¹¡A¤]¥i¯à¬O¹³¡uDATA_TYPE array [ reg2*s ]¡v¼Ë¤lªº¶¡±µ©w§}¡Creg64 ¬O©Ò¦³ 64 ¦ì¤¸¼È¦s¾¹¦WºÙªº¦Cªí¡A¨£¥k°¼ªº²Ä¤@¡B¤G¦æ¡C
;Àˬdarg1¬O§_¬°¼È¦s¾¹¡A¥ý64¦ì¤¸¡A ;¦A¨Ó¬O32¡B16¦ì¤¸¡A³Ì«á¬O8¦ì¤¸ get_reg arg1,%reg64 IF reg LT 8 ;㈰¦¡ rex_prefix=48h ;RAX¡ãRDI d_type TEXTEQU <Q> ELSEIF reg LT 16 rex_prefix=4ch ;R8¡ãR15 reg=reg-8 d_type TEXTEQU <Q> ELSE get_reg arg1,%reg32 IF reg LT 8 ;EAX¡ãEDI d_type TEXTEQU <D> ELSEIF reg LT 16 rex_prefix=44h ;R8D¡ãR9D d_type TEXTEQU <D> reg=reg-8 |
reg64 TEXTEQU <rax,rcx,rdx,rbx,rsp,rbp,rsi,rdi,r8,\ r9,r10,r11,r12,r13,r14,r15> reg32 TEXTEQU <eax,ecx,edx,ebx,esp,ebp,esi,edi,r8d, r9d,r10d,r11d,r12d,r13d,r14d,r15d> ⁝ get_reg MACRO reg_name,reg_lst ;¦breg_lst¦Cªí¤¤¡A§ä¨ìreg_name©Ò«ü©wªº¼È¦s¾¹¡A°O¿ý¦b ;regùØ¡Creg¥Nªíreg_lst¦Cªí¤¤ªº²Ä´XÓ¤¸¯À¡A¥Ñ0¶}©l reg=0 FOR element,<reg_lst> IFDIFI reg_name,<element> reg=reg+1 ELSE EXITM ENDIF ENDM ENDM |
¥ý¬Ý¥k°¼ get_reg ¥¨¶°¡Cº¥ý³]©w¤@ÓÅܼơAreg¡A¥O¨ä¬°¹s¡AµM«á§Q¥Î FOR/ENDM ³v¤@¥Ñ reg64 ¤¤¨ú¥X¤@ӼȦs¾¹¦WºÙ»P arg1 ¤ñ¹ï¡C¨C¨ú¥X¤@Ó´N¨Ï reg ¼W¥[¤@¡Aª½¨ì¨ú¥Xªº¼È¦s¾¹¦WºÙ»P arg1 ¬Û¦P¤~¸õ¥X FOR/ENDM «½Æ°Ï¶ô¡A©ÎªÌ±N reg64 ¤ºªº 16 ӼȦs¾¹³£¤ñ¹ï§¹²¦ÁÙ¨S¦³²Å¦X®É¡A¤]·|Â÷¶} FOR/ENDM «½Æ°Ï¶ô¡C
ª`·N¨ì reg64 ªº¼È¦s¾¹ªº±Æ¦C¤è¦¡¨Ã¤£¬OÀH·N±Æ¦C¡A¦Ó¬O¨Ì·Ó«eªí©Ò±Ôz ModR/M ¤¤ Reg ©Ò¥Nªíªº¼ÆȤ覡±Æ¦C¡C¦pªG§ä¨ì¤F¬Û²Å¦Xªº¼È¦s¾¹¡A¨º»ò reg ¤§È©Î Reg ´î 8¡A´N·|µ¥©ó§ä¨ìªº¼È¦s¾¹©Ò¥Nªíªº Reg ¤§È¡C¸Ô²Óªº»¡¡A·í get_reg °h¥X¨Ó«á°õ¦æ¨ì¥ª°¼㈰¦¡¤§®É¡Areg ¦³¤TºØ±¡§Î¡G①reg ¤p©ó 8¡A¨º»ò arg1 ¬O RAX¡ãRDI ¤§¤¤ªº¨ä¤¤¤@ӼȦs¾¹¡Areg ´N«ê¦n¬O ModR/M ¤¤ªº Reg Äæ¦ì¡C②reg ¦b 8¡ã15 ¤§¶¡¡A¨º»ò arg1 ¬O R8¡ãR15 ¨ä¤¤¤§¤@¡Areg ¶·´î¥h 8 ¤~¬O ModR/M ¤¤ªº Reg Äæ¦ì¡A¦P®É¶¶«K§â REX Prefix ªº R ¦ì¤¸³]¬°¤@¡C③reg µ¥©ó 16¡Aªí¥Ü arg1 ¤£¬O 64 ¦ì¤¸ªº¼È¦s¾¹¡C²Ä①¡B②±¡§Î¨Ó»¡³£¬O 64 ¦ì¤¸¡A©Ò¥H REX Prefix ªº W ¦ì¤¸³]¬°¤@¡Ad_type ³]¬°<Q>¦r¦ê¡C
¦pªG¬O③±¡§Î´Nªí¥Ü arg1 ¤£¬O 64 ¦ì¤¸¼È¦s¾¹¡A¨º»ò¦³¥i¯à¬O 32 ¦ì¤¸ªº¼È¦s¾¹¡A¦Ó mova n°µªº´N§â²Ä¤GӤ޼Ƨ令 reg32¡A±µ¤U¨Ó´N¬O«½Æªº¹Lµ{¡C¤@ª½¨ì©Ò¦³¤Q¤»¦ì¤¸¡B¤K¦ì¤¸ªº¼È¦s¾¹³£Àˬd§¹²¦¡A¤K¦ì¤¸ªº¼È¦s¾¹¦³ 20 Ó¡A©Ò¥H reg ¤j©ó©Îµ¥©ó 20¡A¤~ªí¥Ü arg1 ¤£¬O¼È¦s¾¹¡C
Àˬd§¹ 68 ӼȦs¾¹¡Amova ¤À¦¨¨âÓ¤À¤ä¡G①°²¦p arg1 ¬O¼È¦s¾¹¡A¨º»ò´N¬O¥Òªº±¡§Î¡F②¦pªG arg1 ¤£¬O¼È¦s¾¹¡A¨º»òÁÙn¶i¤@¨BÀˬd¬O¤AÁÙ¬O¤þ¡A³Ì²«Kªº¤èªk¬OÀˬd arg2 ¬O§_¬°¼ÆÈ¡Carg2 ¬O§_¬°¼ÆȤ]«Ü®e©ö§PÂ_¡A¶È»Ý¤@¦æ§Y¥i¡A¨£¤U±µ{¦¡¡C¦pªG arg2 ¬O¼ÆÈ¡A¨º»ò¥¦°_©lªº²Ä¤@Ó¦r¤¸¥²©w¬Oªü©Ô§B¼Æ¦r¡A©Ò¥H¥u»Ý¤Þ¥Î get_reg Àˬd¨ä²Ä¤@Ó¦r¤¸¬O§_¦b 0¡ã1 ¤§¶¡¡C¦pªG¶Ç¦^ªº reg ¤j©ó©Îµ¥©ó 10¡A¨º»ò arg2 ´N¤£¬O¼ÆÈ¡A³o¬O¤Aªº±¡§Î¡A§_«h´N¬O¤þªº±¡§Î¡C¨ì³oùØ¡A¤w¯à½T©w¬O¥Ò¡B¤A¡B¤þþ¤@ºØ±¡§Î¡C
get_reg <@SubStr(%arg2,1,1)>,<0,1,2,3,4,5,6,7,8,9>
¤W±´¿¦C¥X get_reg ¥¨¶°ªºµ{¦¡½X¡A¦³¨âӤ޼ơGreg_name¡Breg_lst¡CÁöµM¦WºÙ¤W¬O¼g¦¨ reg¡A¬Ý°_¨Ó¦n¹³¬OÀˬd¦W¬° reg_name ªº¼È¦s¾¹¬O§_¬° reg_lst ¼È¦s¾¹¦Cªí¤ºªº¤@û¡F¦ý¹ê»Ú¤W¡A¤]¥i¥H§â reg_name ´«¦¨¥ô¦ó¦r¤¸¡AÀˬd¸Ó¦r¤¸¬O§_¦b reg_lst ¤º¡C
²{¦b mova ¤w¸g¯à°÷±q¿é¤Jªº¤Þ¼Æ§PÂ_¬OÄÝ©ó¥Ò¡B¤A¡B¤þþ¤@ºØ±¡§Î¡A±µ¤U¨Ó´N±o¤À¶}³B²z¡C¥ý»¡¦p¦ó³B²z¥Òªº±¡§Î¡AµM«á¦A»¡³B²z¤A±¡§Î¡A³Ì«á¬O¤þ¡C
¦b³B²z¥Òªº±¡§Î®É¡A²Ä¤GÓ¹Bºâ¤¸¬O§Q¥Î¯Á¤Þ¼È¦s¾¹¶¡±µ©w§}¡A¹³¡uDATA_TYPE array [ reg2*s ]¡vªº§Î¦¡¡A¦ý¤p¤ì°¸·QÅý mova ¥\¯à§ó±j¤@¨Ç¡AÅý¡uDATA_TYPE array [ reg2*s ¡Ï x ]¡v¤]¯à²ÕĶ¡Carray¡Breg2¡Bs¡Bx ¨Ì§Ç¬O°}¦C¦WºÙ¡B¯Á¤Þ¼È¦s¾¹¡B¿²v»P°¾²¾¦ì§}¡CDATA_TYPE ¥»¨Ó¬O¡uBYTE PTR¡v¡B¡uWORD PTR¡v¡B¡uDWORD PTR¡v¡B¡uQWORD PTR¡v¡A¦ý¤w¸g³Q remove_space ³B²z¹L¡A©Ò¥HÅܦ¨¡uBYTEPTR¡v¡B¡uWORDPTR¡v¡B¡uDWORDPTR¡v¡B¡uQWORDPTR¡v¡C§Y¨Ï¦p¦¹¡A§Q¥Î¯Á¤Þ¼È¦s¾¹¶¡±µ©w§}¡A¤´µM¦h¹F 22 ºØ±Æ¦C±¡§Î¡A¥i¤À¬°¤U±¤l¡ã¥f¥|ºØ±¡§Î¡G
¤l¡GDATA_TYPE array[reg2*s] ;reg2¡Bs ¥i¥H¤¬´«¡A·N§Y array[s*reg2]¤]¥i¥H¡A³o¼Ë¦³¨âºØ±Æ¦C¤è¦¡ ¤¡¡GDATA_TYPE [array¡Ïreg2*s] ;array »P reg2*s ¥i¥H¤¬´«¡Areg2 »P s ¤]¥i¥H¤¬´«¡A³o¼Ë´N¦³ 4 ºØ±Æ¦C¤è¦¡ ±G¡GDATA_TYPE array[reg2*s¡Ïx] ;reg2*s »P x ¥i¥H¤¬´«¡Areg2 »P s ¤]¥i¥H¤¬´«¡A³o¼Ë´N¦³ 4 ºØ±Æ¦C¤è¦¡ ¥f¡GDATA_TYPE [array¡Ïreg2*s¡Ïx] ;array¡Breg2*s¡Bx ¥i¥H¤¬´«¡Areg2 »P s ¤]¥i¥H¤¬´«¡A³o¼Ë´N¦³ 12 ºØ±Æ¦C¤è¦¡
³B²z 22 ºØ±Æ¦C±¡§Î·|¨Ï mova Åܱo«Ü½ÆÂø¡A¬G¥ý¥H adjust ¥¨¶°§â³o 22 ºØ¤£¦Pªº±Æ¦C±¡§Î³£¨Ì¤@©w¶¶§ÇÂà´«¦¨¹³¡uTarray[reg2*s¡Ïx]¡vªº§Î¦¡¡AT¡Barray¡Breg2¡Bs¡Bx ªº¥ý«á¶¶§Ç¬O©T©wªº¡A¨ä¤¤ T ¬O§â¡uBYTEPTR¡v¡B¡uWORDPTR¡v¡B¡uDWORDPTR¡v¡B¡uQWORDPTR¡v§ï¥Î¤@Ó^¤å¦r¥À¥N´À¡A¥¦Ì¨Ì¦¸¬O B¡BW¡BD¡BQ¡BX¡A¤À§O¥Nªí¦ì¤¸²Õ¡B¦r²Õ¡BÂù¦r²Õ¡B¥|¦r²Õ¡B¥¼«ü©w³o¨Ç¸ê®ÆÃþ«¬¡C¤Uªí´N¬OÂà´««áªº¨Ò¤l¡G¡]operand¡Boutput ¬O adjust ªº¨âӰѼơAµy«á»¡©ú¡^
operand | output |
WORDPTRarray[28H¡ÏRBX*8H] | Warray[RBX*8H¡Ï28H] |
QWORDPTR[array¡Ï4H*R10¡Ï28H] | Qarray[R10*4H¡Ï28H] |
[R11*2¡Ï16] | X[R11*2¡Ï16] |
adjust ¥¨¶°Á`¦@±Nªñ¨â¦Ê¤@¤Q¦æ¡A©Ò¥H©³¤U¶È¦C¥X adjust ¥¨¶°ªº¤j·§µ²ºc¡Cadjust ¥u¦³¨âӰѼơGoperand¡Boutput¡Aadjust ·|§â¿é¤Jªº operand Âà´«¦¨ output¡Cadjust ²Ä 3¡ã9 ¦æ¥ý±N«e±ªº¸ê®ÆÃþ«¬¥þ³£´«¦¨¥Î¤@Ó¦r¥À¥N´À¡Anª`·Nªº¬O adjust ¬O¦b remove_space ³B²z¹L«á¤~°õ¦æ¡A©Ò¥H operand ¤º¨Ã¨S¦³ªÅ¥Õ¡A²Ä 3 ¦ænÀˬdªº¬O¡uBYTEPTR¡v¡A¦Ó¤£¬O¡uBYTE PTR¡v¡CÀˬd¨ä¥L¸ê®ÆÃþ«¬¤]³£¤@¼Ë¡A´N¬Ù²¤¤£¦C¥X¨Ó¤F¡C
±µ¤U¨Ó´N¬On³B²z¤Wz¤l¡ã¥f¥|ºØ±¡§Î¡A«Ü©úÅã¥i¥HÀˬd¡u¡Ï¡vªº¼Æ¶q¨Ó¨M©w¡A³o¬qµ{¦¡¦b¤Uªíªº²Ä 17¡ã36 ¦æ¡C¨S¦³¡u¡Ï¡vªº¬O¤l¡A¦³¨âÓ¡u¡Ï¡vªº¬O¥f¡A¦Ó¤¡¡B±GÁöµM³£¦³¤@Ó¡u¡Ï¡v¡A¦ý¥i¥H¥Î¡u[¡vªº¦ì¸m¨M©w¡A¦]¬°¤¡ªº operand ·|¹³¡uB[array¡Ïreg2*s]¡v¡A±Gªº±¡§Î«h¹³¡uBarray[reg2*s¡Ïx]¡v¡A©Ò¥HÀˬd¡u[¡v¬O§_¦b²Ä 2 Ó¦ì¸m§Y¥i¡F³o¬qµ{¦¡¦b¤Uªíªº²Ä 22¡ã31 ¦æ¡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 |
adjust MACRO operand,output
⁝
IFIDNI @SubStr(%operand,1,7),<BYTEPTR>
;Àˬd operand ¬O§_¬°¡uBYTEPTR¡v°_ÀY¡A¦pªG¬O±N¡uBYTEPTR¡v¥H¡uB¡v¥N´À
temp SUBSTR operand,8
operand CATSTR <B>,temp
ELSE
⁝
ENDIF
⁝
l_squbra INSTR 1,operand,<[> ;left square bracket¦boperandªº¦ì¸m
r_squbra INSTR 1,operand,<]> ;right square bracket¦boperandªº¦ì¸m
asterisk INSTR 1,operand,<*> ;*¦boperandªº¦ì¸m
plus1 INSTR 1,operand,<+> ;²Ä¤@ӡϦboperandªº¦ì¸m
plus2 INSTR plus1+1,operand,<+> ;²Ä¤@ӡϦboperandªº¦ì¸m
⁝
IF plus1 EQ 0
;¦pªG¨S¦³¡Ï¡AÄÝ©ó¤l±¡§Î¡ATarray[reg*s]¡Areg¡Bs ¥i¤¬´«¡A¦³¨âºØ±Æ¦C¤è¦¡
⁝
rtn_str CATSTR @SubStr(%operand,1,1),ary_name,<[>,idx_reg,<*>,scale_str,<]>
ELSEIF (plus1 NE 0) AND (plus2 EQ 0)
;¦pªGplus1¤£¬°¹s¥Bplus2µ¥©ó¹s¡Aªí¥Ü¥u¦³¤@Ó¡Ï¡AÄݩ󤡡B±G¡A¦@8ºØ±Æ¦C¤è¦¡
IF l_squbra EQ 2
;¦pªGl_squbraµ¥©ó2¡AÄݩ󤡡A¦³4ºØ±Æ¦C¤è¦¡
⁝
rtn_str CATSTR @SubStr(%operand,1,1),ary_name,<[>,idx_reg,<*>,scale_str,<]>
ELSE
;§_«hÄÝ©ó±G¡A¦³4ºØ±Æ¦C¤è¦¡
⁝
rtn_str CATSTR @SubStr(%operand,1,1),ary_name,<[>,idx_reg,<*>,scale_str,<+>,number,<]>
ENDIF
ELSE
;¨ä¥L±¡§Î¦³¨âÓ¡Ï¡AÄÝ©ó¥f¡A¦@12ºØ±Æ¦C¤è¦¡
⁝
rtn_str CATSTR @SubStr(%operand,1,1),ary_name,<[>,idx_reg,<*>,scale_str,<+>,number,<]>
ENDIF
output TEXTEQU rtn_str
ENDM |
n§â 22 ºØ±¡§Î¥þ³¡¦C¥X¨Ó½g´T¤Ó¤j¡A¤£¤Á¹ê»Ú¡A©Ò¥H¤p¤ì°¸¶È»¡©ú¤l±¡§Î¡C¤l±¡§Îªº operand ¬O¡uDATA_TYPE array[reg2*s]¡v¡A¨ä¤¤ reg2¡Bs ¥i¤¬´«¦ì¸m¡A©Ò¥H¦³¨âºØ±Æ¦C¤è¦¡¡A¦ý¤£½×þ¤@ºØ¡A°}¦C¦WºÙ³£¬O¥Ñ²Ä¤GÓ¦r¤¸¶}©l¨ì¡u[¡v©Ò¦bªº«e¤@Ó¦ì¸m°±¤î¡A©Ò¥H«Ü®e©ö´N¯àpºâ¥X°}¦C¦WºÙ¡AµM«á¦s©ó ary_name ¦r¦ê¤º¡A¨£¤U±㈮¦¡¡C
IF plus1 EQ 0 ;¦pªG¨S¦³¡Ï¡AÄÝ©ó¤l±¡§Î¡ATarray[reg2*s]¡Areg2¡Bs ¥i¤¬´«¡A¦³¨âºØ±Æ¦C¤è¦¡ ary_name SUBSTR operand,2,l_squbra-2 ;㈮¦¡ IFIDNI @SubStr(%operand,asterisk+1,1),<R> ;㈭¦¡ ;¦pªG¬Ûµ¥¡Aªí¥Ü¯Á¤Þ¿²v¤¤¡A¿²v¦b«e¡A¯Á¤Þ¼È¦s¾¹¦b«á¡A¨Ò¦pTarray[s*reg2] idx_reg SUBSTR operand,asterisk+1,r_squbra-asterisk-1 ;㈬¦¡ scale_str SUBSTR operand,asterisk-1,1 ;㈫¦¡ ELSE ⁝ ENDIF rtn_str CATSTR @SubStr(%operand,1,1),ary_name,<[>,idx_reg,<*>,scale_str,<]> ㈯¦¡
±µ¤U¨ÓnÀˬd [ ] ¤º¬O¿²v¦b«eÁÙ¬O¯Á¤Þ¼È¦s¾¹¦b«e¡AÀˬd¤èªk¤]«Ü²³æ¡A¦]¬°¯Á¤Þ¼È¦s¾¹ªº¦WºÙ³£¥H R ¶}ÀY¡A©Ò¥H¥u»ÝÀˬd¡u*¡v«á±ªº¨ºÓ¦r¤¸¬O§_¬° R §Y¥i¡A¦pªG¯u¬O R¡A´N¯àª¾¹D¦b [ ] ¤º¬O [s*reg2]¡A§_«h¬O [reg2*s]¡C³o¬qµ{¦¡¦b¤W±㈭¦¡¡C¦pªG¬O«eªÌ¡A¨º»ò¯Á¤Þ¼È¦s¾¹¦WºÙ´N¬O±q¡u*¡v¤§«á¨ì¡u]¡v¤§«e¡A¦s©ó idx_reg ¦r¦ê¤º¡F¦Ó¿²v«h¬O¦b¡u[¡v¤§«á¨ì¡u*¡v¤§«e¡A¦s©ó scale_str ¦r¦ê¤º¡C§Y㈬¡B㈫¨â¦¡¡C
³Ì«á¦b㈯¦¡¤¤«·s¨Ì¾Ú«e±´£¹Lªº¶¶§Ç«·s²Õ¦X¡A¦¨¬° rtn_str ¦r¦ê¡C㈯¦¡¤¤ªº¡u@SubStr(%operand,1,1)¡v·|±o¨ì operand ªº¸ê®ÆÃþ«¬¡AB¡BW¡BD¡BQ ©Î X¡C¦pªG¿é¤Jªº¬O¨ä¥L operand¡A«h¥i¯à¬O¨ä¾l¤¡¡B±G¡B¥f¤TºØ±¡§Î¡A¤£½×þ¤@ºØ³£·|¨Ì¾Ú¤£¦P±¡ªp¡A¨Ã¥B¨Ì·Ó«e±´£¹Lªº¶¶§Ç«·s²Õ¦X¦¨ rtn_str ¦r¦ê¡C³Ì«á¨Ï output ¦r¦ê»P rtn_str ¬Ûµ¥«áªð¦^ mova ¥¨¶°¡C
¦pªG¤w½T»{¬O¥Ò±¡§Î¡A¥B¤w¸g¸g¥Ñ adjust ½Õ¾ã¤§«á¡A¨º»ò arg1 ¬O¼È¦s¾¹¡Aarg2 ¬O¹³¡uTarray[reg2*s¡Ïx]¡vªº¶¡±µ©w§}¡A¾ãÓ«ü¥O¬O¡umov reg1,Tarray[reg2*s¡Ïx]¡v¡A¨º»ò´N¥i¥H¥Í¦¨¾÷±ñ½X¤F¡C
¦b mova ¥¨¶°ùتº Legacy Prefixes¡BREX Prefix »P OpCode ³£¦bÀˬd¬O§_¬°¼È¦s¾¹®É´N¶¶«K³]¦n¤F¡C¥u¦³¯Á¤Þ¼È¦s¾¹¦pªG¬O R8¡ãR15 ¤¤ªº¨ä¤¤¤§¤@¡A¨º»ò¥²¶·±N REX Prefix ªº X ¦ì¤¸³]¬°¤@¡A³o³¡¤À¥u¦³¦b¸g¹L adjust ¥¨¶°½Õ¾ã¹L¹Bºâ¤¸ arg2 ¤§«á¤~¨Ìª¬ªp¬O§_³]©w¡C
ModR/M ¤¤¡AMod »P R/M ¤À§O¬O 000 »P 100¡A³o¬O¤£Åܪº¡F¦Ü©ó²Ä 3¡ã5 ¦ì¤¸¬O¨ä¹ê´N¬O¦bÀˬd¬O§_¬°¼È¦s¾¹®Éªº reg¡C¦]¬°¥¦¦b²Ä 3¡ã5 ¦ì¤¸¡A©Ò¥H reg ¥²¶·¼¥H¤K¡A©Ò¥H ModR/M ¬°¡G
modrm=0+reg*8+4
SIB ¤¤ªº²Ä 7¡ã8 ¦ì¤¸¬O¿²v¡A¦ì©ó¡u*¡v¤§«á¡A¦Ó¥Bªø«×¬°¤@Ó¦r¤¸¡A¥i¥Ñ¤U±µ{¦¡±o¨ì¡G
temp SUBSTR arg2,asterisk+1,1 ;¥Ñarg2¤¤¨ú±o¿²v¡A¨Ã¦s©ótemp¤º
IF temp EQ 1
scale=0
ELSEIF temp EQ 2
scale=40h
ELSEIF temp EQ 4
scale=80h
ELSEIF temp EQ 8
scale=0c0h
ELSE
msg_err TEXTEQU <ERROR: Scale must be 1, 2, 4 or 8>
GOTO error
ENDIF
SIB ¤¤¡ABase ¦b 0¡ã2 ¦ì¤¸¡A¥²©w¬O 101¡A¤Q¤»¶i¦ì¬O 5¡C²Ä 3¡ã5 ¦ì¤¸¬O¯Á¤Þ¼È¦s¾¹¡A¦ì©ó¡u[¡v¤§«á¨ì¡u*¡v¤§«e¡A¨Ã¥B¬O 64 ¦ì¤¸ªº¼È¦s¾¹¡A¥i¥H¥Ñ¤U±µ{¦¡±o¨ì¡G
temp SUBSTR arg2,l_squbra+1,asterisk-l_squbra-1 ;¥Ñarg2¤¤¨ú±o¯Á¤Þ¼È¦s¾¹¦WºÙ¡A¨Ã¦s©ótemp¦r¦ê¤º get_reg temp,%reg64 ;¦pªGreg¤j©ó7¡A«hREX.X»Ý³]¬°¤@¡A¦P®É¨Ïreg´î8 IF reg GT 15 msg_err TEXTEQU <ERROR: Must be 64-bit register> ELSEIF reg GT 7 rex_prefix=rex_prefix OR 42h reg=reg-8 ENDIF sib=scale+reg*8+5
¤W±µ{¦¡³Ì«á¤@¦æ¡A´N¬O§â¿²v¡B¯Á¤Þ¼È¦s¾¹¡BBase µ²¦X°_¨Ó¡A¦¨¬° SIB ¦ì¤¸²Õ¡C
¥Ò±¡§Î¨S¦³¥ß§YÈ¡A©Ò¥H³Ì«á¤@¶µ´N¬O displacement¡C¥Ò±¡§Îªº argument2 ¸g¹L adjust ½Õ¾ã«á¦³¨âºØ±¡§Î¡G¡uTarray[reg2*s¡Ïx]¡v»P¡uTarray[reg2*s]¡v¡A¦Ó displacement ´N¬O§â array ¨ú¨ä¦ì§}¡A¦A¥[¤W x §Y¥i¡C©Ò¥Hµ{¦¡¦p¤U¡G
;¨ú±o°}¦C¦WºÙ¡A°}¦C¦WºÙ¥Nªí°¾²¾¦ì§} temp SUBSTR arg2,2,l_squbra-2 displacement=OFFSET temp ;Yplus1¤£¬°¹s¡A¶·±N[]¤ºªº¼ÆÈ¥²¶·¥[¶i°¾²¾¦ì§}¤¤ IF plus1 NE 0 temp SUBSTR arg2,plus1+1,r_squbra-plus1-1 displacement=displacement+temp ENDIF
µ¥³o¤@¤Á¦ì¤¸²Õ³£³]©w¦n¤§«á¡AÁÙ¶·¨Ì¾Ú¤W±´£¨ìªº¾÷±ñ½X¶¶§Ç¡A¥H DB ©Î DD °²«ü¥O¤è¦¡¦s¤J¥ØªºÀɤº¤~¦æ¡C¬°¤FÅý¤A¡B¤þ¨âºØ±¡§Î¤]¯à¨Ï¥Î¡A©Ò¥H»Ý¦Ò¼{¸û©P¥þ¡Cµ{¦¡¦p¤U¡G
:save ;§â¾÷±ñ½X¨Ì¾Úlegacy prefixes, REX prefix, OpCode, ModR/M, SIB, displacement, immediate±Æ¦C
IF legacy_prefix NE 0
DB legacy_prefix
ENDIF
IF rex_prefix NE 0
DB rex_prefix
ENDIF
DB opcode,modrm,sib
DD displacement
IF immediate NE 0
IFIDNI d_type,<B>
DB immediate
ELSE
IFIDNI d_type,<W>
DW immediate
ELSE
IFIDNI d_type,<D>
DD immediate
ELSE
IFIDNI d_type,<Q>
DD immediate
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
¨ì¦¹´N¤j¥\§i¦¨¤F¡A¦ý¬O¥u¦³¥Ò±¡§Î¬O§¹¦¨¤F¡AÁÙ¦³¤A¡B¤þ¨âºØ±¡§Î¥¼§¹¦¨¡C
°²¦p§A¥J²ÓÆ[¹î¥Ò¡B¤A¨âºØ±¡§Î¡G
¥Ò¡Gmova reg1, DATA_TYPE array [ reg2*s ]
¤A¡Gmova DATA_TYPE array [ reg2*s ], reg1
§A·|µo²{³o¨âºØ±¡§Î¥u¬O¨âÓ¹Bºâ¤¸¤¬´«¡A¤]¥i»¡¬O¨âӤ޼Ƥ¬´«¡C¦]¬°¥Øªº¹Bºâ¤¸»P¨Ó·½¹Bºâ¤¸¤¬´«¡A¾ÉP¾Þ§@½X¤£¦P¡A°£¦¹¤§¥~¡Amova ³B²z¹Lµ{³£¬Û¦P¡A©ó¬O¦³¤F¤jÁx·Qªk¡C³oÓ¤jÁxªº·Qªk´N¬O§â mova ì¨Óªº¤Þ¼Æ§R°£ªÅ¥Õ«áÅܬ° arg1¡Barg2 ¤¬´«¡A¦AÃB¥~³]¦n¾Þ§@½X§Y¥i¡A©ó¬Oµ{¦¡¦p¤U¡C¨ä¤¤ exchange ¼Ð°OÀ³¸Ó«ü¦V³B²z¥Ò±¡§Îªº¤@¶}©l¡A³o¼Ë´N±N¤A±¡§Î³B²z§¹¦¨¤F¡C
;³B²z¹³¡uMOV ¸ê®ÆÃþ«¬ °}¦C¦W[¼È¦s¾¹1*¿²v¡Ï¼ÆÈ],¼È¦s¾¹2¡vªº«ü¥O¡A¸ò±q:exchange¡ã:reg_not_targetªº
;¥¨¶°µ{¦¡½X´X¥G¤@¼Ë¡A®t§O¦b©ó¨âÓ¹Bºâ¤¸¤¬´«¥BOpCodeÅܬ°89h©Î88h¡A«eªÌ¬O64¡B32¡B16¦ì¤¸¡A«áªÌ¬O8¦ì¤¸
mem_reg_v=89h
mem_reg_b=88h
temp TEXTEQU arg1
arg1 TEXTEQU arg2
arg2 TEXTEQU temp
GOTO exchange
³Ñ¤U³Ì«á¤@ºØ¡A¤þ±¡§Î¤F¡C¤þ±¡§Îªº«ü¥O¬O¹³¡umova DATA_TYPE array[reg2*s¡Ïx],imm¡vªº¼Ë¤l¡A¨ä¤¤¡uDATA_TYPE array[reg2 *s¡Ïx]¡v¬O arg1¡Aimm ¬O arg2¡Carg1 ùرªº array ¤]¥i¥H¦b¡u[ ]¡v¤º¡A¦pªG¦b¡u[ ]¡v¤º¡A¨º»ò array¡Breg2*s¡Bx ¤TªÌ¥i¥H¤¬´«¦ì¸m¡A§Y¨Ï¤£¦b¡u[ ]¡v¤º¡A¨º»ò reg2*s¡Bx ¤]¥i¥H¤¬´«¦ì¸m¡A¯Á¤Þ¿²v reg2*s ªº reg2 »P s ¤]¥i¤¬´«¦ì¸m¡A©Ò¥H¦³«Ü¦hºØ±¡§Î¡C
©¯¦n¦b³o¤§«e¡A¤w¸g¼g¦n¤F adjust ¥¨¶°¡C¥¦¥i¥H§â arg1 ¨Ì·Ó array¡Breg2¡Bs¡Bx ªº¶¶§Ç±Æ¦C¡AÅܦ¨¹³¡uTarray[reg2*s¡Ïx]¡vªº¼Ë¤l¡A³o¼Ë©¹«á³B²z´N·|Åܱo²³æ¤F¡A©Ò¥H²Ä¤@¨B´N¬O¤Þ¥Î adjust ¥¨¶°Âà´« arg1¡C²Ä¤G¨B¬Opºâ [¡B]¡B*¡Ï ¦b arg1 ¤¤ªº¦ì¸m¡A¤À§O°O¿ý¦b l_squbra¡Br_squbra¡Basterisk¡Bplus1 ÅܼÆùØ¡C
±µ¤U¨Ó´N¥i¥Hpºâ¾÷±ñ½X¦U¦ì¤¸²Õªº¼ÆȤF¡C¦b¤þ±¡§ÎùØ¡AModR/M¡BSIB¡B°¾²¾¦ì§}§¡»P¥Ò¡B¤A¨âºØ±¡§Îªº³B²z¤è¦¡¤@¼Ë´N¤£«½Æ»¡©ú¡F´N¥u¦³¤@ÂI¤£¦P¡A¦b¤þ±¡§Î¤¤¤£¨Ï¥Î¼È¦s¾¹¡AModR/M ¤¤ªº Reg ¦ì¤¸¨ä¹ê¬O¾Þ§@½XªºÂX¥R¡A©Ò¥HÀ³¸Ó¬O Reg/OpCode ªº OpCode ¤~¬O¡A¨äȧ¡¬°¹s¡A¨£¦¹ªíªº GRP11a¡BGRP11b¡C
¤þ±¡§Î¦³¥ß§YÈ¡A¥ß§YÈ¥iµø¬°±`¼Æ¡Aargument2 ´N¬O¥ß§YÈ¡C²³©Ò©Pª¾¡AMOV ªº¥Øªº¹Bºâ¤¸»P¨Ó·½¹Bºâ¤¸ªø«×»Ý¤@P¡A¦]¦¹ÁöµM¤£¶·¯S§O³B²z¥ß§YÈ¡A¦ý¥²¶·¦Ò¼{¹Bºâ¤¸ªø«×¡C¹Bºâ¤¸ªø«×°£¤F¼vÅT¥ß§YȪø«×¤§¥~¡AÁÙ¼vÅT REX Prefix¡BLegacy Prefixes ¤Î¾Þ§@½X¡C·í¹Bºâ¤¸ªø«×¬° 64 ¦ì¤¸®É¡AREX Prefix ªº W ¦ì¤¸¶·³]¬°¤@¡A¥B¸û°ªªº¥|Ӧ줸nÅܬ° 4¡F·í¹Bºâ¤¸ªø«×¬° 16 ¦ì¤¸®É¡ALegacy Prefixes ¬° 66H¡A§_«h¤£¦s¦b¡F·í¹Bºâ¤¸¬O 8 ¦ì¤¸®É¡A¾Þ§@½X¬O 0C6H¡A§_«h¬O 0C7H¡C³o¬qµ{¦¡¦p¤U¡G
d_type SUBSTR arg1,1,1 IFIDNI d_type,<B> opcode=0c6h ELSE opcode=0c7h IFIDNI d_type,<W> legacy_prefix=66h ELSE IFIDNI d_type,<D> ELSE IFIDNI d_type,<Q> rex_prefix=rex_prefix OR 48h ELSE msg_err TEXTEQU <ERROR: The operand length must be specified> GOTO error ENDIF ENDIF ENDIF ENDIF
ȱo¤@´£ªº¬O¡A§Y¨Ï¹Bºâ¤¸ªø«×¬° 64 ¦ì¤¸¡A¥i¬O¥ß§YȤ´µM¥u¯à¬O 32 ¦ì¤¸¡A¤p¤ì°¸¤£ª¾¹Dì¦]¬°¦ó¡A¦ý¬O¤´µM¥i¥H²ÕĶ¦¨¥\¡F¦pªG¥ß§Yȧ令 64 ¦ì¤¸¡A¤Ï¦Ó·|²£¥Í¿ù»~¡C¨ú±o¥ß§Yȵ{¦¡¦p¤U¡G
;¨ú±o¥ß§YÈ
immediate=argument2
³Ì«á¤@¨B¬O§âpºâ¾÷±ñ½X©Ò±oªº¦U¦ì¤¸²Õ¡A¥H DB ©Î DD °²«ü¥O¤è¦¡¦s¤J¥ØªºÀɤº¡C«e±´£¹L¡A¨ä¹ê¸ò³B²z¥Ò¡B¤A¨âºØ±¡§Î³Ì«áµ²ªG¤@¼Ë¡Aª½±µ¸õ¨ì¡u:save¡v¼Ð°O³B¡C
¨ì¦¹¡A¯u¥¿ªº¤j¥\§i¦¨¤F¡I
³oÓªþ¿ýùØ¡A¤p¤ì°¸±Ôz¤F¥Î¥¨¶°ªº¤èªk¡AÅý쥻 UASM64.EXE ¤£¯à²ÕĶ¡A¦ý»yªk¥¿½Tªº²Õ¦X»y¨¥«ü¥O¯à¥¿±`²ÕĶ¡C³oÅý§Ú¤º¤ß¤Q¤À°ª¿³¡A³ºµM¯à¼g¥X³oºØµ{¦¡¨Ó¡C·íµM³onÂk¥\³\¦h¤H¡A¥L̼¶¼g¤F MASM64 SDK Åý¤p¤ì°¸¯àÆ[¼¯¾Ç²ß¡C
³oÓ×¥¿ UASM64.EXE ªº¥¨¶°¡Amova¡A¥H¤Î¬ÛÃö¥¨¶°³£¦s¦b MYFIX.INC ¥]§tÀɤº¡A¨Ã»s§@¦¨À£ÁYÀÉ©ñ¦b MEGA ¤W¡A¦pªG¥Î±oµÛªº¸Ü½Ð¦Û¦æ¤U¸ü¡C¸ÑÀ£ÁY«á¥u¦³¤@Ó MYFIX.INC ÀɮסA±N¨ä©ñ¨ì¡uC:\UASM\Include¡v¤l¥Ø¿ý¤º§Y¥i¡A©ÎªÌ©ñ¨ì»P²Õ¦X»y¨¥ì©lÀɮצP¤@¤l¥Ø¿ý¤]¦æ¡C
¦b²Õ¦X»y¨¥µ{¦¡¤¤¡An¤Þ¥Î mova ¥¨¶°¡A¥²¶·¥ý¥]§t MYFIX.INC¡AµM«á´N¯à¤Þ¥Î¡A¨Ò¦p©³¤Uªº¨Ò¤l¡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 |
;²ÕĶ¤è¦¡
;uasm64 -win64 tst.asm
;link tst.obj /largeaddressaware:no
OPTION CASEMAP:NONE
OPTION WIN64:3
INCLUDE WINDOWS.INC
INCLUDE MYFIX.INC ;¥]§t×¥¿UASM64.EXE©Ò»Ýmova¥¨¶°ªº¥]§tÀÉ
INCLUDELIB KERNEL32.LIB
INCLUDELIB USER32.LIB
;*******************************************************************************
.DATA
button DD MB_OKCANCEL,MB_ABORTRETRYIGNORE,MB_YESNOCANCEL,MB_YESNO,MB_RETRYCANCEL
number DD 5
szCap DB "TEST MYFIX.INC",0
szText DB "PLEASE PRESS ANY BUTTON.",0
;*******************************************************************************
.CODE
;-------------------------------------------------------------------------------
main PROC
@@: mov rax,5
sub eax,number
mova r9d,button[rax*4] ;¨Ï¥Îmova¥¨¶°
invoke MessageBox,0,OFFSET szText,OFFSET szCap,r9d
dec number
jnz @b
invoke ExitProcess,0
main ENDP
;*******************************************************************************
END main |
¦b²Ä 8 ¦æ¡A¤Þ¤J MYFIX.INC ¥]§tÀÉ¡A¦Ó«á¦b²Ä 24 ¦æ¤Þ¥Î mova ¥¨¶°¡A³sµ²®É§O§Ñ¤Fn¤U¹F¡u/largeaddressaware:no¡v¿ï¶µ¡C¦pªG¤£¥Î³o¨â¦æ¡A´Nn±Ä¥Î²Ä¤Q¤»³¹Åܳqªº¤èªk¡C