Come comportarsi con i registri alias in analisi dei dati a flusso utilizzando modulo SSA? (Ad esempio EAX / AX / AH / AL in x86)

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

Domanda

Per exmaple:

Come rappresentare il seguente x86 in SSA modulo :

xor  eax, eax
inc  ax

Con l'introduzione di alcune funzioni pseudo, vengo con:

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)

Ma penso che sia troppo verbose

È stato utile?

Soluzione

Utilizzo di notazione:

  1. eax @ 0 = ... qualunque cosa che era prima qui ...
  2. eax @ 1 = 0
  3. ax @ 2 = ax @ 1 + 1

A causa EAX contiene ascia, c'è un passo implicita tra il 2 e 3

  1. eax @ 0 = ...
  2. eax @ 1 = 0
  3. ax @ 1 = 0 (perché ax non può essere diverso da zero se eax è zero)
  4. ax @ 2 = ax @ 1 + 1

Fase 2, perché ogni numero esservi effettuato lo XOR con se stessa è 0 ... eax @ 0 è morto in quel punto, e quindi EAX @ 1 possono essere rinominati (usando EBX come rinominare in modo che sia leggibile, ovviamente si usa un virtuale registro, non reale):

  1. --- cancellato, EAX non è più rilevante
  2. EBX @ 0 = 0
  3. BX @ 0 = 0
  4. BX @ 1 = bx @ 0 + 1

Si potrebbe allora notare che poiché il punto 3 è una funzione costante, quindi è il passo 4 (aggiunta di una costante ad una costante) e comprimere le proposte (cioè costante pieghevole)

  1. - cancellato, EAX non è più rilevante
  2. EBX @ 0 = 0
  3. BX @ 0 = 1

Se i 16 bit superiori EBX non dominano nulla di sotto di questo, si potrebbe anche cancellare il passaggio 2.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top