【问题标题】:"inc ecx" Instruction operands must be the same size?"inc ecx" 指令操作数的大小必须相同吗?
【发布时间】:2013-06-30 01:54:14
【问题描述】:

我正在尝试在 MASM 中编写一个小程序。在一行中,当我尝试增加 ECX 时,我得到了这个错误......这似乎没有任何意义,因为只有一个操作数!

以下是相关代码:

mov ecx, eax
lea eax, DWORD PTR [ecx]
lea ecx, BYTE PTR [eax+4]
inc ecx

一开始,EAX只是一个字符串的长度,在这个0x05。

那么,有人知道为什么会这样吗?谢谢!

【问题讨论】:

  • 为什么你的第二行是 LEA 而不是简单的 MOV?
  • 好吧,我正在做一个crackme,只是从它的算法中复制了指令。我刚开始学习汇编,还不太清楚 MOV 和 LEA 之间的区别。
  • 认为MOVx = y 的C 等价物,而LEAx = &y(注意它获得y地址,不是y)的)

标签: assembly masm32


【解决方案1】:

您实际上可以将最后两行(您给出的)替换为:

lea ecx, BYTE PTR [eax+5]

LEA 获取操作数的地址,因此对于BYTE PTR [eax+4],这将是值eax+4,存储在ecx 中。由于之后是递增的,因此您可以将两个加法合二为一,因此您可以改用BYTE PTR [eax+5]

【讨论】:

  • 好吧,显然我的 masm32 出了问题。我删除了那行,现在它给了我同样的错误 - 在一个空行上!
  • 某处可能存在杂散的 Unicode 字符。尝试重新输入这几行,看看是否能解决问题。
【解决方案2】:

BYTE PTR 在这种情况下没有什么意义,并且可以安全地删除(尽管它不会对我造成任何错误)。 LEA 计算有效地址,也可用于执行一些通用算术。

sn-p 的代码是这样的:

ecx = eax
eax = ecx
ecx = eax + 4
ecx++

可以用一条指令代替:

lea ecx,[eax+5]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多