在Assembly中注册算术

时间:2011-04-01 12:42:17

标签: assembly inline-assembly

这是我第一次来这里。

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

mov eax, [edx+ecx]

有效但

mov eax, [edx-ecx]

没有。内联汇编程序为我提供了此错误消息,

  

'second operand'中的非常量表达式

这是什么意思?提前谢谢。

3 个答案:

答案 0 :(得分:4)

有一个操作码:

mov eax, [edx+ecx]

并且有一个可以从以下组装的操作码:

mov eax, [edx-CONSTANT]

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

mov eax, [edx+(-CONSTANT)]

但是没有以下操作码:

mov eax, [edx-ecx]

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

答案 1 :(得分:3)

以下给出了x86寻址模式的一个很好的总结。请注意,没有“寄存器减去寄存器”形式:Wikipedia

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

答案 2 :(得分:0)

你不能像这样减去偏移量。目的是您可以指向内存缓冲区的基础,然后添加偏移量。减法会导致你退出指定的内存缓冲区......

相关问题