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?
-
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.