这是我第一次来这里。
我读完了PC汇编语言,我正在使用Assembly中的RC4加密实现。我无法理解的是为什么
mov eax, [edx+ecx]
有效但
mov eax, [edx-ecx]
没有。内联汇编程序为我提供了此错误消息,
'second operand'中的非常量表达式
这是什么意思?提前谢谢。
答案 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)
你不能像这样减去偏移量。目的是您可以指向内存缓冲区的基础,然后添加偏移量。减法会导致你退出指定的内存缓冲区......