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 sein 🙂

    nasm 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 ähnlich

    Es wird direkt nach der Def/Decl so etwas gemacht wie ein Makro:
    berechne (Adresse .myvar - HIER) .. und benutze den Wert irgendwie.

    oder war es ($$-)oder() oder (-.myvar) oder ...
    naja 🙂 nach 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 .mysymbol

    Ich 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.).


Anmelden zum Antworten