Asembler x86/Funkcje/GNU AS: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
→‎Język C: rozwinięcie
Linia 86:
</source>
Jako że do funkcji przekazaliśmy argumenty o łącznej wielkości 3 bajtów, po wywołaniu funkcji zwalniamy zajęte miejsce przesuwając szczyt stosu.
=====Struktura funkcji=====
Funkcje zakodowane w C mają stałą procedurę działania:
* zachowanie na stosie wartości rejestru EBP i nadanie mu nowej wartości
* zachowanie na stosie wartości rejestrów z których będzie korzystać nasza funkcja w czasie wykonania
* wykonanie właściwego kodu funkcji
* zdjęcie ze stosu wcześniej zapisanych rejestrów
* zdjęcie ze stosu rejestru EBP
Pisząc włąsne funkcje w asemblerze możliwe do wywołania z użyciem języka C nie musimy stosować się do powyższego schematu. Jedyne nasze ograniczenie to otrzymywanie argumentów poprzez stos w opisanej wyżej kolejności, jednak jeśli w toku naszej funkcji zmianie ulegną jakieś rejestry bez odzyskania ich wartości początkowej może to doprowadzić do nieprawidłowego działania programu.
====Konwencja szybkiego wywołania====
Konwencja szybkiego wywołania, tak jak sama nazwa wskazuje, jest wyjątkiem, gdyż przyjmuje argumenty poprzez rejestry procesora ECX-EDX. W przeciwieństwie do zwykłej konwencji __cdecl robi to w kolejności zgodnej z własnym zapisem, tzn. od początku do końca. Dodatkowo nie jesteśmy zmuszeni do zwalniania miejsca stosu zajętego przez przekazane argumenty, za to musimy ilość bajtów podać za nazwą funkcji po znaku @, zaś na początku musimy dodać @. Oto przykład:
Linia 97 ⟶ 105:
</source>
Jako że do funkcji przekazaliśmy argumenty o łącznej wielkości 3 bajtów, na końcu nazwy funkcji dopisujemy @3, zaś na początku samo @.
=====Struktura funkcji=====
* wykonanie kodu funkcji
<noinclude>{{Nawigacja|Asembler X86|
[[Asembler X86/Funkcje|Funkcje]]|