dword ptr استخدام الارتباك
سؤال
في لغة التجميع إذا كان لنا أن استخدام
mov eax, dword ptr[ebx]
فإن ذلك يعني نسخ قيمة وأشار من قبل ebx (ebx يحتوي على عنوان قيمة غير القيمة الفعلية ، هذه التعليمات نسخ القيمة الفعلية في العنوان)?
إذا كان لنا أن استخدام
mov eax, dword ptr[some_variable]
فإن ذلك يعني نسخ قيمة المتغير "some_variable" نفسها eax, لا نسخ قيمة وأشار من قبل متغير "some_variable"?
هل فهمي صحيح ؟
إذا كان الجواب نعم ، أنا في حيرة لماذا نفس الجمعية التعليمات مختلفين meansings - في الحالة الأولى هناك مستوى من المراوغة ، ولكن في الثانية لا يوجد إضافية مستوى المراوغة.
أي تعليق ؟
تحرير:
ليس كل [] لا تأخذ أي تأثير ، على سبيل المثال ، تعليمات xchg سوف يستغرق مستوى في الاتجاه الذي يحمل قيمة وأشار خلال edx.
كامل شفرة المصدر يمكن العثور عليها ،
http://www.codeproject.com/KB/threads/spinlocks.aspx
#ifdef WIN32
inline int CPP_SpinLock::TestAndSet(int* targetAddress, int nValue)
{
__asm {
mov edx, dword ptr [pTargetAddress]
mov eax, nValue
lock xchg eax, dword ptr [edx]
}
}
#endif // WIN32
المحلول
في كلتا الحالتين عليك أن تسأل المعالج لتحريك قيمة من عنوان محدد.انها واحدة مستوى المراوغة.في الحالة الأولى كنت أسأل أن تأخذ العنوان المحدد للتسجيل.في الحالة الثانية تحديد إزاحة مباشرة.
معالجات x86 لا تدعم dual مستوى المراوغة ، لذلك ليس من الممكن أن طلب تحميل قيمة من العنوان المحدد في مكان ما في الذاكرة لديك لتحميل العنوان على التسجيل.
في إطار عدد من المجمعات (MASM و بنيت في VC++ المجمع على سبيل المثال) يمكن أن تكتب فقط
mov eax, dword ptr some_variable
بدون أقواس يعني نفسه.
يمكن أن تكتب
move eax, dword ptr [variable][ebx]
هذا من شأنه أن يكلف لاتخاذ عنوان "متغير" ، ثم إضافة قيمة ebx و استخدام المبلغ كما عنوان يمكن من خلاله تحميل قيمة.هذا هو غالبا ما تستخدم من أجل الوصول إلى عناصر مجموعة من المؤشر.
في كل هذه الحالات المعالج سوف تفعل الشيء نفسه - تحميل قيمة من العنوان المحدد.انها واحدة مستوى المراوغة في كل مرة.