ªþ¿ý¤G¡@UASM64 ªº°}¦C¦s¨ú


©Ç¨Æ¦~¦~¦³

¥ý¬Ý¤@¬qµ{¦¡¡G

.DATA
array   DD      20h DUP (3388h)
        ⁝
.CODE
        ⁝
        mov     r8,2
        mov     eax,array[r8*4]
        ⁝

¥Î UASM64.EXE ²ÕĶ¤W­zµ{¦¡·|µ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°²¦p­n³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


²ÕĶ­þ¨Ç«ü¥O·|¥X¿ù¤Î¨ä¸Ñ¨M¤èªk

¶¡±µ©w§}

­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«ü©w­n³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¤W­z¹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

°w¹ï²Ä⑷ºØ§Î¦¡

§è»·¤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


¸Ñ¨M UASM64.EXE Bug ªº¤èªk

¤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

¤W­z¤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

­ì²z

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²{¤W­z¾÷±ñ½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

W ¦ì¤¸¡G·í¹Bºâ¤¸ªø«×¬O 64 ¦ì¤¸®É¡AW ¦ì¤¸¬° 1¡F¨ä¥L¦ì¤¸®É¡AW ¦ì¤¸¬° 0¡C
R ¦ì¤¸¡G¥Ò¡B¤A¤¤ªº reg1 ¦pªG¬O x64 ®É¥N¤~·s¼Wªº¼È¦s¾¹¡A¨º»ò R¡×1¡A§_«h¬° 0¡C¤ñ¸û¯S§Oªº¬O¡A¦pªG reg1 ¬O RAX¡ãRDI¡A¨º»ò R¡×0¡A²z¥Ñ¨£¾÷±ñ½X¤¤ªº¼È¦s¾¹¡C
X ¦ì¤¸¡G¯Á¤Þ¼È¦s¾¹¡]reg2¡^¦pªG¬O RAX¡ãRDI¡A¨º»ò X¡×0¡F¦pªG¬O R8¡ãR15¡A¨º»ò X¡×1¡C
B ¦ì¤¸¡Gmova ¤£³B²z¦³Ãö°ò©³¼È¦s¾¹ªº±¡ªp¡A©Ò¥H B¡×0¡C¡]¥»ªþ¿ý«e­zªº²Ä⑸¡ã⑹ºØ©w§}¤è¦¡¤~·|¥Î¨ì°ò©³¼È¦s¾¹¡^

③¡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

bitsWlegacy
prefixes
¥Ò
MOV  reg1, array[ reg2*s ]
¤A
MOV  array[ reg2*s ], reg1
¤þ
MOV  array[ reg2*s ], imm
808A88C6
160668B89C7
3208B89C7
6418B89C7

Æ[¹î¤Wªí¡AÀ³¥iª¾¨s³º¬O­n¥Î­þ¤@­Ó¾Þ§@½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±¡§Î¡A­n§PÂ_¹Bºâ¤¸ªø«×¡A¥i¥H±q reg1 µÛ¤â¡F¦pªG¬O¤þ¡A´N¥²¶·¥Ñ array[reg2*s] ªº array µÛ¤â¡C

④¡BModR/M¡GModR/M ¤¤ªº Mod »P R/M Äæ¦ì¥Î¨Ó¨M©w©w§}¼Ò¦¡¡A¸Ô²Ó±¡§Î½Ð°Ñ¾\ DOS ²Õ¦X»y¨¥²Ä 24 ³¹¡A³oùØ¥u´£»P¥»ªþ¿ý¦³Ãöªº³¡¤À¡C·í R/M=100¡A¦Ó Mod ¬° 00¡B01 ©Î 10 ®É¡A³£»P SIB ©w§}¦³Ãö¡A©Ò¿×ªº SIB ©w§}´N¬O«ü²o¯A¨ì°ò©³¼È¦s¾¹¡B¯Á¤Þ¼È¦s¾¹»P­¿²vªº©w§}¤è¦¡¡C¦Ó mova ¥¨¶°­n³B²zªº¡A¶È¶È¦³¯Á¤Þ¼È¦s¾¹»P­¿²v¡A¦Ó¨S¦³°ò©³¼È¦s¾¹¡A©Ò¥H Mod §¡¬° 00¡AR/M §¡¬° 100¡C
ModR/M ªº²Ä 3¡ã5 ¦ì¤¸ºÙ¬° Reg/OpCode¡A¨M©w³o¤T­Ó¦ì¤¸¬O¦h¤Ö¡A¦b¥Ò¡B¤A¨âºØ±¡§Î®É¡A»P reg1 ©Ò¥Nªíªº¼È¦s¾¹¦³Ãö¡F¦Ó¤þºØ±¡§Îªº Reg/OpCode «h¬O¾Þ§@½XªºÂX¥R¡A«ê¦n¬° 0¡]¨£¦¹ªíªº GRP11a¡BGRP11b¡^¡CReg/OpCode ªº¦WºÙ«Ü©_©Ç¡A³o¬O¦]¬°¦³¨Ç«ü¥Oªº¾Þ§@½X·|ÂX¥R¨ì³o¤T­Ó¦ì¤¸¡A¦ý¤j³¡¤À®É­Ô¤£·|³o¼Ë¡A³o®É­Ô´N¬O·í°µªí¥Ü¼È¦s¾¹¨Ï¥Î¡C¦Ó¤þ±¡§Î«ê¦n¬O«e¤@ºØª¬ªp¡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 ©Ò¥Nªíªº­¿²v
Scale00011011
­¿²v1248

