Was bedeutet movl $_start, %eax bedeuten?
Was bedeutet"$", gefolgt von einem Bezeichner bedeuten?
x86 assembly, AT&T-syntax.
- Exakt diese Frage ist eine der übungen für die Programmierung aus dem Boden nach Oben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In AT&T-syntax
$
Mittel zu behandeln, was folgt, als eine unmittelbare Konstante statt einer Speicher-Adresse. In anderen Worten,lädt die Adresse des symbols
_start
in %eax;liest 4 bytes aus dem Speicher an die Adresse der
_start
in %eax. Wenn man sich die Demontage der beiden:können Sie sehen, dass der einzige Unterschied ist der opcode. Das handliche, wenn auch etwas selbst-servingly benannt, Die Intel® 64 und IA-32 Architectures Software Developer ' s Manual (Sie möchten volume 2, ist die instruction set reference) sagt, dass die opcodes B8 durch BF encode "load immediate 16/32-bit-Konstanten in register" (dies ist der code, bestimmt, geladen werden, in einem 32-bit-code-segment, also ist es ein 32-bit laden; für eine 16-bit-Last, Sie hätten ein "operand size override" - Präfix-byte, 66) und opcode A1 kodiert "load 32-bit-Menge bei der angegebenen 32-bit-offset von DS (oder einem anderen segment, mit dem entsprechenden Präfix-byte) in EAX." Mit dem typischen "flache" Speichermodell, das ist das moralische äquivalent der "Last 32-bit-Menge bei der angegebenen 32-bit absolute Adresse", aber Sie können sehen, wie x86 hat seinen Ruf als lächerlich komplizierte Maschine.
Falls Sie sich Wundern, das ist, was es Aussehen würde, wenn wir verwendet, EBX statt:
Load-immediate kann noch getan werden, mit einem ein-byte-Instruktion nicht eingerechnet wird der operand (es BB statt der B9, als Sie vielleicht erwarten, dass es, da die internen register, um ist AX, CX, DX, BX, SP, BP, SI, DI-im ernst), aber laden-aus-dem-absoluten-Adresse hat jetzt eine zwei-byte-Instruktion, 8B 1D; das zweite byte ist das, was Intel nennt eine "ModRM" byte, das gibt sowohl EBX und dass ein absoluter 4-byte-Adresse folgt.
In der Regel bedeutet es eine "unmittelbare" Wert, also eine Zahl, im Gegensatz zu einem anderen register Wert, etwas aus dem Speicher abgerufen, etc. Also, in diesem Fall, bewegt sich die Zahl mit dem symbol verknüpfte
_start
in das eax register.