كيفية التعامل مع سجلات الاسم المستعار في تحليل تدفق البيانات باستخدام نموذج SSA؟ (مثل EAX/AX/AH/AL في x86)
-
01-10-2019 - |
سؤال
ل 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)
لكني أعتقد أنه مطول كبير
المحلول
باستخدام تدوينك:
- eax@0 = ... مهما كان من قبل هنا ...
- eax@1 = 0
- الفأس@2 = الفأس@1 + 1
لأن EAX تحتوي على AX ، هناك خطوة ضمنية بين 2 و 3
- eax@0 = ...
- eax@1 = 0
- AX@1 = 0 (لأن الفأس لا يمكن أن يكون غير صفري إذا كان EAX صفرًا)
- الفأس@2 = الفأس@1 + 1
الخطوة 2 لأن أي رقم xor'ed مع نفسه هو 0 ... eax@0 ميت في تلك المرحلة ، وبالتالي يمكن إعادة تسمية eax@1 (باستخدام EBX كإعادة تسمية بحيث يكون قابلاً للقراءة ؛ من الواضح أنك ستستخدم سجلًا افتراضيًا ، وليس وحيدون):
- --- تم حذفه ، لم يعد EAX ذا صلة
- ebx@0 = 0
- bx@0 = 0
- bx@1 = bx@0 + 1
يمكنك بعد ذلك ملاحظة أنه نظرًا لأن الخطوة 3 هي وظيفة ثابتة ، لذلك هي الخطوة 4 (إضافة ثابت إلى ثابت) وضغط الاثنين معًا (أي طي ثابت)
- - تم حذفه ، لم يعد EAX ذا صلة
- ebx@0 = 0
- bx@0 = 1
إذا لم تسيطر 16 بت من EBX على أي شيء أسفل هذا ، فيمكنك أيضًا حذف الخطوة 2.
لا تنتمي إلى StackOverflow