¾÷±ñ½X¤¤ªº¼È¦s¾¹

¦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ªG­nªí¥Ü 16 ¦ì¤¸ªº¼È¦s¾¹¡A¶È»Ý¤T­Ó¦ì¤¸§Y¥i¡G

¤G¶i¦ì¼Æ000001010011100101110111
8 ¦ì¤¸ALCLDLBLAHCHDHBH
16 ¦ì¤¸AXCXDXBXSPBPSIDI

¨ì¤F IA¡Ð32 ªº®É¥N¡A¹³ 80386/80486 µ¥ CPU¡A±N³o¤K­Ó¼È¦s¾¹ÂX¥R¦¨ 32 ¦ì¤¸¡A©Ò¥H¤WªíÅܦ¨¡G

¤G¶i¦ì¼Æ000001010011100101110111
8 ¦ì¤¸ALCLDLBLAHCHDHBH
16 ¦ì¤¸AXCXDXBXSPBPSIDI
32 ¦ì¤¸EAXECXEDXEBXESPEBPESIEDI

¨ì¤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¡BREX.X¡BREX.B »P Reg¡BIndex¡BBase Äæ¦ì¤§Ãö«Y
REX.
R/X/B
¼È¦s¾¹
ªø«×
Reg¡BIndex ©Î Base Äæ¦ì
000001010011100101110111
0¤K¦ì¤¸ALCLDLBLAH/SPL CH/BPLDH/SILBH/DIL
¤Q¤»¦ì¤¸AXCXDXBXSPBPSIDI
¤T¤Q¤G¦ì¤¸EAXECXEDXEBXESPEBPESIEDI
¤»¤Q¥|¦ì¤¸RAXRCXRDXRBXRSPRBPRSIRDI
1¤K¦ì¤¸R8BR9BR10BR11BR12BR13BR14BR15B
¤Q¤»¦ì¤¸R8WR9WR10WR11WR12WR13WR14WR15W
¤T¤Q¤G¦ì¤¸R8DR9DR10DR11DR12DR13DR14DR15D
¤»¤Q¥|¦ì¤¸R8R9R10R11R12R13R14R15

¦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

¨Ò¤l

±q¤W­±ªº»¡©ú¡A©Î³\¥i¥H¸Õ¸Õ´X­Ó¨Ò¤l¡A§â²Õ¦X»y¨¥¡u½Ķ¡v©Î¡u¤H¤u²ÕĶ¡v¦¨¾÷±ñ½X¡C

¨Ò¤l¤@¡GMOV eax,array[rdx*4]

