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
-
kann dir nit viel zu asm sagen, aber .. wenn keiner was sacht, dann kann mein
comment nicht viel schlechter seinnasm besitzt ein struct-(?)befehl, mit dem etwa C-like structuren erzeugt werden
können. damit lässt sich "passend" speicher reservieren. ich bin mir nicht sicher
ob es auch eine art sizeof-operator für structs gab. allerdings müsste das dann
das struct natürlich in asm definiert sein, denn wie soll der asm-compiler wissen
wie groß eine C-Struktur ist.Als sizeof-Operator dient normal ein Code der direkt nach der Def/Decl. einer
Variable benutzt. Ich benutzt pseudo-code, weil der syntax mir entfallen ist:.myvar db 4
.myvarsize equ ($$-.myvar) ; oder so ähnlichEs wird direkt nach der Def/Decl so etwas gemacht wie ein Makro:
berechne (Adresse .myvar - HIER) .. und benutze den Wert irgendwie.oder war es ($$--.myvar) oder ...
najanach so etwas musst du Ausschau halten (wenigstens für nasm) um die
Größe einer Variabel/Struktur zu bestimmen und es geht nur dort wo sie
definiert/deklariert wurde. (ich weiss nicht ob man die Begriffe def/decl in
asm benutzen sollte, weil im Grunde nichts defniert wurde sondern nur gesagt
wird: reserviere mir n*Bytes und verknüpfe deren Adresse mit dem Name .mysymbolIch fürchte dieser Beitrag wird viele Widersprüche einheimsen aber besser weiss
ich es nicht zu sagen
-
@gorgoyle
Vielen Dank für deine Ausführungen!
Wie ist das nochmal mit dem Struct Befehl? ist das nicht ein MACRO? mit anderen Worten, wenn ich den Code anschliessend disassembliere, weiss er vermutlich nichts mehr davon?Wie kann ich denn anschliessend einen Speicherbereich aus einer Struktur definieren?
-
ich hab ehrlich keinen blassen wie man mit einen dissi umgeht bzw. wie der
resultierende code zu handhaben ist.ich denke die makro-vermutung ist richtig.
dass bedeutet, dass die erklaerte struktur an stelle des makro-aufrufes eingesetzt
wird. demnach wird im disassembelten code daher an jeweiliger stelle entsprechende
speicher-reservierungscodes stehen. eventuell wird für jede struktur eine
speicher-reservierungs-prozedur aufgerufen und du findest an orte der verwendung
nur einen proc-call.wenn nicht bleibt dir vermutlich nichts anderes ueber als von hand equivalente
structuren von hand zu suchen, diese als macro (structur?) zu definieren und
die jeweilige verwendung durch einen makro-aufruf zu ersetzen.aber du fragst einen blinden nach farben
ein unterschied zwischen struktur und makro ist folgender:
du kannst struktur-elemente per namen ansprechen - makros kennen derartiges nicht.ich demonstriere an nasme-(pseudo?)-code:
struct vector X db 4 ; 32bit Y db 4 ; 32bit Z db 4 ; 32bit end struct ; kenne den struct-syntax nicht! ... myvector vector ; speicher reservieren mov myvector.X 3 ; structur-elemente sind per name ansprechbar mov myvector.Y 5 ; mov myvector.Z 4 ;
der struct-syntax ist für masm anders als für nasm! RTFM
-
@gorgoyle
Vielen Dank für deine Ausführungen! Ich denke jedoch, ich werde dieses MACRO meiden!Wie ist das eigentlich, wenn ich lokale Variablen anlegen möchte. Wenn ich einfach ein neues Segment mache, dann ist anschliessend das Programm grösser! Was ich bräuchte, wär ein Segment, welches sich ausschliesslich im Arbeitsspeicher befinden wird, sobald das Programm gestartet wird. Wie mache ich denn das?
Lg Ishildur
-
In NASM kannst du mit "res(b/w/d) #num_o_data" einen uninitialisierten Speicherbereich reservieren. MASM hat dafuer AFAIR auch einfach ein "d(b/w/d) ?", bzw. "d(b/w/d) #num_o_data dup (?)". Dadurch wird dein Programm beim Erstellen nicht mit 0en aufgeblaeht.
Du solltest dabei nur ein paar Dinge beachten:
Wenn du uninitialisierte und initialisierte Daten in einem Segment mischst, muessen die uninitialisierten Daten immer hinter dem letzten initialisierten Datum stehen. Weiter darf es nur ein solches Mix-Segment geben, da der Assembler sonst wieder zum Auffuellen gezwungen ist.
Wenn die Reihenfolge der Segmente beachtet wird, muss das Mix-Segment als erstes hinter den Segmenten mit initialisierten Daten kommen, gefolgt von Segmenten mit uninitialisierten Daten (Stack, evtl. dein BackBuffer, usw.).