В настоящее время я изучаю язык ассемблера x86 (я в начале курса), и у меня возникают некоторые проблемы с пониманием работы стека в одном конкретном случае.
Допустим, у меня есть этокод:
double(entier n) { return n + n; }
Я пытался преобразовать его в код x86, и я получил следующее:
push ebp #save old pointer stack
mov ebp, esp #put new pointer stack
mov ebx, dword[ebp + 8] #get argument n and put it in ebx
add ebx, dword[ebp + 8] #add n to ebx
Но потом я был полностью заблокирован и не мог найти, каквернуть значение ebx
.Я нашел решение в Интернете, которое было следующим:
mov [ebp + 12], ebx
pop ebp
ret
pop ebp
ret
Я не понимаю, как это работает.Разве ebp+12
не является значением второго аргумента?(В моем случае его нет).Pop используется для перемещения указателя esp
, но зачем нам в этом случае 2 pop и 2 return?Это только для удаления значения, которое использовалось во время объявления функции?