【问题标题】:why the word[label+num] changes the eax?为什么 word[label+num] 会改变 eax?
【发布时间】:2012-09-20 10:29:44
【问题描述】:
section .data
fun:
   add word[L+2],0x203
L: mov eax,0x1020304 ; this instruction including operand stored in 5 byte in memory
   ret

“有趣”的功能是做什么的?为什么eax会有一个新值0x1040604

【问题讨论】:

  • .data 部分的代码在做什么?
  • 没有给出,只是这个...问题是什么有趣的返回(返回值在eax中)
  • 不,我不明白。它不应该改变价值。 0203 应该完全写入已经存在的常量中的 0203。无论如何,0x1040604 是不可能的——04 和 06 是从哪里来的?他们无处可寻。
  • 我认为因为在 L 中有 5 个字节在内存中,所以必须将 2 个字节的 word[L+2] 添加到 203.... 但是什么是 [L+2]确切地?所以 2+2 和 3+3 是 4 和 6 但我不明白
  • 我认为假设函数以 eax 值返回,所以我认为答案应该在 mov eax 1020304.... 行之前,但我得到 2030 + 203 即 4033 而不是 4060

标签: assembly nasm


【解决方案1】:

好的,你有一个mov eax, 0x1020304,有一个 5 字节的编码(也有一个 6 字节的编码,但我们忽略它)。所以它看起来像这样(记住 - little endian):

B8 04 03 02 01

其中 L 指的是 B8,L+2 指的是 03。现在,如果您将 0x0203 添加到它(记住 - little endian),03 将添加到 03 并且 02 将添加到 02,所以您得到这个:

B8 04 06 04 01

这是:

mov eax, 0x01040604

【讨论】:

  • 但在小印度我有一个堆栈包括 [40,30,20,10] 而不是 [04,03,02,01] ..?
  • @aseed no.. 最后的零是从哪里来的?
  • [04,30,20,10] 为什么要颠倒数字
  • 您不能将半个字节压入堆栈。 0x1 与 0x01 相同
  • @aseed 不是真的。该常数缺少初始零。如果您仔细计算,您会发现它只有 7 个十六进制字符。额外的零在开头而不是结尾(这会改变值)。
猜你喜欢
  • 2016-05-29
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多