Ist mov% esi,% esi ein no-op oder nicht auf x86-64?

8

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?

    
Eugene 11.07.2011, 17:38
quelle

2 Antworten

16
%Vor%

setzt die hohen 32 Bits von% rsi auf Null und ist daher auf x86_64 kein No-Op.

    
Stephen Canon 11.07.2011, 18:10
quelle
6
%Vor%

Dies ergibt "reg_rsi = 0x12345678" für meine x86_64 Maschine.

    
Ilya Matveychikov 12.07.2011 11:02
quelle

Tags und Links