【问题标题】:Assembly cmp instruction that has 3 arguments具有 3 个参数的汇编 cmp 指令
【发布时间】:2014-11-27 17:35:59
【问题描述】:

我正在阅读一些汇编代码,试图弄清楚它在做什么(这是一个挑战,所以没有恶意)。 在一行中有以下指令:

cmp d,[eax],0DADADADA

我在 Google 上花了很长时间,但无法弄清楚这一点,我知道您无法比较 3 个值,所以我知道 0DA.... 部分是我所缺少的。我发现了一些我无法再次找到的文章,这表明这与填充空白内存有关,但不确定,我们将不胜感激。

【问题讨论】:

  • 这很可疑。 cmp 正好有 2 个输入操作数,它隐式地将状态标志设置为唯一的输出。另外,0DADADADA 看起来也很糟糕:前导零应该将其识别为八进制数,而数字显然是十六进制。
  • 前导零将其标识为数字;是否为八进制是汇编器定义的问题,这显然是一个十六进制常量。
  • @IraBaxter:嗯,通常十六进制文字以0x... 为前缀,而八进制文字则以零开头。这个问题可能与使用不同约定的汇编器有关,但没有提到确切的汇编器。
  • @EOF:“没有提到确切的汇编程序”。这就是重点。
  • @IraBaxter: ...在那种情况下,我会假设正常的约定,并提到这很奇怪。

标签: assembly


【解决方案1】:

你必须指定你正在使用的汇编语法; x86(很可能是这样)有很多品种,甚至还有其他品种。

不知道具体的语法,并且同意 CMP 指令没有 3 个操作数,我猜“d”的意思是“dword [32 位]”。所以我认为可能的解释是

   "compare  dword operand indirect through eax to hex literal 0DADADADA"

这是一条有效的 x86 指令。

【讨论】:

  • 也许在更远的地方有一个宏将d定义为DWORD
  • 恐怕我无法回答任何问题,因为我只是不知道。我们刚刚获得了一段 sn-p 代码(10 行),我们只是尝试弄清楚该部分在做什么。代码中没有定义 'd' 是什么。
  • 由谁提供?要求您了解明确定义的事物并且您正在学习此类定义的细节是一回事。让某人递给您一些东西而不明确其背后的定义,这完全是另一回事。我假设问的代理人是教授?要么他在现实世界中教你一课(当你没有获得足够的信息时,获得足够的信息是你的问题),或者他是一个非常糟糕的老师。如果不是,他是个无知的老板,欢迎来到现实世界。我会直截了当地问他是哪种汇编符号。
  • 是的,我想我会要求这个人给我更多信息。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-29
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
相关资源
最近更新 更多