刚刚试了下,AMD的指令手册要怎么找。
AMD的全部X86和X86-64的编程手册在这里下载:
http://developer.amd.com/documentation/guides/Pages/default.aspx#manuals
说下用AMD手册为mov [ebp - 4],0xAABBCCDD指令查找机器码的步骤:
我们需要的是它手册的卷3:《
General Purpose and System Instructions》
先在卷三找到第三章《General-Purpose Instruction Reference》,
可以看到mov reg/mem32 , imm32 的格式是 C7 /0 id,也就是操作码是C7,后面跟一个Mod R/M字节,再后面跟一个双字。
那我们还是继续去找Mod R/M字节的格式:
它的Mod R/M的内容在1.4,《ModRM and SIB Byte》的1.4.3小节,《Operand Addressing in Legacy 32-bit and Compatibility Modes》
不像Intel手册有个方便的但是看起来有点恐怖的表,AMD手册这里,C7 45的这个45h是需要自己算出来的。
看到表1-13,《Operand Addressing Using ModRM and SIB Bytes》的开头:
看到,[rBP] + disp8对应的是Mod值01,R/M值101,这些都是2进制表示的值。
注意这里的disp8指的是相对rBP指示的地址的8位偏移,而不是指令用到的立即数。
而rBP指的是bp,ebp,rbp(64位模式下扩展到64位的ebp寄存器)这几个寄存器的统称。
刚刚Mod R/M字节里面,/digit的digit值是0(16进制;在二进制中是000),再考虑到这里查的是Mod值是01,R/M值是101,
合起来就是01
000101,也就是1 + 4 + 64 = 69(dec) = 45(hex)
其中,中间的红色部分是/digit值,占3比特,前面是Mod码占2比特,后面是R/M码,占3比特。
这样,通过查找AMD手册也得到,mov [ebp - 4],0xAABBCCDD的机器码就是C7 45 FC DD CC BB AA