2013-10-06 5 views
0

Я все еще изучаю сборку и C, но теперь я пытаюсь понять, как работает компилятор. У меня здесь есть простой код:Отладка программы C (int declaration)

int sub() 
{ 
    return 0xBEEF; 
} 
main() 
{ 
    int a=10; 
    sub(); 
} 

Теперь я знаю уже, как работает процессор, прыжки в рамки и подпрограммами и т.д. Что я не понимаю, где программа «магазин» их локальные переменные. В этом случае в главном кадре?

Здесь основной кадр на отладчик:

0x080483f6 <+0>:  push %ebp 
    0x080483f7 <+1>:  mov %esp,%ebp 
    0x080483f9 <+3>:  sub $0x10,%esp 
=> 0x080483fc <+6>:  movl $0xa,-0x4(%ebp) 
    0x08048403 <+13>: call 0x80483ec <sub> 
    0x08048408 <+18>: leave 
    0x08048409 <+19>: ret 

я в "Int А = 10;" точка перерыва, поэтому смещение 6 имеет стрелку. Таким образом, функция главного начинается, как и другие толкая EBP-бла-бла-бла, и тогда я не понимаю:

0x080483f9 <+3>:  sub $0x10,%esp 
=> 0x080483fc <+6>:  movl $0xa,-0x4(%ebp) 

почему делает суб в особ? - переменная 'a' в стеке со смещением -0x4 указателя стека?

просто очистить идеи здесь: D

Спасибо заранее!

+0

Просто из любопытства вы используете gcc? Если да, то какая версия? – BlackBear

+0

gcc версия 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1) – int3

ответ

2
0x080483f9 <+3>:  sub $0x10,%esp 

Вы найдете такую ​​инструкцию в каждой функции. Его цель - создать фрейм стека соответствующего размера, чтобы функция могла хранить своих локалей (помните, что стек растет назад!).
В этом случае рама стека слишком велика. Это связано с тем, что gcc (начиная с 2.96) складывает кадры стека до 16-байтных границ по умолчанию для учета инструкций SSEx, которые требуют, чтобы упакованные 128-битные векторы были выровнены с 16 байтами. (ссылка here).

=> 0x080483fc <+6>:  movl $0xa,-0x4(%ebp) 

Эта строка инициализирует правильное значение (0xa = 10d). Локали всегда упоминаются со смещением относительно ebp, который отмечает начало фрейма стека (который поэтому включен между ebp и esp).

+0

'0x10' -' 16' в десятичной системе. Итак, почему инструкция 'sub' означает, что кадр стека имеет размер 4 байта? – us2012

+0

@ us2012: вы совершенно правы, я упустил это. И я просто сделал перерыв;) – BlackBear

+0

Гораздо лучше, +1 :) Если у вас есть объяснение * почему *, то стек кадра кажется большим, чем требуется, что было бы здорово. – us2012

Смежные вопросы