assembly - يفهمها - من هو مخترع لغة الآلة




لماذا هناك فرق بين لغات التجميع مثل ويندوز، لينكس؟ (6)

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

كما أفهم عندما أنا تجميع رمز C نظام التشغيل لا تنتج حقا آلة نقية أو رمز التجمع، وتنتج أوس تعتمد كود ثنائي.ولكن لماذا؟

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

أنا أتساءل حقا عن الأسباب الكامنة وراءها. أي إجابة مفصلة، ​​المادة، كتاب سيكون كبيرا. شكر.


بالإضافة إلى إجابات أخرى.

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


تاريخيا لينكس التجمع يميل إلى أن يتم باستخدام أت & T بناء الجملة، لأن هذا هو ما يدعم غنو المجمع . وبالمثل، تميل مجمعات ويندوز إلى استخدام بنية إنتيل، كما هو الحال مع ماسم و ناسم .

جميع x86 أسمبلرز تنتج نفس الانتاج - وهذا هو، x86 رمز الجهاز. ويمكنك استخدام ناسم أو غنو أسمبلر على لينوكس لبرمجة تحت بناء إنتل، و غنو المجمع على ويندوز لبرمجة تحت أت & T بناء الجملة.


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

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

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

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


ليس هناك فرق. رمز التجميع هو نفسه إذا كان المعالج هو نفسه. رمز x86 المترجمة على ويندوز هو ثنائي متوافق مع رمز x86 على لينكس. لا ينتج المحول البرمجي رمز ثنائي يعتمد على نظام التشغيل، ولكن قد يحزم الرمز بتنسيق مختلف (على سبيل المثال بي مقابل إلف).

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


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


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

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

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

    mov bx,StartAddr

لب: موف آل، [بكس] ... لا بعض حساب إنك بكس سمب بل، <(ستارتادر + لينغث)؛ <عامل البادئة يعني "لسب من" جنز لب

سيكون من الممكن استخدام cmp bx,(StartAddr+Length) ، ولكن إذا كانت أدوات التجميع يمكن أن تدعم ذلك، مقارنة فقط بايت منخفضة سيكون أسرع. من ناحية أخرى، قد تتطلب بعض أنواع أدوات تجميع / ربط 16 بت أن يتم إصلاح فيكسوب عنوان مع عناوين 16 بت المخزنة في التعليمات البرمجية.

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





x86