Lan*_*ard 3 x86 assembly machine-code
在查看x86操作码映射时,例如:
http://www.mlsite.net/8086/#tbl_map1
它定义了映射,例如:
00: ADD Eb,Gb
01: ADD Ev,Gv
...
Run Code Online (Sandbox Code Playgroud)
该链接具有字母含义的基本描述,例如:
- E:操作码后面有一个ModR/M字节并指定操作数.操作数是通用寄存器或存储器地址.如果它是存储器地址,则从段寄存器和以下任何值计算地址:基址寄存器,索引寄存器,位移.
- b:字节参数.
但它有点太模糊了.你如何将其转化为"完整的操作码"(操作码中的整个指令+ args)?还没有能够从英特尔手册中找到它,也许我在寻找错误的地方(而且有点压倒性的)?看到显示输入指令的输出操作码的片段(以及你是如何做到的)将是非常有用的.
Jes*_*ter 10
无论如何,请使用intel手册.对于每条指令,它给出机器代码,第2章对指令格式有非常详细的描述.
但是为了给你一个演练,让我们看看ADD EDX, [EBX+ECX*4+15h].首先,我们阅读章节2 INSTRUCTION FORMAT并 3.1 INTERPRETING THE INSTRUCTION REFERENCE PAGES了解我们将看到的内容.我们对列出的缩写特别感兴趣3.1.1.3 Instruction Column in the Opcode Summary Table.
有了这些信息,我们转向描述该ADD指令的页面,并尝试为我们想要编码的那个确定一个合适的版本.我们的第一个操作数是一个32位寄存器,第二个是32位内存位置,所以让我们看看它匹配的是什么.这将是倒数第二行:03 /r ADD r32, r/m32.我们回到章节3.1.1.1 Opcode Column in the Instruction Summary Table (Instructions without VEX prefix)看看那个神奇/r的东西:Indicates that the ModR/M byte of the instruction contains a register operand and an r/m operand.
好的,所以Figure 2-1. Intel 64 and IA-32 Architectures Instruction Format向我们展示了指令的外观.到目前为止,我们知道我们将不会有任何前缀和操作码03,我们将使用至少一个modr/m字节.那么我们来看看如何解决这个问题.看看Table 2-2. 32-Bit Addressing Forms with the ModR/M Byte.列表示寄存器操作数,行表示内存操作数.由于我们的注册是EDX我们使用第3列.内存操作数[EBX+ECX*4+15h]可以使用8位或32位位移进行编码.为了获得更短的代码,我们将使用8位版本,因此[--][--]+disp8适用该行.这意味着我们的modr/m字节将是54.
我们也需要一个SIB字节.这些都列在Table 2-3. 32-Bit Addressing Forms with the SIB Byte.因为我们的基础是EBX使用第4列,并且为其[ECX*4]提供了我们的SIB字节的行8B.
最后我们添加了8位位移字节,即15.因此,完整的指令03 54 8B 15.我们可以使用汇编程序验证这一点:
2 00000000 03548B15 add edx, [ebx+ecx*4+15h]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1320 次 |
| 最近记录: |