كيف أقرأ عمدا من الذاكرة الرئيسية مقابل ذاكرة التخزين المؤقت؟

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

سؤال

لذلك أنا أتعلم التجميع ولدينا مهمة وهي إيجاد الفارق الزمني بين القراءة من الذاكرة والقراءة من ذاكرة التخزين المؤقت.يتعين علينا القيام بذلك عن طريق إنشاء حلقتين وتوقيتهما.(أحدهما يقرأ من الذاكرة الرئيسية والآخر من ذاكرة التخزين المؤقت).الأمر هو أنني لا أعرف ولا أستطيع العثور على أي شيء يخبرني بكيفية القراءة من ذاكرة التخزين المؤقت أو الذاكرة الرئيسية =/.هل يمكنكم مساعدتي يا رفاق؟أنا أفعل هذا في MASM32.أنا أفهم كيفية إنشاء الحلقات وأفهم جيدًا معظم لغة التجميع ولكن لا يمكنني جعلها مقروءة =/


يحرر:

عندي سؤال انا عملت كده

mov ecx, 100 ;loop 100 times
xor eax, eax ;set eax to 0
_label:
mov eax, eax ;according to me this is read memory is that good?
dec ecx ;dec loop
jnz _label ;if still not equal to 0 goes again to _label

...هل ذلك سوف يكون على ما يرام؟


تحرير 2:

حسنًا، لا أنوي التطفل وأنا أقدر مساعدتك، لدي سؤال آخر فقط، نظرًا لأن هاتين الحلقتين يجب أن أقوم بهما.أحتاج إلى مقارنتها بطريقة ما، لقد كنت أبحث عن تعليمات للمؤقت ولكني لم أجد أيًا منها، لقد وجدت فقط: timeGetTime, GetTickCount و عداد الأداء ولكن بقدر ما أفهم، تُرجع هذه التعليمات وقت النظام وليس الوقت الذي تستغرقه الحلقة حتى تنتهي.هل هناك طريقة لفعل ما أريد فعلاً؟أو أنا بحاجة إلى التفكير في طريقة أخرى؟

أيضًا، للقراءة من سجلات مختلفة في الحلقة الثانية (التي لا تقرأ من ذاكرة التخزين المؤقت) هل من المقبول أن أعطي تعليمات "mov" المختلفة؟أم أنني خارج القاعدة تمامًا هنا؟

آسف على كل هذه الأسئلة ولكن مرة أخرى أشكركم على مساعدتكم.

هل كانت مفيدة؟

المحلول

للقراءة من ذاكرة التخزين المؤقت.لديك حلقة تقرأ من نفس عنوان الذاكرة (أو مشابه جدًا):

  • في المرة الأولى التي تقرأ فيها من هذا العنوان، سيتم نقل القيم من عنوان الذاكرة هذا (ومن عنوان الذاكرة القريب الآخر) إلى ذاكرة التخزين المؤقت
  • ال التالي الوقت الذي تقرأ فيه من ذلك نفس العنوان، فإن القيم مخزنة مؤقتًا بالفعل ولذا فأنت تقرأ من ذاكرة التخزين المؤقت.

لقراءة الذاكرة غير المخزنة مؤقتًا، استخدم حلقة تقرأ من العديد من العناصر المختلفة جدًا (على سبيل المثال:أبعد من حجم ذاكرة التخزين المؤقت) عناوين الذاكرة.


وللإجابة على سؤالك الثاني:

  • الأشياء التي تفعلها باستخدام ecx وjnz تبدو جيدة (لا أعرف مدى دقة/حساسية مؤقتك، لكنك قد ترغب في التكرار أكثر من 100 مرة)

  • ال mov eax, eax ليست "قراءة الذاكرة" ...إنها عملية ممنوعة، والتي تنقل eax إلى eax.بدلاً من ذلك، أعتقد أن بناء جملة MASM للقراءة من الذاكرة شيء أشبه mov eax,[esi] ("اقرأ من موقع الذاكرة الذي يوجد عنوانه في esi")

  • اعتمادًا على نظام التشغيل/التشغيل الذي تستخدمه، يجب عليك القراءة من عنوان الذاكرة الموجود بالفعل والقابل للقراءة.في نظام التشغيل Windows، على سبيل المثال، لن يُسمح لأحد التطبيقات بالقيام بذلك mov esi, 0 تليها mov eax, [esi] لأنه لا يُسمح للتطبيق بقراءة الذاكرة التي يكون عنوانها/موقعها صفرًا.


وللإجابة على سؤالك الثالث:

timeGetTime وGetTickCount وعداد الأداء

إن الإشارة إلى timeGetTime وGetTickCount وPerformance Counter تشير إلى أنك تعمل بنظام التشغيل Windows.

نعم، تعمل هذه على إرجاع الوقت الحالي إلى دقة/دقة مختلفة:على سبيل المثال، تبلغ دقة GetTickCount حوالي 50 مللي ثانية، لذا فهو يفشل في توقيت الأحداث التي تدوم أقل من 50 مللي ثانية، ويكون غير دقيق عند توقيت الأحداث التي تستمر من 50 إلى 100 مللي ثانية فقط.لهذا السبب قلت ذلك 100 في الخاص بك ecx ربما ليست كبيرة بما فيه الكفاية.

ال QueryPerformanceCounter ربما تكون الوظيفة هي الموقت الأكثر دقة لديك.

لاستخدام أي من هذه المؤقتات كمؤقت للفاصل الزمني:

  • احصل على الوقت قبل البدء في الحلقة
  • احصل على الوقت مرة أخرى، بعد الانتهاء من التكرار
  • اطرح هاتين المرتين:الفرق هو الفاصل الزمني

هل من المقبول أن أعطي تعليمات "mov" المختلفة؟

نعم أعتقد ذلك.أعتقد أنه يمكنك القيام بذلك على هذا النحو (احذر، لست متأكدًا/لا أتذكر ما إذا كان هذا هو بناء جملة MASM الصحيح للقراءة من موقع ذاكرة الاسم) ...

mov eax,[memory1]
mov eax,[memory2]
mov eax,[memory3]
mov eax,[memory4]
mov eax,[memory5]

...أين memory1 خلال memory5 هي عناوين للمتغيرات العالمية متباعدة على نطاق واسع في شريحة البيانات الخاصة بك.

أو يمكنك فعل...

mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]
add esi,edx
mov eax,[esi]

...حيث يشير esi إلى الجزء السفلي من قطعة طويلة من الذاكرة، وedx عبارة عن زيادة تساوي حوالي خمس طول القطعة.

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