Warum fügt Delphi nop's in die Mitte von Nirgendwo ein?

8

Der folgende Code:

%Vor%

Erzeugt die folgende Assembly:

%Vor%

Delphi fügt ein NOP vor der nhashtab[h]:= p; -Zeile ein. Wenn die Funktion leaf_hash eine normale Funktion gewesen wäre, hätte sie Sinn ergeben.
(nein, nicht wirklich, weil der RET immer noch zu [5D4645] zurückkehren würde, wenn der nop ausgeführt wird)
Aber jetzt ist das kein Sprungziel.

Also bin ich (nur) neugierig, warum macht es das?

[EDIT]: SSCCE
OK Ich habe ein SSCCE (es ist nicht sehr kurz, aber es muss reichen.)

Beachten Sie die Compilereinstellungen (Debug + Win64)

%Vor%

Sie werden diese Demontage sehen:

%Vor%     
Johan 27.09.2013, 01:41
quelle

3 Antworten

5
___ answer19043132 ___

Es ist eine Optimierung zum Ausrichten von Code, insbesondere in Schleifen, um Cache-Blockierungen und dergleichen zu vermeiden.

    
___ antwort19210936 ___

Die Antwort ist das

%Vor%

Ist kein No-Op

Bei der x64-Manipulation der unteren 32 Bits eines 64-Bit-Registers werden die oberen 32 Bits auf Null gesetzt.
Also sollte die obige Anweisung wirklich wie folgt gelesen werden:

%Vor%

Laut AMD

  

Ergebnisse von 32-Bit-Operationen werden implizit auf 64-Bit-Werte erweitert.

    
___ answer19043786 ___

IMHO das ist kein %code% für Alignement, aber es klingt für mich wie unoptimierter generierter Code und falsches Signieren Ihrer eigenen Variablen.

%Vor%

Kann aufgeteilt werden in:

%Vor%

Haben Sie versucht, die Codegenerierungsoptimierung zu aktivieren? Ich denke, es wird den Inhalt von %code% beheben.

Aber Ihr ursprünglicher Code ist auch suboptimiert. Sie sollten in Ihrem Fall vorzeichenlose Arithmetik verwenden.

Und Sie sollten besser eine Potenz von zwei %code% verwenden, die eine einfache %code% binäre Operation anstelle einer langsamen Division berechnen:

%Vor%

Dieser Code wird viel schneller sein und sollte viel besser kompilieren.

    
___ tag123delphi ___ Delphi ist eine Sprache für die schnelle Entwicklung von nativen Windows-, macOS-, Linux-, iOS- und Android-Anwendungen mithilfe von Object Pascal. Der Name bezieht sich sowohl auf die Delphi-Sprache als auch auf deren Bibliotheken, Compiler und IDE, mit denen Delphi-Projekte bearbeitet und debuggt werden können. ___ tag123delphixe2 ___ Delphi XE2 ist eine spezielle Version von Delphi. Delphi XE2 wurde am 1. September 2011 veröffentlicht und ist als eigenständiges Produkt oder als Teil von RAD Studio XE2 verfügbar. ___ tag123assembly ___ Assemblersprache (asm) Programmierfragen. Achten Sie darauf, auch mit dem Prozessor und / oder Befehlssatz, die Sie verwenden, sowie den Assembler TAG. WARNUNG: Verwenden Sie für .NET-Assemblies stattdessen das Tag [.net-assembly]. Verwenden Sie für Java ASM stattdessen das Tag [java-bytecode-asm]. ___ qstnhdr ___ Warum fügt Delphi nop's in die Mitte von Nirgendwo ein? ___ qstntxt ___

Der folgende Code:

%Vor%

Erzeugt die folgende Assembly:

%Vor%

Delphi fügt ein NOP vor der %code% -Zeile ein. Wenn die Funktion %code% eine normale Funktion gewesen wäre, hätte sie Sinn ergeben.
(nein, nicht wirklich, weil der RET immer noch zu [5D4645] zurückkehren würde, wenn der nop ausgeführt wird)
Aber jetzt ist das kein Sprungziel.

Also bin ich (nur) neugierig, warum macht es das?

[EDIT]: SSCCE
OK Ich habe ein SSCCE (es ist nicht sehr kurz, aber es muss reichen.)

Beachten Sie die Compilereinstellungen (Debug + Win64)

%Vor%

Sie werden diese Demontage sehen:

%Vor%     
___
Johan 06.10.2013, 16:09
quelle
4

IMHO das ist kein nop für Alignement, aber es klingt für mich wie unoptimierter generierter Code und falsches Signieren Ihrer eigenen Variablen.

%Vor%

Kann aufgeteilt werden in:

%Vor%

Haben Sie versucht, die Codegenerierungsoptimierung zu aktivieren? Ich denke, es wird den Inhalt von mov eax,eax beheben.

Aber Ihr ursprünglicher Code ist auch suboptimiert. Sie sollten in Ihrem Fall vorzeichenlose Arithmetik verwenden.

Und Sie sollten besser eine Potenz von zwei nhashprime verwenden, die eine einfache and binäre Operation anstelle einer langsamen Division berechnen:

%Vor%

Dieser Code wird viel schneller sein und sollte viel besser kompilieren.

    
Arnaud Bouchez 27.09.2013 06:08
quelle
0

Es ist eine Optimierung zum Ausrichten von Code, insbesondere in Schleifen, um Cache-Blockierungen und dergleichen zu vermeiden.

    
Remy Lebeau 27.09.2013 05:09
quelle

Tags und Links