Einige kleine Anfängerfragen
-
Hallo zusammen
Frage 1:
--------
Nehmen wir einmal an, wir hätten folgenden Code:unsigned char sz = 6; __asm{ mov eax,dword ptr sz }
dann steht im eax Register anschliessend cccccc06! Ich könnte nun natürlich
__asm{ mov eax,00h mov eax,dword ptr sz }
schreiben, aber ich frage mich, ob es da nicht noch eine andere Möglichkeit gibt?
2. Frage:
---------
Wenn ich folgendes mache:__asm{ mov eax,[sz] }
wieso steht dann anschliessend immer noch cccccc06 imm eax register! Sollte da nun nicht die Adresse drinn stehen?
3. Frage:
---------
Wieso lässt sich folgendes compilieren:unsigned char sz[4][3] = {6}; __asm{ mov eax,sz }
und folgendes nid? (operand size conflict)
unsigned char sz[4][2] = {6}; __asm{ mov eax,sz }
Frage 4:
--------
Gibt es in assembler so etwas wie den sizeof operator in c?Mfg Ishildur
-
Ishildur schrieb:
Hallo zusammen
Frage 1:
--------
Nehmen wir einmal an, wir hätten folgenden Code:unsigned char sz = 6; __asm{ mov eax,dword ptr sz }
dann steht im eax Register anschliessend cccccc06!
Zufall - oder Debug Modus. Je nach Optimierung kann da alles mögliche drin stehen. Der Compiler ist völlig frei, wie er Variablen anordnet.
Ich könnte nun natürlich
__asm{ mov eax,00h mov eax,dword ptr sz }
schreiben, aber ich frage mich, ob es da nicht noch eine andere Möglichkeit gibt?
Das ändert überhaupt nichts, da der zweite mov-Befehl in jedem Fall das gesamte Register verändert.
was du wahrscheinlich möchtest ist dieses:__asm movzx eax,sz
Ein i686-kompatibler Prozessor (PPro/P2/K6) wird dafür benötigt (C3 macht da Probleme).
2. Frage:
---------
Wenn ich folgendes mache:__asm{ mov eax,[sz] }
wieso steht dann anschliessend immer noch cccccc06 imm eax register! Sollte da nun nicht die Adresse drinn stehen?
Die eckige Klammer steht für einen Adressoperanden - das ist sz aber von sich aus schon, die zusätzlichen Klammern werden daher einfach ignoriert. Du könntest auch
__asm{ mov eax,[[[[sz]]]] }
schreiben, der Befehl bleibt der Gleiche. Das ist beim Intelassembler traditionell so - bei nasm ist es anders (und wenn der Rest bei nasm brauchbar wäre, könnte ich mich sogar damit anfreunden...). Um an die Adresse relativ zum Segmentanfang zu gelangen, wird der offset Operator benötig:
__asm{ mov eax, offset ptr sz }
offset nimmt irgendeinen Adressoperanden und liefert dessen Offset - das geht nat. nur, wenn dieses Offset konstant ist, der Operand also auf eine statische Variable verweist. Hast du es mit automatischen Variablen zu tun, dann verbirgt sich hinter sz bereits eine Stackframebasierte Adresse und keine Konstante - hier ist lea nützlich
__asm { lea eax, sz }
lea benutzt einen Adressoperanden, liest aber nicht den Inhalt an dieser Adresse, sondern berecht sie nur und weist sie zu. Das funktioniert dann unabhängig davon, ob sz statisch ist, oder nicht.
Frage 4:
--------
Gibt es in assembler so etwas wie den sizeof operator in c?versuch mal mit size ptr
Die 3. Frage beantworte ich, wenn ich es ausprobiert habe.