²ÕĶ¹Lµ{¦p¤U¡G

  1. Legacy Prefixes¡G¥u¦³¹Bºâ¤¸¬O 16 ¦ì¤¸¤~»Ý­n 66H¡A©Ò¥H¦¹«ü¥Oªº¾÷±ñ½X¨S¦³ Legacy Prefixes¡C
  2. REX Prefix¡G¥Øªº¹Bºâ¤¸ reg1 ¬O EAX¡A32 ¦ì¤¸ªº¼È¦s¾¹¡A©Ò¥H W¡BR ¦ì¤¸§¡¬°¹s¡C¯Á¤Þ¼È¦s¾¹¬O RDX¡A¬G X ¦ì¤¸¬°¹s¡C«e­±´£¹L mova ¤£¶·°ò©³¼È¦s¾¹¡A¬G B ¦ì¤¸¬°¹s¡Cºî¦X°_¨Ó REX Prefix ªº W¡BR¡BX¡BB §¡¬° 0¡A©Ò¥H¨S¦³ REX Prefix¡C
  3. OpCode¡G¬d¾\③ªí®æ¡A±oª¾ OpCode ¬° 8B¡C
  4. ModR/M¡G¬d¾\¡A±oª¾ Mod ¬° 00¡AR/M ¬° 100¡C¦]¬° reg1 ¬O EAX¡A©Ò¥H Reg ¬° 000¡Cµ²¦X°_¨Ó ModR/M ¬O 00 000 100¡A´«ºâ¦¨¤Q¤»¶i¦ì¬O 04¡C
  5. SIB¡G­¿²v¬O 4¡A©Ò¥H Scale ¬O 10¡F¯Á¤Þ¼È¦s¾¹¬O RDX¡A©Ò¥H Index ¬° 010¡F®Ú¾Ú¡A±oª¾ Base ¬° 101¡Cµ²¦X°_¨Ó SIB ¬O 10 010 101¡A´«ºâ¦¨¤Q¤»¶i¦ì¬O 95¡C
  6. Displacement¡G°¾²¾¦ì§}¬O±q°Ï¬q°_©l¦ì§}¶}©lºâ°_¦h¤Ö­Ó¦ì¤¸²Õ¡A¥i¥H¥Î OFFSET array ­pºâ±o¨ì¡C
  7. Immediate¡G¦¹«ü¥O¨S¦³¥ß§Y­È¡C
  8. µ²¦X«e­z 1.¡ã7. ±oª¾ MOV eax,array[rdx*4] ¾÷±ñ½X¬O 8B 04 95 XX¡A¨ä¤¤ XX ¬OÂù¦r²Õ¼Æ­È¡C

¨Ò¤l¤G¡GMOV BYTE PTR array[r10*2+ 28h],spl

²ÕĶ¹Lµ{¦p¤U¡G

  1. Legacy Prefixes¡G¦]¬°¹Bºâ¤¸¬O¤K¦ì¤¸¡A©Ò¥H¨S¦³ Legacy Prefixes¡C
  2. REX Prefix¡G¹Bºâ¤¸¬O¤K¦ì¤¸ªº¡A©Ò¥H W ¦ì¤¸¬O¹s¡A¨Ã¥B reg1 ¬O SPL¡A©Ò¥H R ¦ì¤¸¬°¹s¦ý¥²¶·­n¦³ REX Prefix¡C¯Á¤Þ¼È¦s¾¹¬O R10¡A¬G X ¦ì¤¸¬°¤@¡C«e­±´£¹L mova ¤£¶·°ò©³¼È¦s¾¹¡A¬G B ¦ì¤¸¬°¹s¡Cºî¦X¨Ó»¡ REX Prefix ¬O 0100 0 0 1 0¡A´«ºâ¦¨¤Q¤»¶i¦ì¬O 42¡C
  3. OpCode¡G¬d¾\③ªí®æ¡A±oª¾ OpCode ¬° 88¡C
  4. ModR/M¡G¬d¾\¡A±oª¾ Mod ¬° 00¡AR/M ¬° 100¡C¦]¬° reg1 ¬O SPL¡A¬d¾\«eªí¡AReg ¬° 100¡Cµ²¦X°_¨Ó ModR/M ¬O 00 100 100¡A´«ºâ¦¨¤Q¤»¶i¦ì¬O 24¡C
  5. SIB¡G­¿²v¬O 2¡A©Ò¥H Scale ¬O 01¡F¯Á¤Þ¼È¦s¾¹¬O R10¡A¬d¾\«eªí¡AIndex ¬° 010¡F®Ú¾Ú¡A±oª¾ Base ¬° 101¡Cµ²¦X°_¨Ó SIB ¬O 01 010 101¡A´«ºâ¦¨¤Q¤»¶i¦ì¬O 55¡C
  6. Displacement¡G°¾²¾¦ì§}¬O±q°Ï¬q°_©l¦ì§}¶}©lºâ°_¦h¤Ö­Ó¦ì¤¸²Õ¡A¥i¥H¥Î OFFSET array ­pºâ±o¨ì¡C¦Ó³Ì«á­±ªº¡u¡Ï28h¡v«h¬O¦b­pºâ¥X OFFSET array ¤§«á¦A¥[¤W 28h¡C
  7. Immediate¡G¦¹«ü¥O¨S¦³¥ß§Y­È¡C
  8. µ²¦X«e­z 1.¡ã7. ±oª¾ MOV BYTE PTR array[r10*2+ 28h],spl ¾÷±ñ½X¬O 42 88 24 55 XX¡A¨ä¤¤ XX ¬OÂù¦r²Õ¼Æ­È¡C

¦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¤@©w­n¨Ï¥Î AH¡A¨º»ò´N±o§â R10 ´«¦¨ RAX¡ãRDI ¤¤ªº¨ä¤¤¤@­Ó¡C

¨Ò¤l¤T¡G MOV WORD PTR array[rax*1],9abch

²ÕĶ¹Lµ{¦p¤U¡G

  1. Legacy Prefixes¡G¦]¬°¹Bºâ¤¸¬O¤Q¤»¦ì¤¸¡A©Ò¥H Legacy Prefixes ¬° 66¡C
  2. REX Prefix¡G¹Bºâ¤¸¬O¤Q¤»¦ì¤¸ªº¡A©Ò¥H W ¦ì¤¸¬O¹s¡A¨S¦³ reg1¡A©Ò¥H R ¦ì¤¸¬°¹s¡C¯Á¤Þ¼È¦s¾¹¬O RAX¡A¬G X ¦ì¤¸¬°¹s¡C«e­±´£¹L mova ¤£¶·°ò©³¼È¦s¾¹¡A¬G B ¦ì¤¸¬°¹s¡Cºî¦X¨Ó»¡ REX Prefix ªº W¡BR¡BX¡BB §¡¬° 0¡A©Ò¥H¨S¦³ REX Prefix¡C
  3. OpCode¡G¬d¾\③ªí®æ¡A±oª¾ OpCode ¬° C7¡C
  4. ModR/M¡G¬d¾\¡A±oª¾ Mod ¬° 00¡AR/M ¬° 100¡C¦]¬°¦¹¨Ò¤l¬O¤þ±¡§Î¡AReg/OpCode ¬O¾Þ§@½XªºÂX¥R¡A¥i¬O«ê¦n¬O 0¡Cµ²¦X°_¨Ó ModR/M ¬O 00 000 100¡A´«ºâ¦¨¤Q¤»¶i¦ì¬O 04¡C
  5. SIB¡G­¿²v¬O 1¡A©Ò¥H Scale ¬O 00¡F¯Á¤Þ¼È¦s¾¹¬O RAX¡A©Ò¥H Index ¬° 000¡F®Ú¾Ú¡A±oª¾ Base ¬° 101¡Cµ²¦X°_¨Ó SIB ¬O 00 000 101¡A´«ºâ¦¨¤Q¤»¶i¦ì¬O 05¡C
  6. Displacement¡G°¾²¾¦ì§}¬O±q°Ï¬q°_©l¦ì§}¶}©lºâ°_¦h¤Ö­Ó¦ì¤¸²Õ¡A¥i¥H¥Î OFFSET array ­pºâ±o¨ì¡C
  7. Immediate¡G¥ß§Y­È¬° 9abc¡A«ö·Ó¤p§ÇºÝ±Æ¦C¬° BC 9A¡C
  8. µ²¦X«e­z 1.¡ã7. ±oª¾ MOV WORD PTR array[rax*1],9abch ¾÷±ñ½X¬O 66 C7 04 05 XX BC 9A¡A¨ä¤¤ XX ¬OÂù¦r²Õ¼Æ­È¡C

