Es unmöglich, ein C-Variable in Assembler zu erstellen: der C-Compiler hat etwa die Größe (dh seine Art und Adresse), zu wissen, was bedeutet, dass es in dem C-Code angegeben werden muss.
Es kann auf in Assembler über extern
Deklarationen in C definierte Symbole zugegriffen werden. Dies funktioniert jedoch nicht bei Variablen mit automatischer Speicherdauer, da diese keine feste Adresse haben, sondern relativ zur Basis referenziert sind Zeiger.
Wenn Sie nicht auf die Variablen außerhalb des Blocks asm
zugreifen möchten, können Sie den Stack zum Speichern von lokalen Assembler-Daten verwenden. Denken Sie daran, dass Sie den Stapelzeiger auf den vorherigen Wert wiederherzustellen, wenn die asm
Block verlassen, zB
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
Wenn Sie nicht die relativen Adressen der lokalen Variablen ändern möchten, wenn Sie den Stapel manipulieren (dh push
oder pop
), Sie müssen einen Stack-Frame erstellen (dh die Basis des Stacks in ebp
speichern und Locals relativ zu diesem Wert adressieren), wie in cedrou's answer beschrieben.
Sind Sie sicher, esp sub, wird 3 Raum gibt für drei 32-Bit-vars? Ich hatte die Idee, dass ich für jede 32-Bit-Var-Variante vier von vier nehmen müsste. –
Zumindest C++ definiert es intern wie folgt: var_4 = dword ptr -4 –
du hast Recht - solltest du diese Fragen spät nachts nicht beantworten;) – Christoph