Comment gérer les registres d'alias dans l'analyse de flux de données en utilisant le formulaire SSA? (Par exemple EAX / AX / AH / AL dans x86)
-
01-10-2019 - |
Question
Pour exmaple:
Comment représenter les éléments suivants x86 SSA forme :
xor eax, eax
inc ax
En introduisant des fonctions pseudo, je viens avec:
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)
Mais je pense qu'il est trop bavard
La solution
En utilisant votre notation:
- eax @ 0 = ... quelque chose comme ça avant ici ...
- eax @ 1 = 0
- hache @ 2 = ax @ 1 + 1
Parce que eax contient hache, il y a une étape implicite entre 2 et 3
- eax @ 0 = ...
- eax @ 1 = 0
- hache @ 1 = 0 (parce que la hache ne peut pas être non nulle si EAX est égal à zéro)
- hache @ 2 = ax @ 1 + 1
Étape 2 parce que tout numéro avec lui-même est un OU Exclusif 0 ... EAX @ 0 est mort à ce moment-là, et donc EAX @ 1 peuvent être renommés (en utilisant EBX comme renommant il est lisible, vous évidemment utiliser un virtuel registre, pas un vrai):
- --- supprimé, EAX ne sont plus pertinentes
- EBX @ 0 = 0
- bx @ 0 = 0
- bx @ 1 = bx @ 0 + 1
On pourrait alors noter que, parce que l'étape 3 est une fonction constante, est donc l'étape 4 (en ajoutant une constante à une constante) et de comprimer les deux ensemble (à savoir pliage constante)
- - supprimé, EAX ne sont plus pertinentes
- EBX @ 0 = 0
- bx @ 0 = 1
Si les 16 bits supérieurs de EBX tout pour ne pas dominer en dessous, vous pouvez aussi l'étape de suppression 2.