Come comportarsi con i registri alias in analisi dei dati a flusso utilizzando modulo SSA? (Ad esempio EAX / AX / AH / AL in x86)
-
01-10-2019 - |
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
Soluzione
Utilizzo di notazione:
- eax @ 0 = ... qualunque cosa che era prima qui ...
- eax @ 1 = 0
- ax @ 2 = ax @ 1 + 1
A causa EAX contiene ascia, c'è un passo implicita tra il 2 e 3
- eax @ 0 = ...
- eax @ 1 = 0
- ax @ 1 = 0 (perché ax non può essere diverso da zero se eax è zero)
- 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):
- --- cancellato, EAX non è più rilevante
- EBX @ 0 = 0
- BX @ 0 = 0
- 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)
- - cancellato, EAX non è più rilevante
- EBX @ 0 = 0
- BX @ 0 = 1
Se i 16 bit superiori EBX non dominano nulla di sotto di questo, si potrebbe anche cancellare il passaggio 2.