локальное хранилище в стеке - PullRequest
0 голосов
/ 28 октября 2018

Я узнал, что в стеке есть несколько распространенных случаев локального хранения

case 1 : недостаточно регистров для хранения всех локальных данных

case 2 : оператор адреса '&' применяется к локальной переменной, и, следовательно, мы должны иметь возможность сгенерировать адрес для нее

case 3 :Некоторые из локальных переменных являются массивами структур и, следовательно, должны быть доступны по ссылке на массив или структуру.

В практической задаче есть некоторые коды

long call_proc()
{
 long x1=1; int x2= 2;
 short x3=3; char x4=4;
 proc(x1,&x1,x2,&x2,x3,&x3,x4,&x4);
 return (x1+x2)*(x3-x4);
}

<generated assembly code>

call_proc:
subq $32, %rsp
movq $1, 24(%rsp)
movl $2, 20(%rsp)
movw $3, 18(%rsp)
movb $4, 17(%rsp)
leaq 17(%rsp), %rax
movq %rax, 8(%rsp)
movl $4, (%rsp)
leaq 18(%rsp), %r9
movl $3, %r8d
leaq 20(%rsp), %rcx
movl $2, %edx
leaq 24(%rsp), %rsi
movl $1, %edi
call proc
.....

Q1.В этой практике, применяется ли case2, а не case1 в соответствии с такого рода делами?

Q2.Если это правильно case2, могу ли я получить несколько примеров о case1?

Q3.Предполагая, что этот код, я думаю, нет необходимости сохранять все локальные переменные в стеке, например, x1, x2, x3, x4.Разумно ли предположить?

1 Ответ

0 голосов
/ 28 октября 2018

Q1.Да, показанный пример - это случай 2.

Q2.Чтобы создать пример случая 1, просто создайте функцию с более чем 6 локальными переменными (для x86-64; для других архитектур потребуется другое число), где значения этих переменных должны быть сохранены при вызове другой функции.

Вот краткий пример, который я написал: https://godbolt.org/z/S8m0lG. В этом примере переменная n - это та, которую компилятор решил поместить в стек, потому что нет доступного регистрахранить его.Обратите внимание, что хотя это тривиальный пример, я позаботился о том, чтобы все переменные имели разные значения, чтобы компилятор их не комбинировал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...