【问题标题】:Can't subtract registers in an addressing mode?不能在寻址模式下减去寄存器?
【发布时间】:2011-04-01 12:42:17
【问题描述】:

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

mov eax, [edx+ecx]

有效但

mov eax, [edx-ecx]

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

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

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

【问题讨论】:

    标签: assembly x86 inline-assembly addressing-mode


    【解决方案1】:

    有一个操作码:

    mov eax, [edx+ecx]
    

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

    mov eax, [edx-CONSTANT]
    

    因为汇编器使用常规操作码,但在​​汇编期间否定常量:

    mov eax, [edx+(-CONSTANT)]
    

    但是没有操作码:

    mov eax, [edx-ecx]
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 或:mov eax,edx;子 eax,ecx,mov eax,[eax]。这为您节省了额外的否定
      【解决方案3】:

      你不能像那样减去偏移量。目的是您可以指向内存缓冲区的底部,然后在其中添加一个偏移量。减法会导致您退出指定的内存缓冲区...

      【讨论】:

        猜你喜欢
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 2017-01-03
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多