Сборка: я не понимаю, почему указатель стека кажется (!) резервировать здесь недостаточно памяти
Я новичок в сборке, поэтому ответ на мой вопрос вполне очевиден для большинства из вас, но не для меня. Пожалуйста, не вините.
На 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 байт. В результате получается буфер размером 120 байт между базовым указателем rbp и [rbp-120]. Это слишком мало для 'ary' (230 байт). И как видно из строки 10, ary-index '0' хранится в [rbp-240], что на 240 байт ниже базовой точки, поэтому на 120 байт ниже буфера, который заканчивается (точнее начинается) в [rbp- 120]. Таким образом, кажется, что часть 'ary' хранится вне буфера.
Конечно, не смущает компилятор, но я. Итак, мой вопрос: что я здесь неправильно понимаю? Может быть, в строке 9 это не 120 байт, а 120 * СЛОВО (120 * 2 байта = 240 байт, что подойдет)? Это означало бы, что у нас есть смесь байтового числа (строка 10) и WORD-числа (строка 9). Тогда мой вопрос будет, как я могу увидеть в сборке, если число представляет собой номер байта, номер WORD, номер DWORD...? Конечно, в строке 10 он указан как "BYTE", но как насчет строки 9?
Спасибо за ответ!