¿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)

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

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

¿Fue útil?

Solución

Uso de la notación:

  1. eax @ = 0 ... lo que era antes de que aquí ...
  2. eax @ 1 = 0
  3. ax @ 2 = ax @ 1 + 1

Debido eax contiene ax, hay un paso implícito en entre 2 y 3

  1. eax = 0 @ ...
  2. eax @ 1 = 0
  3. ax @ 1 = 0 (porque hacha no puede ser distinto de cero si eax es cero)
  4. 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):

  1. --- eliminado, eax ya no es relevante
  2. ebx @ 0 = 0
  3. bx @ 0 = 0
  4. 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)

  1. - borrado, ya no es relevante eax
  2. ebx @ 0 = 0
  3. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top