Как работать с регистрами псевдонимов при анализе потоков данных с использованием формы SSA?(например, EAX / AX / AH / AL в x86) - PullRequest
2 голосов
/ 23 апреля 2010

Например:

Как представить следующий x86 в форме SSA :

xor  eax, eax
inc  ax

Представляя некоторые псевдо-функции, я придумываю:

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)

Но я думаю, что это слишком многословно

1 Ответ

2 голосов
/ 09 июля 2010

Используя вашу запись:

  1. eax @ 0 = ... что бы здесь ни было ...
  2. eax @ 1 = 0
  3. ax @2 = ax @ 1 + 1

Поскольку eax содержит ax, существует неявный шаг между 2 и 3

  1. eax @ 0 = ...
  2. eax @ 1 = 0
  3. ax @ 1 = 0 (потому что ax не может быть ненулевым, если eax равно нулю)
  4. ax @ 2 = ax @ 1 + 1

Шаг 2, потому что любое число с xor'ed само по себе равно 0 ... eax @ 0 мертво в этой точке, и, следовательно, eax @ 1 можно переименовать (используя ebx в качестве переименования, чтобы его можно было прочитать;виртуальный регистр, а не реальный):

  1. --- удален, eax больше не актуален
  2. ebx @ 0 = 0
  3. bx @ 0 = 0
  4. bx @ 1 = bx @ 0 + 1

Затем можно заметить, что поскольку шаг 3 является постоянной функцией, то же касается шага 4 (добавление константы к константе) исжимать их вместе (т.е. постоянное свертывание)

  1. - удалено, eax больше не актуально
  2. ebx @ 0 = 0
  3. bx @ 0 = 1

Если старшие 16 битов ebx ничего не доминируют, вы можете также удалить шаг 2.

...