lea vs mov



  • Ich kompiliere mit Yasm und ld (MinGW) via

    yasm -f win32 -g dwarf2 hello.asm -l hello.lst

    Dann linke ich mit

    ld -g hello.obj

    und als letztes starte ich den Debugger

    gdb a

    und guck mir die Register mit info registers an

    Meine Frage:

    Warum muss man, wenn ich die Adresse will mit lea [] und das byte keyword verwenden, wenn ich 'ne byte Variable definiert habe?

    global _main
    section .data
    a db 42
    section .text
    lea eax, byte [a]
    ret
    

    Hier muss ich a mit [a] dereferenzieren und dann muss ich noch mit byte angeben, dass es ein byte ausspucken soll.

    Wenn ich 'ne Adresse mit mov lade, dann ist das ziemlich intuitiv

    mov eax, a

    laedt die Adresse von a in eax
    Hier wird nix dereferenziert mit [].

    Warum brauche ich bei lea byte und [] und bei mov nicht?
    Was hat lea für ein Pronlem?


  • |  Mod

    der explizite byte override in byte [a] ist nicht erfordelich.
    in yasm ist a ein Symbol für eine Adresse, wärend [a] einen Speicherverweis darstellt, also das Objekt meint, auf dass a zeigt.
    In C-Begriffen quasi ein Zeiger bzw. ein lvalue.
    move kopiert das Argument, lea liefert die effektive Adresse eines Speicherverweises, Letzteres ist also so etwas wie der &-Operator in C.