Wie mit Alias-Register in Datenfluss-Analyse unter Verwendung von SSA Form umgehen? (Beispielsweise EAX / AX / AH / AL in x86)

StackOverflow https://stackoverflow.com/questions/2697172

Frage

Für exmaple:

Wie stellen die folgenden x86 in SSA Form :

xor  eax, eax
inc  ax

Durch einige Pseudo-Funktionen einzuführen, ich komme mit:

eax@1 = eax@0 ^ eax@0
ax@1 = LOWORD(eax@1)
al@1 = LOBYTE(ax@1)
ah@1 = HIBYTE(ax@1)
hax@1 = HIWORD(eax@1)

ax@2 = ax@1 + 1
eax@2 = MAKEDWORD(ax@2, HIWORD(eax@1))
al@2 = LOBYTE(ax@2)
ah@2 = HIBYTE(ax@2)

Aber ich denke, es ist zu viel ausführliche

War es hilfreich?

Lösung

Verwenden Sie Ihre Schreibweise:

  1. EAX @ 0 = ... was auch immer es schon mal hier war ...
  2. EAX @ 1 = 0
  3. Axt @ 2 = ax @ 1 + 1

Weil eax ax enthält, gibt es einen impliziten Schritt zwischen 2 und 3

  1. EAX @ 0 = ...
  2. EAX @ 1 = 0
  3. ax @ 1 = 0 (weil ax nicht ungleich Null sein kann, wenn EAX null)
  4. Axt @ 2 = ax @ 1 + 1

Schritt 2, weil jede Zahl mit sich selbst EXOR'ed 0 ... EAX @ 0 ist an dieser Stelle tot, und damit EAX @ 1 umbenannt werden kann (unter Verwendung von ebx als Umbenennung so ist es lesbar, natürlich würden Sie einen virtuellen verwenden Register, keine echte):

  1. --- gelöscht, EAX nicht mehr relevant
  2. ebx @ 0 = 0
  3. bx @ 0 = 0
  4. bx @ 1 = bx @ 0 + 1

Sie könnten dann beachten, dass, weil Schritt 3 eine konstante Funktion ist, so ist Schritt 4 (Hinzufügen einer Konstanten zu einer Konstante) und die beiden zusammenzudrücken (d.h. Konstantenfaltung)

  1. - gelöscht, EAX nicht mehr relevant
  2. ebx @ 0 = 0
  3. bx @ 0 = 1

Wenn die oberen 16 Bits von ebx nicht dominieren etwas darunter, man könnte auch löschen Schritt 2.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top