我是组装的初学者,所以对大多数人来说,对我的问题的答案可能是显而易见的,但对我而言却不是。请不要怪。
在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行呢?
谢谢您的回答!