Wie kopieren Sie den Wert an eine bestimmte Adresse im Speicher zu einem register, in gcc AT&T-Stil
Möchte ich kopieren Sie den Wert an eine bestimmte Adresse im Speicher zu einem register, mit AT&T-Stil-Montage. Ich weiß, das sollte nicht zu schwierig sein, und ich denke, im Intel-Stil, es ist etwas wie:
mov rdi, [0xdeadbeef]
Aber ich weiß nicht viel über die AT&T-Stil (oder Montage im Allgemeinen). Ich suchte über Sie, aber alle Beispiele über mov
, dass ich mich nicht enthalten diese.
Also kann mir jemand sagen, wie dieser Unterricht aussieht?
Auch, wo finde ich eine vollständige Liste der x86_64-Montage-Anweisungen in der AT&T-Stil?
- Hexadezimal starten mit einem null -
0
, nichto
werden, und es sollte ein Komma zwischen den Parametern - danke, habe ich korrigiert den Fehler.
- Fragen, für eine Liste ist off-topic hier, aber hier ist es: gibt es eine komplette x86-Assembler Referenz, verwendet AT&T-syntax?
- AT&T bedeutet nur, legen Sie die Operanden in umgekehrter Reihenfolge. Es gibt mehr zu der Versammlung Sprachen als assembler, das tool liest es bestimmt die Sprache, die syntax. und die x86-Assemblern eine Menge von inkompatiblen Syntax mit x86 vs AT&T wird eine kleine Teilmenge von diesem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kopieren Sie den Wert an eine bestimmte Adresse im Speicher zu einem register in 32-bit-Modus wir verwenden
In AT&T alle Literale, die nicht mit dem Präfix
$
ist eine AdresseAber in x86_64 64-bit-absolute Adressierung ist nicht erlaubt, so dass Sie nicht verwenden können
movq 0xdeadbeef, %rdi
wie oben. Die einzige Anweisung, die 64-bit-sofortige istmov
(movabs
im gas), das zuweisen einer 64-bit-Konstante zu jedem Register, oder bewegen Sie Wert auf ein 64-bit absolute Adresse auf AregWenn Sie wirklich brauchen, um zu bewegen, den Wert von einem 64-bit absolute Adresse in einem register unterscheidet sich von Areg müssen Sie verwenden Sie die indirekte Adressierung statt
oder wenn Sie möchten, dass der Wert kopiert werden, um beide rax und Fei dann
Hier die
q
suffix bedeutet quadword (64-bit) RegisterWeitere Informationen über 64-bit -
mov
Anleitung hier: Unterschied zwischen movq und movabsq in x86-64. Wie Sie sehen können gibt es keine version für den Wechsel von einer 32-bit absolute Adresse, um eine 64-bit-register, so auch in seltenen Fällen, wenn die Adresse passt in 32 bit wie 0xdeadbeef, die Sie noch haben, zu nutzenmovabs Areg, moffs64
mov [0xdeadbeef], rdi
aufgehoben werden würde in AT&T-syntax, wie ich oben schriebmov rdi, [0xdeadbeef]
, diemovq 0xdeadbeef, %rdi
im AT&Tmov $5, %rdi
2.mov $0xdeadbeef, %rdi
3.mov 0xdeadbeef, %rdi
.Die erste Bewegung ist der Wert 5 Fei, die zweite und die Dritte, die bewegt sich der Wert an der Adresse, die bewegt sich die Adresse 0xdeadbeef??? Ich dachte, die zweite bewegte sich der Wert, weil der$
Zeichen...suffix or operands invalid for 'mov'
also ich muss unchoose es als die Antwort...mov ecx, [10]
odermovl 10, %ecx
mov [0xdeadbeef], rdi
war die reg -> memmov %rdi, 0xdeadbeef
ist ein Geschäft.