Ich bin etwas verwirrt über den Kommentar in einer der Header-Dateien für den Linux-Kernel, arch / x86 / include / asm / nops.h . Es besagt, dass
& lt; ... & gt; Die folgenden Anweisungen sind NICHT Nops im 64-Bit-Modus, für den 64-Bit-Modus verwenden Sie stattdessen K8- oder P6-Nops movl% esi,% esi
leal 0x00 (% esi),% esi
& lt; ... & gt;
Ich nehme an, der Autor hat dort die Maschinenanweisungen ('89 F6 'und' 8D 76 00 ') anstelle von Montageanweisungen impliziert. Aus der Beschreibung von LEA
im Intel Software Developer's Manual Vol 2A folgt, dass die letztere Anweisung ( lea 0x00(%rsi), %esi
) dasselbe tut wie die erstere, mov %esi,%esi
.
Das reduziert sich also auf die Frage, ob mov %esi,%esi
tatsächlich ein No-Op auf x86-64 ist.
mov
ändert die Flags nicht. Diese Art von mov
ändert auch nicht den Speicher. Es scheint, wenn es etwas anderes als %rip
ändert, sollten dies allgemeine Register sein. Aber ich habe keine Ahnung, wie es den Inhalt von %rsi
oder was auch immer ändern kann. Wenn Sie die untere Hälfte eines allgemeinen Registers manipulieren, sollte sich die obere Hälfte nicht ändern, richtig?
setzt die hohen 32 Bits von% rsi auf Null und ist daher auf x86_64 kein No-Op.
Dies ergibt "reg_rsi = 0x12345678" für meine x86_64 Maschine.
Tags und Links assembly x86-64 linux-kernel