To niemożliwe, aby utworzyć zmienną C w asemblerze: kompilator C musi wiedzieć o zmiennej (czyli jego typ i adres), co oznacza, że musi być zadeklarowane w kodzie C.
Co można zrobić, to uzyskać dostęp do symboli zdefiniowanych w asemblerze poprzez deklaracje extern
w C. To nie zadziała dla zmiennych z automatycznym czasem przechowywania, ponieważ nie mają one stałego adresu, ale są odnoszone do bazy wskaźnik.
Jeśli nie chcesz uzyskać dostępu do zmiennych poza blokiem asm
, możesz użyć stosu do przechowywania danych lokalnych dla asemblera. Wystarczy pamiętać, że trzeba przywrócić wskaźnik stosu do jej poprzedniej wartości po opuszczeniu bloku asm
, np
sub esp, 12 ; space for 3 asm-local 32bit vars
mov [esp-8], 42 ; set value of local var
[...]
push 0xdeadbeaf ; use stack
[...] ; !!! 42 resides now in [esp-12] !!!
add esp, 16 ; restore esp
Jeśli nie chcesz względne adresy zmiennych lokalnych zmienić w dowolnym momencie manipulować stosu (tzn. użyj push
lub pop
), musisz ustalić ramkę stosu (tj. zapisać podstawę stosu w ebp
i adresować locale względem tej wartości), jak opisano w cedrou's answer.
jesteś pewna sub esp, 3 da przestrzeń do 3 32bit vars? Miałem pomysł, że dla każdego 32-bitowego var będę musiał wziąć 4 z esp. –
Przynajmniej C++ wewnętrznie definiuje to tak: var_4 = dword ptr -4 –
masz rację - nie odpowiadaj na pytania tak późno w nocy;) – Christoph