كيفية التعامل مع سجلات الاسم المستعار في تحليل تدفق البيانات باستخدام نموذج SSA؟ (مثل EAX/AX/AH/AL في x86)

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

سؤال

ل exmaple:

كيفية تمثيل 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. eax@0 = ... مهما كان من قبل هنا ...
  2. eax@1 = 0
  3. الفأس@2 = الفأس@1 + 1

لأن EAX تحتوي على AX ، هناك خطوة ضمنية بين 2 و 3

  1. eax@0 = ...
  2. eax@1 = 0
  3. AX@1 = 0 (لأن الفأس لا يمكن أن يكون غير صفري إذا كان EAX صفرًا)
  4. الفأس@2 = الفأس@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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top