الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما هو بديل pusha/popa في x86_64 ؟

بدأه asm-soft في 29 يوليو 2011 · 4 رد · 1,102 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله وبركاتة

ممكن أعرف إيه البديل لـ pusha/popa في 64 بت بعيداً عن إنشاء الماكرو فقد اتبعت طريقة أخرى لأن حسب معرفتي أنهم لم يتم دعمهم و قد قمت بدفع جميع السجلات كل واحد على حدى هكذا

   push rax
   push rbx
   push rcx
   push rdx
   push rbp
   push rdi
   push rsi
   push r8
   push r9
   push r10
   push r11
   push r12
   push r13
   push r14
   push r15

نوع المعالج: AMD64 Athlon™ II X2

المترجم: NASM

شكراً

تم تعديل هذه المشاركة بواسطة asm-soft في 8 أغسطس 2011 في 15:35

forum-signature-01.gif
#2

لايوجد pusha/popa داخل 64bit، يمكنك استخدام الكود بالأعلي كبديل و لكني لا انصح به لأنه سيضعف الاداء، عوضا عن ذلك قم بحجز المساحه من الـ stack و استخدم mov لنسخ محتويات السجلات، بهذا تفصل بين تنفيذ التعليمات مما يتيح تنفيذ للمعالج تنفيذ اكثر من تعليمه فى نفس الوقت.

كود لـ pushaq

sub rsp, 120
mov [rsp    ], rax
mov [rsp+8h ], rbx
mov [rsp+10h], rcx
mov [rsp+18h], rdx
mov [rsp+20h], rbp
mov [rsp+28h], rdi
mov [rsp+30h], rsi
mov [rsp+38h], r8
mov [rsp+40h], r9
mov [rsp+48h], r10
mov [rsp+50h], r11
mov [rsp+58h], r12
mov [rsp+60h], r13
mov [rsp+68h], r14
mov [rsp+70h], r15

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة محمد علاء الدين في 3 أغسطس 2011 في 22:07

1

مدونتي: C++ Tips and Tricks

#3

و لكن هنا يتم إستهلاك مساحة من الذاكرة و التعامل معها أعتقد أنه يقلل في الأداء عن إستخدم Stack أليس كذلك؟

اقتباس
بهذا تفصل بين تنفيذ التعليمات مما يتيح تنفيذ للمعالج تنفيذ اكثر من تعليمه فى نفس الوقت.

ممكن توضيح smile.gif

forum-signature-01.gif
#4

عندما تستخدم pusha او الكود الذى كتيته فى المشاركه الاولي اين يتم تخزين محتويات المسجلات؟ يتم تخزينهم داخل الـ stack و التعليمه pusha او push تتكفل فى تحديث الـ stack pointer، الفرق بين الكود الذى كتبته و الذى قمت انت بكتابته يمكن فى بضع امور هي:

1- التعليمه push تقوم بإنقاص المسجل rsp و بعدها تقوم بنسخ البيان داخل الـ stack، و هذا يقابل عمليتين اولهم sub و الأخرى mov، لذا بالكود الموجود فى المشاركه الاولي ستقوم بتحديث قيمة esp قبل كل عملية نسخ و هذا ما تخطيته فى الكود بالمشاركه الثانيه حيث اقوم بتحديث rsp بالمساحه الكليه و بعدها اقوم بالنسخ.

2- إستخدام push بالإسلوب الموجود بالمشاركه الأولي يمنع المعالج من تنفيذ التعليمات بشكل متوازى و ذلك لإعتماد التعليمه التاليه على نتيجة التعليمه الحاليه - حيث فى كل مره يتم تحديث قيمة rsp - و هذا ما يجعل التنفيذ بطئ، اما فى الكود الذى كتبته فبعد حجز المساحه بالـ stack يمكن تنفيذ اى من التعليمات الخاص بالنقل بأى ترتيب و النتيجه ستكون واحده و هذا يعنى انهم غير مرتبطين ببعضهم مما يتيح للمعالج تنفيذهم بشكل متوازى و بالتالي يجعل التنفيذ اسرع.

و الله ولي التوفيق

4

مدونتي: C++ Tips and Tricks

#5

شكراً أخي محمد على التوضيح.

ملحوظة: ذهبت لتحديد إجابتك و لكن انتهت فترة السؤال و لا أعرف كيف حدث ذلك مع اني حددت عدد ساعات تكفي إلي نصف رمضان تقريباً huh.gif و لذلك أعتذر على النقاط.

تم تعديل هذه المشاركة بواسطة asm-soft في 8 أغسطس 2011 في 15:39

forum-signature-01.gif

مواضيع مشابهة