Beim Durchlauf von C-Code mit Inline-Assembly bin ich auf die .byte-Direktive (mit einem Punkt am Anfang) gestoßen.
Beim Überprüfen der Assemblyreferenz im Web habe ich festgestellt, dass damit ein Byte im Speicher reserviert wird.
Aber im Code gab es vor der Aussage kein Label. Also habe ich mich gefragt, was ist eine unbenannte .byte-Direktive oder eine andere Datenspeicher-Direktive für diese Angelegenheit.
Für z.B. Wenn ich .byte 0x0a
code, wie kann ich es verwenden?
Es gibt ein paar Möglichkeiten ... hier sind ein Paar, das mir aus dem Kopf geht:
Sie können auf eine Bezeichnung zugreifen, die nach der Direktive .byte
ist. Beispiel:
Basierend auf dem endgültigen verknüpften Layout des Programms werden die .byte
-Direktiven möglicherweise als Code ausgeführt. Normalerweise hätten Sie in diesem Fall auch ein Label ...
Einige Assembler unterstützen die Generierung von x86-Befehlspräfixen für die Operandengröße usw. nicht. In Code, der für diese Assembler geschrieben wurde, sehen Sie oft etwas wie:
%Vor%Damit der Assembler den gewünschten Code ausgibt.
Hier ist ein Beispiel mit Inline-Assembly:
%Vor% Sie können .byte 0xb8, 0x01, 0x00, 0x00, 0x00
durch mov , %%eax
ersetzen
Das Laufergebnis wird gleich sein. Dies deutet darauf hin, dass es sich um ein Byte handeln kann, das eine Instruktion darstellen kann, zB move oder andere.
.byte
spuckt Bytes aus, wo auch immer Sie sind. Ob es eine Bezeichnung gibt oder nicht auf das Byte zeigt, spielt keine Rolle.
Wenn Sie sich im Textsegment befinden, wird dieses Byte möglicherweise wie Code ausgeführt.
Carl hat es erwähnt, aber hier ist ein vollständiges Beispiel, um es weiter zu vertiefen: eine Linux x86_64-Implementierung von true
mit einem nop
geworfen:
erzeugt die gleiche ausführbare Datei wie:
%Vor% da nop
als das Byte 0x90
codiert ist.
Die .byte-Anweisung ist eine Direktive, mit der Sie ein konstantes Byte deklarieren können, das nur durch eine Inspektion ohne Kontext bekannt ist.
Aus dem GNU Assembler Guide:
%Vor%Tags und Links assembly inline-assembly