سؤال

هناك شيء لا يمكنني هضمه. أنا أتعلم بعض التجميع والآن أنا في الفصل مع معالجة. أنا أفهم مفهوم الأقواس لإخلاءها ، لكن بطريقة ما عندما أرى استخدامه ، لا يمكنني امتصاص هذه النقطة. لكي أكون أكثر دقة قليلاً هنا هو المكان الذي بدأ فيه ارتباك:

mov al, [L1]

هنا أفترض أن L1 كحالة مثال هو نوع من الماكرو الذي يتم استبداله لاحقًا لعنوان حقيقي في رمز الجهاز ، أليس كذلك؟

إذن ما تفعله هذه التعليمات هو: dereferencing al التسجيل (لأنه بالكاد يمكنك تغيير العنوان الفعلي) وتغيير القيمة إلى تلك المخزنة في L1.

إذا حتى الآن كل شيء على ما يرام:

mov [L1], al

هذا من شأنه أن يعني التناظرية ، يجب أن يكون هناك عنوان مخزن (لذلك كان هناك نقطة ما في القيام بذلك) وتغييره إلى مكان آخر في الذاكرة ، أليس كذلك؟

إذا تمكنت من إخباري فقط أنه على ما يرام في حال لم ترى أي أخطاء ، فيرجى القيام بذلك ، مما يجعل من الممكن بالنسبة لي مواصلة التعلم.

آخر شيء ، يضيف Nasm مجموعة من 0xAA55 تحت الكود الخاص بي (من المفترض أن ينهي هذا التسلسل البرنامج بشكل صحيح؟) ، لماذا هناك عدة مرات؟

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

المحلول

L1 هو عادة/ربما أ ضع الكلمة المناسبة, يرتبط بعنوان واحد معين في الذاكرة. يحدد المبرمج مختلف الملصقات لراحته/راحته ، ويتم استخدام هذه الملصقات لتمثيل موقع معين في الذاكرة (L1 هو اسم رديء ؛ عادة ما تكون الملصقات تدل على الغرض الأساسي للموقع: على سبيل المثال ، pingcounter ، errormessage ، تسجيل الدخول وما شابه ذلك).

تسمية بايت 1 من التخزين الثابت هي كيفية تنفيذ برنامج التحويل البرمجي C. char L1; في النطاق العالمي.


