2013-04-12 5 views
0

Я пытаюсь изучить x86 AT & T синтаксис и я в месте, где я кулачок немного смущен вообще. Я понимаю, что в стеке есть фреймы, и когда выполняется вызов, первое, что происходит в этой функции, - это какое-то обновление фреймов, а затем получение параметров. Итак, если у меня есть какое-то значение типа 5 в регистре eax в моей основной области кода и функции вызова, у меня все еще есть доступ к значению 5 в eax правильно? Или, чтобы получить его как параметр, мне нужно сделать что-то подобное. Я видел где-то еще, что вы переместили свои аргументы в стек перед вызовом функции, это правда? Я предполагаю, что что-то должно быть расположено в 8 (ebp) для меня, чтобы переместить его в eax, но какова ценность eax, прежде чем я что-то переделаю с помощью movl? Это 5? Я знаю, что это много вопросов, я просто смущен в момент вызова функции и возвращения чего-то. Любая помощь будет принята с благодарностью. Я уверен, что это как кусок пирога для некоторых гуру собрания!Вызов нескольких функций в x86

Function: 
pushl %ebp 
movl %esp, %ebp 

movl 8(ebp), eax 
+0

Кто-то должен знать правильный способ вызова функции с аргументами в x86! – Tastybrownies

ответ

1

This страница должна в основном обернуть это.

С Cdecl вы идете как

; I'm not comfortable with AT&T syntax, but it's not relevant here 

; void *processData(void *firstParam, void *secondParam) 
proc processData 
    push ebp 
    mov ebp,esp 

    mov eax,[dword ptr ss:ebp + 8] ; firstParam 
    mov edx,[dword ptr ss:ebp + 12] ; secondParam 

    ; do something with the data and put the result into EAX 

    mov esp,ebp 
    pop ebp 
    ret 
endp processData 

вы вызываете его как

lea eax,[ds:bufferOfSecondParam] 
push eax 
lea eax,[ds:bufferOfFirstParam] 
push eax 
call processData 
add esp,8 

; Here you can do with the return value anything you want 

Прежде всего, вы должны принять решение о конвенции вызывающему использования. Например, Win32 использует вариант cdecl под названием stdcall, где вызывающая сторона отвечает за очистку стека - это не слишком удобно реализовать и не позволяет использовать varargs.

[SS: EBP + 8] указывает на первый аргумент, потому что

  • Аргументы передаются в стек справа налево ([СС: EBP + 12] точки ко второй Arg)
  • DWORDs 4 байта
  • [SS: EBP + 0] указывает на предыдущий EBP сохраненного при создании кадра стека
  • [SS: EBP + 4] указывает на обратный адрес reaad в EIP Upon RET
Смежные вопросы