¹ê§@ mova

»¡§¹¤F mova ªº­ì²z¤§«á¡AÁÙ¶·¹ê§@ÅçÃÒ¤~¬O¤ý¹D¡Cmova ¥¨¶°«Üªø¡A¥]§t mova ¤Þ¥Îªº¥¨¶°¡A±µªñ¤­¦Ê¦æ¡A©Ò¥H¤£¦C¥Xµ{¦¡½X¡A½Ð¨ì³o¨à¤U¸ü¡A¨ä¬[ºc¤j­P¹³¥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±¡§Î¡C­n§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

get_reg ¥¨¶°

¤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

§PÂ_ÄÝ©ó¥Ò¡B¤AÁÙ¬O¤þ±¡§Î

Àˬ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²z¥Ò±¡§Î

¦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¤è¦¡

adjust ¥¨¶°

³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«á»¡©ú¡^

operandoutput
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´À¡A­nª`·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¬O­n³B²z¤W­z¤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

adjust ¥¨¶°
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

¥Í¦¨¾÷±ñ½X

¦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

³B²z¤A±¡§Î

°²¦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

³B²z¤þ±¡§Î

³Ñ¤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¬O­pºâ [¡B]¡B*¡Ï ¦b arg1 ¤¤ªº¦ì¸m¡A¤À§O°O¿ý¦b l_squbra¡Br_squbra¡Basterisk¡Bplus1 ÅܼÆùØ¡C

±µ¤U¨Ó´N¥i¥H­pºâ¾÷±ñ½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³o­nÂ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¨¥µ{¦¡¤¤¡A­n¤Þ¥Î 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§Ñ¤F­n¤U¹F¡u/largeaddressaware:no¡v¿ï¶µ¡C¦pªG¤£¥Î³o¨â¦æ¡A´N­n±Ä¥Î²Ä¤Q¤»³¹Åܳqªº¤èªk¡C