汇编:我不明白为什么堆栈指针似乎(!)在这里保留了不足的内存

时间:2019-02-03 15:12:05

标签: assembly stack x86-64 stack-pointer red-zone

我是组装的初学者,所以对大多数人来说,对我的问题的答案可能是显而易见的,但对我而言却不是。请不要怪。

在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索引'0'存储在[rbp-240],它比基址指针低240个字节,因此位于缓冲区下120字节,该字节在[rbp- 120]。因此,似乎“ ary”的一部分存储在缓冲区之外。

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

谢谢您的回答!

0 个答案:

没有答案