адрес массива, когда помещается в стек - PullRequest
2 голосов
/ 11 октября 2010

Я написал простую функцию c:

void function(){
    int n;
    char s[6];
    n = 1;
    s[0] = 2;
    s[5] = 3;
}

Это разбирается на:

pushl %ebp
movl %esp, %ebp
sub $40, %esp
movl $1, -12(%esp)
movb $2, -40(%esp)
movb $3, -35($esp)
leave
ret

Я пытаюсь понять, почему char [] дан адрес, который начинается с -40.

это 6-байтовый массив, поэтому я думаю, что для этого потребуется 8 байт (кратных 4-байтовому слову), и в этом случае он будет назначен адресу памяти -20 (% esp)

Почему -40 (% esp)?

Спасибо

РЕДАКТИРОВАТЬ: Я также предполагаю, что n дается смещение -12 (% esp), потому чтоint и регистры имеют длину 4 байта, а значение eip увеличивается до -4 (% esp), а значение ebp устанавливается до -8 (% esp).Это правильно?

Заранее спасибо !!

1 Ответ

1 голос
/ 11 октября 2010

Должно быть movl $ 1, -12 (% ebp ) и т. Д.

s [] является буфером, поэтому компилятор может выделить дополнительное пространство для проверок безопасности (но естьникаких проверок).

Существует следующая схема:

esp+44: ebp+04: return address
esp+40: ebp+00: prev ebp value
.......
esp+12: ebp-12: n
.......
esp+04: esp-3C: s[4:6]
esp+00: ebp-40: s[0:4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...