我不明白为什么我收到一条非法指令,其中一段代码在 C 程序中作为汇编实现。我稍微解释一下。
我在特定地址有一个值,我想将该值移动到 EAX x86 寄存器中,例如
MOV EAX, [address]
在 C 代码中,我有指向该地址的指针。我以这种方式准备了这条指令的二进制代码:
MOV OpCode:
7 6 5 4 3 2 1 0
|_|_|_|_|_|_|D|S|
D = 1 --> I want REG as destination
S = 1 --> 32 bit operand
D S
--> |1|0|0|0|1|0|1|1| --> 0x89
Mod R/M:
7 6 5 4 3 2 1 0
|_|_|_|_|_|_|_|_|
--> MOD = |7|6| bits
--> REG = |5|4|3| bits
--> R/M = |2|1|0| bits
MOD = Indirect --> |0|0|
REG = EAX = 0 --> |0|0|0|
地址不在寄存器中,我想将内存数据移动到 EAX 寄存器。我有内存位置的值,所以:
R/M = |1|1|0| --> direct
--> |0|0|0|0|0|1|1|0| --> 0x06
Address = [byte0] [byte1] [byte2] [byte3]
--> 0x8b 0x06 [byte3] [byte2] [byte1] [byte0] 0xc3
通过这种方式,我获得了非法指令,但我不明白为什么。如果我使用 R/M = 101 我得到 0x8b 0x05 [byte3] [byte2] [byte1] [byte0] 0xc3 并且一切正常。
那么,问题出在哪里?有人可以从这张表中解释 MOD=00, R/M=110 的用法吗?直接???
MOD=00, R/M=101 有效,但在表中我看到从 DI 计算的内存位置,但我有一个直接的内存位置......
注意:使用 -m32 gcc 开关在 Ubuntu 20.04(64 位)上编译的代码