1

我是一个组装初学者,所以我的问题的答案对你们大多数人来说可能是完全显而易见的,但对我来说不是。请不要责备。

在 64 位系统上,此 C 代码:

 1| int main ()
 2| {
 3| char ary[230];
 4| ary[0] = 2;
 5| return 0;
 6| }

产生这个汇编代码:

 7| push rbp
 8| mov rbp, rsp
 9| sub rsp, 120
10| mov BYTE PTR [rbp-240], 2
11| mov eax, 0
12| leave
13| ret

我希望堆栈指针至少保留 230 个字节(可能更多),以便可以将“ary”(第 3 行)存储在其中。但在第 9 行,堆栈指针仅递减 120 个字节。这会在基指针 rbp 和 [rbp-120] 之间产生一个 120 字节的缓冲区。这对于“ary”(230 字节)来说太小了。从第 10 行可以看出,ary-index '0' 存储在 [rbp-240] 处,它在基指针下方 240 字节处,因此在缓冲区下方 120 字节处,缓冲区在 [rbp- 120]。所以看起来好像'ary'的一部分存储在缓冲区之外。

当然不是编译器感到困惑,但我很困惑。所以我的问题是:我在这里误解了什么?也许在第 9 行它不是 120 字节,而是 120 * WORD(120 * 2 字节 = 240 字节,适合什么)?这意味着我们在这里混合了一个字节数(第 10 行)和一个字数(第 9 行)。那么我的问题是,如果一个数字是字节数、字数、双字数……,我怎么能在汇编中看到?当然,在第 10 行它被指定为 'BYTE',但是第 9 行呢?

谢谢你的回答!

4

0 回答 0