【发布时间】:2014-06-13 13:47:33
【问题描述】:
我正试图掌握汇编,但有一件可能非常简单的事情我不明白。
考虑下面这个简单的例子
long long * values = new long long[2];
values[0] = 10;
values[1] = 20;
int j = -1;
values[j+2] = 15; // xxxxxxx
现在,最后一行(标有 xxxxxx)反汇编为:
000A6604 mov eax,dword ptr [j]
000A6607 mov ecx,dword ptr [values]
000A660A mov dword ptr [ecx+eax*8+10h],0Fh
第一个问题:eax 和 ecx 中实际存储的内容是实际值(即“j”为 -1,“values”为两个 long long 值 10 和 20),还是仅仅是内存指向存储值的某个位置的地址(例如,像 &p、&values 之类的东西)?
第二个问题,我知道第三行应该做什么,但我不太确定为什么这真的有效。 所以我的理解是,它将值 0x0F 复制到指定的内存位置。内存位置基本上是 - 存储在 ecx 中的第一个元素的位置 - 加上 long long 字节的大小 (= 8) * eax 的值(等于 j,所以 -1) - 加上 16 字节的通用偏移量(大小为 long long 的 2 倍)。 我不明白的是:在这个表达式中, ecx 似乎是一个内存地址,而 eax 似乎是一个值(-1)。这怎么可能?看到它们的定义方式几乎相同,难道 eax 和 ecx 不应该都包含内存地址,或者两者都包含值吗?
谢谢。
【问题讨论】:
-
内存地址和值都只是位。唯一的区别在于这些位代表什么。
-
关于第一个问题:它分别加载了
j和values的值。values的值反过来是一块内存的地址。编写mov ecx, OFFSET values之类的内容就像在 C 中获取指针的地址,它会为您提供指向指针的指针。 -
请注意,
j和values在您的 C 代码中也有不同的类型。 -
啊,当然,这是有道理的。 j = -1,但值 = 内存地址。我将值与 *values 混淆了。好的,我想这可以解释这两个问题,非常感谢!