Источник C Код:
int main()
{
int i;
for(i=0, i < 10; i++)
{
printf("Hello World!\n");
}
}
Дамп кода ассемблера Intel x86 для функции main
:
1. 0x000055555555463a <+0>: push rbp
2. 0x000055555555463b <+1>: mov rbp,rsp
3. 0x000055555555463e <+4>: sub rsp,0x10
4. 0x0000555555554642 <+8>: mov DWORD PTR [rbp-0x4],0x0
5. 0x0000555555554649 <+15>: jmp 0x55555555465b <main+33>
6. 0x000055555555464b <+17>: lea rdi,[rip+0xa2] # 0x5555555546f4
7. 0x0000555555554652 <+24>: call 0x555555554510 <puts@plt>
8. 0x0000555555554657 <+29>: add DWORD PTR [rbp-0x4],0x1
9. 0x000055555555465b <+33>: cmp DWORD PTR [rbp-0x4],0x9
10. 0x000055555555465f <+37>: jle 0x55555555464b <main+17>
11. 0x0000555555554661 <+39>: mov eax,0x0
12. 0x0000555555554666 <+44>: leave
13. 0x0000555555554667 <+45>: ret
Я сейчас работаю через "Взлом, The «Искусство эксплуатации 2-е издание Джона Эриксона», и я только начинаю заниматься сборкой.
У меня есть несколько вопросов о переводе предоставленного C кода в Assembly, но я в основном задаюсь вопросом о своем первом вопросе.
1-й вопрос: Какова цель строки 6? (lea rdi,[rip+0xa2]
).
Моя текущая рабочая теория заключается в том, что это используется для сохранения того, куда будут переходить следующие инструкции, чтобы отследить, что происходит. Я считаю, что эта строка соотносится с функцией printf
в исходном коде C.
По сути, он загружает эффективный адрес rip+0xa2
(0x5555555546f4
) в регистр rdi
, чтобы просто отследить, куда он перейдет для функции printf
?
2-й вопрос: какова цель строки 11? (mov eax,0x0
?) Я не вижу предварительного использования регистра, EAX
и не уверен, почему его нужно установить на 0.