【问题标题】:What does this instruction do in assembly?这条指令在汇编中做了什么?
【发布时间】:2016-02-16 19:59:03
【问题描述】:

所以我不知道这条指令是做什么的,因为我刚开始组装。
这条指令有什么作用?

 cmp byte ptr [edi],00 add [eax],al

【问题讨论】:

  • 这实际上是 2 个单独的指令。不确定它是否只是您格式化它的方式。但它们应该在 2 条单独的线上。 cmp byte ptr [edi],00 是一条指令 add [eax],al 是另一条指令。第一个假设 EDI 寄存器中的值是指向内存的指针。 cmp byte ptr [edi],00 然后将 EDI 指向的内存位置的字节与值零进行比较。
  • add [eax],al 假定 EAX 中有一个内存地址。将 8 位寄存器 AL 中的值添加到 EAX 寄存器指向的字节。虽然这是合法的,但从实际的角度来看,这样做并没有多大意义。
  • 你真的应该找到一些关于 MASM 汇编器的 32 位代码(这似乎是)的好教程;或一本好书;如果这是为了学校,甚至可以与助教交谈。
  • add [eax], al 也是你反汇编零时得到的。它可能是真实的代码,但当你看到它时要小心
  • @harold :正如我所说的“实际用途”。如果我在生成的代码中看到它,我可能会进行调查以确保它是合法的。

标签: assembly x86


【解决方案1】:

事实上,这是两个独立的指令:

cmp byte ptr [edi],00 
add [eax],al

第一个指向edi寄存器指向的内存地址,并从该地址获取第一个字节,然后将其与00=0进行比较。


第二条指令通过覆盖所有标志而不依赖它们来丢弃第一条指令的结果。

它将al(8位寄存器)的内容移动到EAX指向的内存位置,但是由于aleax的最低字节,就像我们复制最低字节一样eax 指向的地址指向该地址指向的内存位置(我认为这是没有意义的)。

执行前:假设eax=0x00405060

--------------------
Address    |  Content (1byte)
--------------------
0x00405060 | 00

执行后:eax=0x00405060(不变)

--------------------
Address    |  Content (1byte)
--------------------
0x00405060 | 60

如果您在指令执行后注意到,我们已将地址的最低字节 (60) 复制到该地址指向的内存位置。

【讨论】:

  • 第一条指令根本不与eax 交互。您仍然不应该将您的 0x00405060 示例地址列为字节比较的地址。
  • 我从来没有这样做过!! @PeterCordes
  • 您的格式非常混乱,带有巨大的粗体文本。我错过了你说你只是在谈论第二条指令的那一小段,而不是每条指令一个表。我重新格式化了你的答案,看起来更像你试图用降价做的事情。 (在代码块之外,--- 是一个 hrule,或者如果在其他内容正下方的一行上使用,则为标题字体大小。)我还冒昧地添加了一个段落来指出最重要的观察。无论如何,如果您愿意,请自行重新编辑以进行进一步改进。
猜你喜欢
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 2011-11-09
  • 2015-05-15
相关资源
最近更新 更多