كيف يؤثر نظام التشغيل على كيفية تشغيل رمز التجميع؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

آمل أن أتعلم لغة التجميع ل X86. أنا على جهاز Mac، وأنا أفترض أن معظم البرامج التعليمية / الكتب X86 استخدم الكود المقصود لنظام التشغيل Windows.

كيف يتم تشغيل نظام التشغيل الذي يتم تشغيل التعليمات البرمجية في تأثير التعليمات البرمجية أو تحديد ما إذا كان الرمز يعمل حتى؟ هل يمكنني اتباع برنامج تعليمي يستند إلى Windows، وتعديل عدد قليل من الأوامر لجعله يعمل بنظام التشغيل Mac مع سهولة نسبية؟ أكثر عموما، هل هناك أي شيء صعبة أن مبرمج تجميع ماك، على وجه التحديد، يجب أن يعرف؟ شكرا!

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

المحلول

(بالطبع، تنطبق كل ما يلي فقط إلى X86 و X86-64 لغة التجميع، لمعالجات IA-32 و AMD64 وأنظمة التشغيل.)

الإجابات الأخرى المرئية حاليا هي كلها صحيحة، ولكن في رأيي، أفتقد النقطة. AT & T Versus Intel Syntax هو مشكلة غير كاملة؛ ستعمل أي أداة لائقة من خلال وضع الجملة أو لديك نظير أو استبدال يقوم بذلك. وهم يجمعون نفسه على أي حال. (Protip: أنت تريد حقا استخدام بناء جملة Intel. كل وثائق المعالج الرسمي. لقد حصلت عليه ولديك فقط للقيام بذلك مرة واحدة لكل نظام تشغيل (إذا كنت تتذكر أن تكتبها في مكان ما!).

تعليمات الجمعية أنفسهم، بالطبع، غير ملائمين تماما. وحدة المعالجة المركزية لا يهتم ما نظام التشغيل الذي يعمل عليه. ما لم تكن تفعل اختراقا منخفضا للغاية (أي نظام التشغيل، تطوير نظام التشغيل)، فإن المكسرات والمسامير من كيفية تفاعل نظام التشغيل و CPU غير ذي صلة تقريبا.

العالم الخارجي

تأتي المتاعب مع لغة التجميع عند التفاعل مع العالم الخارجي: Kernel OS، ورمز المستخدمين الآخرين الآخرين. المستثمرون هو الأكثر صعوبة: عليك الحصول على أبي اليمنى أو برنامج التجميع الخاص بك هو كل شيء غير مجدي. هذا الجزء غير محمول بشكل عام بين نظام التشغيل إلا إذا كنت تستخدم الترامبولين / الطبعات (أساسا طبقة أخرى من التجريد يجب إعادة كتابتها لكل نظام تشغيل تنوي الدعم).

الجزء الأكثر أهمية من ABI هو مهما كانت اتفاقية الاتصال هي وظائف أسلوب C. إنهم أكثر من المدعومة بشكل شائع، وما ستتعامل معه إذا كنت تكتب التجمع. الضباب أجنك يحافظ على العديد من الموارد الجيدة موقعه; ؛ ال وصف مفصل للاتصالات الدعائية مفيد بشكل خاص. في إجابته، يذكر نورمان رامزي الموافقة المسبقة عن علم والمكتبات الديناميكية؛ في تجربتي، عادة لا تضطر إلى تهتم بأولئك إذا كنت لا ترغب في ذلك. تعمل الارتباط الثابت على غرامة الاستخدامات النموذجية لغتها التجميع (مثل إعادة كتابة الوظائف الأساسية لحلقة داخلية أو نقطة ساخنة أخرى).

تعمل اتفاقية الاتصال في اتجاهين: يمكنك الاتصال C من التجميع أو الجمعية من C. تميل الأخير إلى أن يكون أسهل قليلا ولكن ليس هناك فرق كبير. يتيح لك الاتصال جرا من التجميع استخدام أشياء مثل وظائف إخراج المكتبة القياسية C، أثناء الاتصال الجمعية من C عادة ما تكون كيفية الوصول إلى تنفيذ التجميع لوظيفة واحدة ذات أهمية واحدة.

مكالمات النظام

الشيء الآخر سوف يقوم برنامجك بإجراء مكالمات النظام. يمكنك كتابة برنامج تجميع كامل ومفيد لا يستدعي وظائف C الخارجية، ولكن إذا كنت ترغب في كتابة برنامج لغة تجميع نقي لا يعتمد على الاستعانة بمصادر خارجية الأشياء الممتعة لرمز شخص آخر، فأنت ذاهب إلى يحتاج مكالمات النظام. وللأسف، فإن مكالمات النظام مختلفة تماما ومختلفة تماما على كل نظام تشغيل. يدعو نظام نظام UNIX، ستحتاج إلى تشمل (ولكن بشكل أكثر اكشية لا تقتصر على!) open, creat, read, write, ، والأهم من ذلك exit, ، جنبا إلى جنب مع mmap إذا كنت تحب تخصيص الذاكرة ديناميكيا.

في حين أن كل نظام تشغيل مختلف، إلا أن معظم أجهزة التشغيل الحديثة تتبع النمط العام: يمكنك تحميل عدد مكالمة النظام التي تريدها في سجل، عادة EAX في رمز 32 بت، ثم قم بتحميل المعلمات (كيف يمكنك القيام بذلك يختلف بعنف)، وأخيرا إصدار طلب مقاطعة: إنه INT 2E ل Windows NT Kernels أو INT 80h ل Linux 2.x و FreeBSD (وأعتقد، OSX). يأخذ kernel ثم ينفذ مكالمة النظام، وإرجاع التنفيذ إلى البرنامج الخاص بك. اعتمادا على نظام التشغيل، قد يقوم الأمر بالسجلات أو المكدس كجزء من مكالمة النظام؛ يجب عليك التأكد من أنك تقرأ وثائق استدعاء النظام لمنصتك للتأكد.

SYSENTER

Linux 2.6 Kernels (وأعتقد وأعتقد ونظام التشغيل Windows XP والأحدث، على الرغم من أنني لم أحاول فعليا أبدا على Windows) أيضا دعم طريقة أحدث أسرع لإجراء مكالمة النظام: SYSENTER التعليمات المقدمة من Intel في رقائق Pentium الأحدث. amd رقائق SYSCALL, ، ولكن عدد قليل من أجهزة تشغيل 32 بت استخدامها (على الرغم من أنها المعيار ل 64 بت، وأعتقد أني لم أتعرض لإجراء مكالمات النظام المباشر من برنامج 64 بت لذلك أنا لست متأكدا من ذلك). SYSENTER أكثر تعقيدا بشكل كبير لإعداد واستخدام (انظر، على سبيل المثال، لينوس تورفالدز على التنفيذ SYSENTER دعم لينكس 2.6: "أنا خنزير مثير للاشمئزاز، وفخور به للتمهيد.") يمكنني أن أشهد شخصيا على خصوصيته؛ كتبت ذات مرة وظيفة التجميع التي صدرت SYSENTER مباشرة إلى نواة لينكس 2.6، وأنا ما يزال لا تفهم العديد من المكدس والتسجيل الحيل التي حصلت عليه للعمل ... ولكن العمل فعلت!

SYSENTER هو أسرع إلى حد ما من إصدار INT 80h, ، وبالتالي استخدامها مرغوب فيه عند توفرها. لتسهيل كتابة كلا من التعليمات البرمجية السريعة والمحمولة، Maps Linux يسمى VDSO linux-gate في مساحة عنوان كل برنامج؛ إن استدعاء وظيفة خاصة في VDSO ستصدر مكالمة نظام عن طريق أسرع آلية متاحة. لسوء الحظ، استخدامها عموما مشكلة أكثر مما يستحق: INT 80h هو أكثر بساطة للقيام به في روتين تجميع صغير يستحق عقوبة السرعة الصغيرة. ما لم تكن بحاجة إلى الأداء النهائي ... وإذا كنت بحاجة إلى ذلك، فربما لا ترغب في الاتصال في VDSO على أي حال، وأنت تعرف أجهزةك، حتى تتمكن من القيام بشيء غير آمن فظيع SYSENTER نفسك.

كل شيء آخر

بخلاف المطالب التي تفرضها التفاعل مع النواة والبرامج الأخرى، هناك عدد قليل جدا من الاختلافات بين أنظمة التشغيل. تكشف التجميع روح الجهاز: يمكنك العمل كما تريد، وداخل الرمز الخاص بك غير مرتبط بأي اتفاقية اتصال معينة. لديك حرية الوصول إلى وحدات FPU و SSE؛ يمكنك PREFETCH مباشرة لتدفق البيانات من الذاكرة إلى ذاكرة التخزين المؤقت L1 وتأكد من أنها ساخنة عندما تحتاج إليها؛ يمكنك مانج كومة في الإرادة؛ يمكنك الإصدار INT 3 إذا كنت ترغب في الواجهة مع A (تكوينها بشكل صحيح؛ حظا سعيدا!) المصحح الخارجي. لا شيء من هذه الأشياء تعتمد على نظام التشغيل الخاص بك. القيود الحقيقية الوحيدة التي لديك هي أنك تعمل في Ring 3، وليس حلقة 0، وبالتالي فإن بعض سجلات التحكم في المعالج ستكون غير متوفرة لك. (ولكن إذا كنت بحاجة إلى هؤلاء، فأنت تكتب رمز OS، وليس رمز التطبيق.) بخلاف ذلك، يتم وضع الجهاز عارية لك: الخروج والحساب!

نصائح أخرى

بشكل عام، طالما أنك تستخدم نفس المجمع، والعمارة نفسها (على سبيل المثال، NASM، و X86-64)، يجب أن تكون قادرا على تجميع التجميع على كل من Windows و Mac.

ومع ذلك، من المهم أن نضع في اعتبارك أن التنسيقات القابلة للتنفيذ وبيئات التنفيذ قد تختلف. على سبيل المثال، قد يحاكي Windows / تعامل مع بعض الإرشادات المميزة بشكل مختلف إلى Mac، مما تسبب في سلوك مختلف.

أيضا جزء كبير من الفرق هو في كيفية توصيل البرنامج مع العالم الخارجي.

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

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

الفجوة الكبرى في لغة التجمع Intel هي بين بناء الجملة AT & T وبناء جملة Intel. ستحتاج إلى مجمع لجهاز Mac الخاص بك يستخدم نفس بناء الجملة مثل أي برامج تعليمية تستخدمها. نظرا لأنني أصدق أن Macos Darwin، BSD البديل، يستخدم بناء جملة AT & T، يستخدم Microsoft Assembler بناء جملة Intel، ستحتاج إلى توخي الحذر.

الفرق الآخر يحذر من هو الواجهة الثنائية لتطبيق النظام (ABI)، والتي تغطي الاتفاقيات المتصلحة، تصميم المكدس، ومكالمات النظام، وما إلى ذلك. قد تختلف بشكل كبير بين نظام التشغيل، خاصة عندما يتعلق الأمر مكانة قانون مستقلة و الرابط الديناميكي. وبعد لدي ذكريات غير راضية غامضة أن الموافقة المسبقة عن علم كانت معقدة بشكل خاص على MACOS PowerPC، ولكن ربما تكون أبسط على إنتل.

قطعة واحدة من المشورة: تعلم x86_64. (المعروف أيضا باسم AMD64) - إنها أكثر متعة بكثير لكتابة رمز التجميع باليد، وستكون أكثر إثباتا في المستقبل.

عندما انخفضت في التجمع خلال واحدة من بلدي السياحة البرمجة الزيارات، جوتشا التي شغلتني في كل برنامج تعليمي لم تكن قادرة على تجميعها في الشكل الثنائي الصحيح. معظم البرامج التعليمية تعطي elf (لينكس) و aoutb (بالنسبة إلى BSD)، ومع ذلك مع الأخير (الاختيار المنطقي؟) يشكو OS X:

ld: hello.o bad magic number (not a Mach-O file)

بعد Mach-O يفشل كتنسيق، وإذا كنت man nasm تحصل فقط bin, aout و elf تنسيقات الملفات - man ld ليس أكثر مفيدة - macho هو خيار جعل تنسيق mach-o لنظام التشغيل x:

nasm -f macho hello.asm

أنا كتب الرحلة هنا (بما في ذلك رابط لحزمة لطيفة TextMate للتجميع وغيرها من المعلومات)، ولكن - أن تكون موجزا - ما سبق هو ما تحتاج إلى البدء.

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