في بناء جملة NASM ، mov edi, L1 سوف تجمع إلى mov eax, imm32 شكل mov, ، أي أن عنوان التسمية سيصبح فوريًا 32 بت في رمز الجهاز. (لا يعرف المجمع القيمة الرقمية النهائية ، لكن الرابط لا. mov edi, OFFSET L1 للحصول على عنوان تسمية كفوري.

ولكن mov al, [L1] سوف يتم تجميعها إلى تعليمات مختلفة ، مع العنوان 32 بت مضمن في رمز الجهاز كعنوان ليتم إخضاعه. يتم تحميل هذه التعليمات 1 بايت من العنوان L1 ، ويضعه في AL.

في لغة التجميع ، يتم الإشارة إلى وضع العنوان غير المباشر هذا عن طريق قوس مربع المعامل المصدر أو الوجهة لتعليمات معينة. (ولكن ليس كلاهما: x86 يدعم فقط على الأكثر معامل ذاكرة صريح لكل تعليمة.)

mov al, [L1]

يستخدم العنوان المخزّن في L1 ، لتحديد موقع بعض الموقع في الذاكرة ويقرأ 1 بايت (= 8 بت = حجم السجل AL) في هذا الموقع ، ويقوم بتحميله في السجل AL.

  mov [L1], al

هل هذا في الاتجاه المعاكس. IE ، على وجه التحديد ، اقرأ العنوان المخزن في L1 ، استخدم هذا العنوان لإيجاد مكان معين في الذاكرة ويخزن محتويات AL Register هناك.


شريطة أن تفهم المعلومات التالية لتكون غير مكتملة وقديمة إلى حد ما فيما يتعلق بالمعالجات الأحدث في عائلة X86 ، هذا التمهيدي على بنية 8086 ربما يكون مفيدًا جدًا لبدء لغة التجميع لعائلة X86.
تتمثل ميزة البدء في هذا "العصور القديمة في وحدة المعالجة المركزية" (لا تزال قيد الاستخدام ، في الواقع) ، أن المفاهيم الأساسية كلها موجودة ، غير معقدة من المجموعات الأحدث من السجلات ، وأساليب المعالجة الفاخرة ، وأنماط التشغيل والمفاهيم الأخرى. إن أحجام وميزات وأوضاع أكبر وحدات المعالجة المركزية الأحدث تقدم مجرد انفجار تواصل للخيارات ، كلها (الأكثر؟) مفيدة في طريقها ، ولكنها غير ذات صلة بشكل أساسي للبدء.

نصائح أخرى

من الصعب اتباع سؤالك ، لكنني سأحاول المساعدة.

في التجميع ، الرمز هو مجرد اسم للعنوان. في مصدر التجميع الخاص بك ، L1 هو رمز محدد في مكان آخر ، والذي سيتم حله للمجمع باعتباره إزاحة للذاكرة.

عند dereferencing (باستخدام التدوين []) ، يمكنك تحديد السجل (كما في "Mov al ، [ESI]) أو عنوان (كما في "Mov al ، [L1]). كلا البيانين يفعلان الشيء نفسه ، والفرق الوحيد هو المكان الذي يأتي منه العنوان.

أوصي بتنزيل وثائق وحدة المعالجة المركزية Intel والقشط من خلال مرجع التعليمات. إذا كنت لا تريد أن تكون غارقًا ، فابدأ القراءة من معالج X86 الأقدم (على سبيل المثال ، 486 أو أكبر) ، هذه الوثائق ليست ودية تمامًا ولكن من المفيد جدًا أن تكون في متناول اليد.

لا أعرف تفاصيل NASM ، لقد تعلمت التجميع منذ 15 عامًا مع Turbo Assembler ، وما زالت هذه المعرفة مفيدة اليوم :)

أيضًا ، قد أقترح أن تجرب googling لـ "تعليمي التجميع x86" ، ستجد الكثير من الوثائق ذات الصلة التي قد تكون مفيدة لك.

أوه وشيء أخير ، يضيف Nasm مجموعة من 0xaa55 تحت الكود الخاص بي (من المفترض أن ينهي هذا التسلسل البرنامج بشكل صحيح؟) ، لماذا هناك عدة مرات؟ شكرا جزيلا لك على قراءتها هنا ..

أنا متأكد من أن هذا ينطبق فقط إذا قمت بإنشاء أداة تحميل. إنه "توقيع التمهيد". لنفترض أنك تكتب هذا الرمز إلى مرنة (هل رمز الجهاز المنتجة الخاص بك أيضًا أيضًا 512 بايت؟) ، حسنًا عندما تريد بدء تشغيل الكمبيوتر باستخدام رمز تحميل التمهيد هذا ، ستنظر BIOS إلى المرنة وتحديد ما إذا كان محملاً فعليًا. من أجل القيام بذلك ، سوف ينظر إلى آخر بايتين من القطاع الأول من المرنة ، والتي يجب أن تكون 0xAA55 للإشارة إلى أنه قابل للتمهيد .. (أيضًا ، يعمل هذا بنفس الطريقة إذا تم تشغيله من Harddrive ، أو محرك الإبهام ، أو أي شيء آخر.

في رمز المصدر الخاص بك ، يشبه السطر الأخير شيء مثل $(times.. db 0xAA55 أو شيء من هذا القبيل؟ إذا كنت لا تعتزم إنشاء محمل تمهيد ، فيمكنك إزالة هذا الخط بشكل فعال.

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