Я очень плохо знаком с языком ассемблера. Я изучаю это уже 2 недели.
Вот дамп, сгенерированный objdump. objdump -Mintel -d stack
00000560 <function>:
560: 55 push ebp
561: 89 e5 mov ebp,esp
563: 83 ec 10 sub esp,0x10
566: e8 26 00 00 00 call 591 <__x86.get_pc_thunk.ax>
56b: 05 95 1a 00 00 add eax,0x1a95
570: 90 nop
571: c9 leave
572: c3 ret
00000573 <main>:
573: 55 push ebp
574: 89 e5 mov ebp,esp
576: e8 16 00 00 00 call 591 <__x86.get_pc_thunk.ax>
57b: 05 85 1a 00 00 add eax,0x1a85
580: 6a 03 push 0x3
582: 6a 02 push 0x2
584: 6a 01 push 0x1
586: e8 d5 ff ff ff call 560 <function>
58b: 83 c4 0c add esp,0xc
58e: 90 nop
58f: c9 leave
590: c3 ret
Я сейчас учусь в стеке. Я не уверен, что пролог применим только к функциям. Я не вижу sub
в третьей строке основной функции. Не уверен, что пролог всегда использует этот шаблон.
Я также запутался в <__x86.get_pc_thunk.ax>
Не уверен, что это такое.
Мне также интересно, почему он добавляет 0x1a95 к eax, и я не уверен, почему он выбрал это число. В основном значение, которое было добавлено к eax, было 0x1a85.
Вот c, который я скомпилировал с gcc. Я использовал gcc -m32 -ggdb stack.c -o stack
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
void main() {
function(1, 2,3 );
}
Теперь я пытаюсь найти buffer1 и buffer2 в разобранном коде. Buffer1 [5], я думаю, будет 0x05, а buffer2 [10] будет 0x0a. Я не могу найти его в разобранном коде.