不能在寻址模式下减去寄存器?

she*_*baw 2 x86 assembly inline-assembly addressing-mode

我读完了 PC 汇编语言,我正在研究汇编中 RC4 加密的实现。我无法理解的是为什么

mov eax, [edx+ecx]
Run Code Online (Sandbox Code Playgroud)

有效但

mov eax, [edx-ecx]
Run Code Online (Sandbox Code Playgroud)

没有。内联汇编器给了我这个错误信息,

“第二个操作数”中的非常量表达式

这意味着什么?提前致谢。

Joh*_*ger 7

有一个操作码:

mov eax, [edx+ecx]
Run Code Online (Sandbox Code Playgroud)

并且有一个操作码可以组合成:

mov eax, [edx-CONSTANT]
Run Code Online (Sandbox Code Playgroud)

因为汇编程序使用常规操作码但在汇编期间否定常量:

mov eax, [edx+(-CONSTANT)]
Run Code Online (Sandbox Code Playgroud)

但是,没有以下操作码:

mov eax, [edx-ecx]
Run Code Online (Sandbox Code Playgroud)

所以基本上你是在尝试执行一条不存在的指令。


NPE*_*NPE 5

下面给出了 x86 寻址模式的一个很好的总结。请注意,没有“注册减注册”形式:维基百科

作为一种解决方法,您可以否定ecxthen use的内容[edx+ecx](如果之后需要原始值,则可能必须将其否定)。