¿Cómo lidiar con los registros de alias en análisis de flujo de datos utilizando el formulario SSA? (Por ejemplo EAX / AX / AH / AL en x86)
-
01-10-2019 - |
Pregunta
Para exmaple:
¿Cómo representar la siguiente x86 en SSA forma :
xor eax, eax
inc ax
Mediante la introducción de algunas funciones seudo, I llegar a:
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)
Sin embargo, creo que es demasiado detallado
Solución
Uso de la notación:
- eax @ = 0 ... lo que era antes de que aquí ...
- eax @ 1 = 0
- ax @ 2 = ax @ 1 + 1
Debido eax contiene ax, hay un paso implícito en entre 2 y 3
- eax = 0 @ ...
- eax @ 1 = 0
- ax @ 1 = 0 (porque hacha no puede ser distinto de cero si eax es cero)
- ax @ 2 = ax @ 1 + 1
Paso 2 ya que cualquier número xor'ed consigo misma es de 0 ... 0 eax @ está muerto en ese momento, y por lo tanto eax @ 1 puede cambiar el nombre (usando EBX como el cambio de nombre por lo que es legible, obviamente, se utilizaría un virtuales registro, no uno de verdad):
- --- eliminado, eax ya no es relevante
- ebx @ 0 = 0
- bx @ 0 = 0
- bx @ 1 = bx @ 0 + 1
A continuación, podría en cuenta que debido a que el paso 3 es una función constante, por lo que es la etapa 4 (la adición de una constante para una constante) y comprimir los dos juntos (es decir, constante de plegado)
- - borrado, ya no es relevante eax
- ebx @ 0 = 0
- bx @ 0 = 1
Si los 16 bits superiores de EBX no dominan por debajo de esta nada, que también podría borrar el paso 2.