Encoding x86-什么';32位的SIB字节00 100 101组合有什么问题?

Encoding x86-什么';32位的SIB字节00 100 101组合有什么问题?,encoding,x86,instructions,Encoding,X86,Instructions,对于我的汇编程序,我想对操作moveax,[addr]进行编码。在64位中,这只可能使用SIB字节,因为mod r/m组合00 101已更改为指示rip相对寻址。我发现的问题是,在32位中,使用SIB字节编码此指令不起作用。例如,我有: 8B 84 25 1C FE 43 00 (mov) (10 000 100) (00 100 101) (address) 但反汇编程序似乎不接受它,我得到: mov eax,DWORD PTR

对于我的汇编程序,我想对操作
moveax,[addr]
进行编码。在64位中,这只可能使用SIB字节,因为mod r/m组合00 101已更改为指示rip相对寻址。我发现的问题是,在32位中,使用SIB字节编码此指令不起作用。例如,我有:

  8B           84           25     1C FE 43 00  
(mov) (10 000 100) (00 100 101)     (address)
但反汇编程序似乎不接受它,我得到:

mov eax,DWORD PTR [ebp+eiz*1+0x43fe1c]  (defuse.ca)
mov eax, ss:off_43FE1C[ebp]             (ida)

当指令被执行时,它会生成一个异常。我知道有32位的短编码,但不明白长编码有什么问题。

根据,在SIB
00 100 101
中显示的
100
索引是非法的。你实际上想创建什么指令?我不知道它们显示的信息的来源,但实际上使用100作为索引是表示没有索引寄存器的标准方式。英特尔针对该索引的手册上写着“无”,正常情况下(除了这个有问题的modrm/sib组合),它工作正常。是的,我确实注意到一些文档中的“无”,所以我想知道这种差异。因此,如果我读对了英特尔,指令应该是,有效地,
mov eax,[ebp+disp32]
,或者在你的例子中,字面上是,
mov eax,[ebp+0x43FE1C]
,听起来正确吗?是的,除了它不是:)这是因为基本字段101,通常意味着ebp,mod=00意味着没有基本字段。编码格式真的很复杂。哦!现在你让我看到我错误地把mod位放在10而不是00。纠正它只是工作!谢谢