يقدم هذا الكتاب مقدمة لطيفة لبرمجة لغة التجميع. ما يجعل هذه المقدمة "لطيفة" هو أنها تفترض أن القارئ مرتاح بالفعل لتشفير C أو C++. نحن نستخدم هذه المعرفة المفترضة للعودة إلى المستوى المنخفض ISA (بنية مجموعة التعليمات).
نقود إلى المنزل نقطة حادة جدًا:
لغة التجميع ليست شيئًا تخاف منه!كما ذكرنا سابقًا، إذا كنت معتادًا على لغة C (أو اللغات التي تنحدر منها مثل C++)، فإن هذا الكتاب يبدأ بما تعرفه بالفعل.
تغوص الفصول اللاحقة بشكل أعمق في الزوايا والفجوات في ARM V8 ISA وهي مناسبة لأولئك الذين يرغبون في إتقان مجموعة التعليمات الغنية لمعالجات ARM 64 بت.
نعم بالتأكيد.
تعتمد برمجة لغة التجميع بشكل وثيق على بنية الأجهزة الأساسية. تلعب بيئة التشغيل المضيفة دورًا كبيرًا في تحديد كيفية إنشاء برامج لغة التجميع. يشير "اصطلاح الاستدعاء" إلى كيفية استدعاء الوظائف وكيفية تمرير المعلمات.
في الأصل، كان هذا الكتاب يدرس فقط اتفاقيات ARM LINUX. ومع ذلك، بمرور الوقت، قمنا بتطوير مجموعة من وحدات الماكرو التي تسهل كتابة التعليمات البرمجية لاستخدامها إما على MacOS أو على LINUX.
سيؤدي هذا الرابط إلى نسخة حالية منها بالإضافة إلى الوثائق. يتم أيضًا تضمين وحدات الماكرو التي تجعل البرمجة أسهل قليلاً.
يقدم هذا الفصل بعض المعلومات الإضافية حول برمجة لغة التجميع الخاصة بـ Apple Silicon.
ستلاحظ أننا نستفيد من وقت التشغيل C مباشرة بدلاً من إجراء مكالمات نظام التشغيل. لذا، على سبيل المثال، إذا أردنا استدعاء الدالة write()
، فإننا نستدعي الدالة write
من لغة التجميع.
هذا الإصدار من write
استدعاء النظام عبارة عن وظيفة مجمعة مضمنة في C-runtime (CRT) والتي تعالج تفاصيل المستوى الأدنى لإجراء استدعاء النظام. انظر هنا لمعرفة ما يحدث بالفعل داخل وظائف الغلاف هذه.
تتمثل فائدة استخدام أغلفة CRT في وجود اختلافات بين التوزيعات والبنيات التي تم إخفاؤها باستخدام أغلفة CRT. ولذلك، عند استخدام الأغلفة بدلاً من الطريقة المباشرة لإجراء مكالمات النظام، فإن التعليمات البرمجية الخاصة بك ستكون أكثر سهولة في النقل.
على الرغم من أن تصميمات ARM تستحق الثناء، إلا أن اصطلاحات تسمية ARM لملكياتها الفكرية مروعة. في هذا الكتاب، تم اعتبار AARCH64 وARM V8 مرادفين لبنية مجموعة تعليمات ARM 64 بت (ISA).
من الصعب جدًا العثور على الوثائق على موقع ARM لأن لديهم العديد من الإصدارات والعديد من الأسماء لنفس الشيء والكثير من الوثائق بشكل عام. حقا يمكن أن يكون جنونا.
وسنقدم داخل النص روابط وثيقة الصلة حسب الاقتضاء.
فيما يلي رابط إلى صفحة مجموعة التعليمات الرئيسية "أ".
يعد الحصول على الأدوات اللازمة لتطوير لغة التجميع أمرًا سهلاً للغاية - ربما تكون لديك هذه الأدوات بالفعل. باستخدام apt
من محطة Linux، قل:
sudo apt update
sudo apt install build-essential gdb
في نوع ماكنتوش:
xcode-select --install
إلى المحطة واتبع التوجيهات. لاحظ أنه تم استبدال gdb
بـ lldb
مع اختلافات كافية تجعلك تبكي.
إذن ستحتاج إلى محررك المفضل. نحن أنفسنا نستخدم vi
لإجراء تعديلات سريعة ورمز Visual Studio لأي عملية رفع ثقيلة.
نحن نستخدم gcc
، "المترجم" C. يمكن أيضًا استخدام g++
. على أجهزة Mac، يمكن أيضًا استخدام clang
.
ما المعنى الذي يجعل ذلك ... استخدام "المترجم" "لتجميع" لغة التجميع؟
حسنًا، للإجابة على ذلك يجب على المرء أن يفهم أن كلمة "مترجم" تشير إلى خطوة واحدة فقط في تسلسل البناء. ما نتحدث عنه باعتباره "المترجم" هو في الواقع مظلة تشمل:
معالج مسبق يعمل على أي أمر من أوامر المعالج #
مثل #include
. هذه الأوامر ليست جزءًا من C أو C++. بل هي أوامر للمعالج المسبق.
لاحظ أن gcc
سوف يستدعي المعالج الأولي للغة C إذا انتهى ملف لغة التجميع الخاص بك بـ .S
- Capital S. وقد يتم استدعاؤه أو لا يتم استدعاؤه إذا كان ملفك ينتهي بأحرف صغيرة s أو أي امتداد ملف آخر اعتمادًا على نظامك.
المترجم الفعلي ، الذي تتمثل مهمته في تحويل اللغات عالية المستوى مثل C وC++ إلى لغة التجميع.
المجمع، الذي يحول لغة التجميع إلى رمز الآلة وهو ليس جاهزًا تمامًا للتنفيذ.
وأخيرًا، الرابط، الذي يجمع بين العديد من ملفات التعليمات البرمجية المتوسطة للجهاز (تسمى ملفات الكائنات)، ومن المحتمل أن يكون هناك العديد من ملفات المكتبة (ملفات .dll المرتبطة بشكل ثابت على Windows وملفات .a على Linux). الرابط هو الخطوة الأخيرة في هذه السلسلة.
وهنا فيديو يشرح هذه العملية.
نحن نستخدم gcc وg++ مباشرةً، نظرًا لكونهما مظلات، فإنهما يقومان بأتمتة الخطوات المذكورة أعلاه ويرتبطان تلقائيًا بـ CRT.
لنفترض أنك قمت بتنفيذ main()
في ملف C (main.c) وتريد الاستفادة من ملف لغة التجميع الذي كتبته (asm.S). يمكن القيام بذلك بعدة طرق.
gcc main.c asm.S
هذا كل ما تحتاجه لبناء الحد الأدنى. سيتم كتابة البرنامج الناتج إلى a.out
. ستتم إزالة كافة الملفات الوسيطة التي تم إنشاؤها.
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
عند استخدام هذه الطريقة، يتم ترك ملفات .o
على القرص. باستخدام الطريقة السابقة، تتم إزالة ملفات .o
دون أن تراها.
لنفترض أن main()
تم تنفيذها في لغة التجميع وأن main.s
قائمة بذاتها، ثم ببساطة:
gcc main.S
في كثير من الأحيان، سوف تحتاج إلى تمكين مصحح الأخطاء gdb
أو lldb
. افعل هذا:
gcc -g main.S
بدون خيار سطر الأوامر -g
، قد لا يعمل مصحح الأخطاء بشكل صحيح.
للتكرار، إذا كنت تريد أن يقوم gcc
بتشغيل التعليمات البرمجية الخاصة بك من خلال معالج C المسبق (لتسليم #include
على سبيل المثال)، قم بتسمية ملفات التعليمات البرمجية المصدر للغة التجميع الخاصة بك بحرف كبير S. لذلك، على Linux:
gcc main.s
لن يمر عبر المعالج المسبق لـ C ولكن
gcc main.S
سوف.
لتوضيح النقطة التي مفادها أن "المترجم" عبارة عن مظلة، فإن استخدام gcc "لتجميع" برنامج يؤدي إلى استدعاء ما يلي على Ubuntu الذي يعمل على ARM:
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
هو المعالج الأولي للغة C - وهو أداة عامة يمكن استخدامها بواسطة لغات أخرى أيضًا (C++، على سبيل المثال).
cc1
هو المترجم الفعلي.
as
هو المجمع.
ld
هو الرابط.
يمكنك أن ترى لماذا نستخدم الأمر المظلي افتراضيًا في هذا الكتاب.
نبدأ بتوفير ما نسميه "الجسر" من C وC++ إلى لغة التجميع. نحن نستخدم المعرفة التي لديك بالفعل لتتعلم معرفة جديدة - كم هو رائع ذلك!
الفصل | تخفيض السعر | قوات الدفاع الشعبي |
---|---|---|
0 | كيك ستارت | وصلة |
1 | مرحبا بالعالم | وصلة |
2 | إذا تصريحات | وصلة |
3 | الحلقات | |
3 أ | بينما الحلقات | وصلة |
3ب | للحلقات | وصلة |
3 ج | مواصلة التنفيذ | وصلة |
3D | تنفيذ الاستراحة | وصلة |
4 | فواصل | |
4 أ | السجلات | وصلة |
4ب | تحميل وتخزين | وصلة |
4 ج | المزيد عن ldr | وصلة |
4 د | تسجيل المقاسات | وصلة |
4ه | سداسي عشري | وصلة |
5 | switch | وصلة |
6 | وظائف | |
6 أ | الدعوة والعودة | وصلة |
6 ب | تمرير المعلمات | وصلة |
6 ج | مثال على استدعاء بعض وظائف وقت تشغيل C الشائعة | وصلة |
7 | FizzBuzz - برنامج كامل | وصلة |
8 | الهياكل | |
8 أ | تنسيق | وصلة |
8 ب | تعريف | وصلة |
8 ج | استخدام | وصلة |
8 د | ما هذا" | وصلة |
9 | const | وصلة |
تستخدم عمليات النقطة العائمة تعليماتها الخاصة ومجموعة السجلات الخاصة بها. ولذلك، يتم تناول عمليات الفاصلة العائمة في القسم الخاص بها:
الفصل | تخفيض السعر | قوات الدفاع الشعبي |
---|---|---|
0 | نظرة عامة على الفصل | وصلة |
1 | ما هي أرقام النقطة العائمة؟ | وصلة |
2 | السجلات | وصلة |
3 | الاقتطاع والتقريب | وصلة |
4 | حرفية | وصلة |
5 | fmov | وصلة |
6 | يطفو نصف الدقة | وصلة |
7 | NEON SIMD لم تتم كتابته بعد | وصلة |
ما الذي يمكن أن يكون عليه كتاب عن لغة التجميع بدون تقريع؟
الفصل | تخفيض السعر | قوات الدفاع الشعبي |
---|---|---|
1 | حقول البت | |
1 أ | بدون حقول بت | وصلة |
1 ب | مع حقول بت | وصلة |
1 ج | مراجعة التعليمات الموصوفة حديثًا | وصلة |
2 | إنديانيس | وصلة |
في هذا القسم، نقدم مواد متنوعة بما في ذلك "محاضرتنا المشهورة عالميًا" حول تصحيح الأخطاء. تمت دعوة هذه المحاضرة في العديد من الكليات والجامعات. إنه مخصص للجماهير التي تعمل بلغات مثل C وC++ ولغة التجميع ولكن بعض الدروس الواردة فيه تنطبق على جميع اللغات.
الفصل | تخفيض السعر | قوات الدفاع الشعبي |
---|---|---|
1 | أبل السيليكون | وصلة |
2 | تقارب أبل / لينكس | وصلة |
3 | وظائف متغيرة | وصلة |
4 | تحت الغطاء: مكالمات النظام | وصلة |
5 | تحديد الأطوال الحرفية للسلسلة لوظائف C | وصلة |
6 | استدعاء لغة التجميع من بايثون | وصلة |
7 | العمليات الذرية | وصلة |
8 | القفز على الجداول | وصلة |
9 | argv | رمز ASM |
10 | أقفال تدور | وصلة |
- | محاضرة التصحيح | PPTX |
كما هو موضح أعلاه مباشرة، يمكن العثور على مجموعة الماكرو هنا.
فيما يلي بعض مواصفات المشروع لتقدم تحديًا لإتقانك المتزايد. فيما يلي أوصاف مختصرة جدًا معروضة بالترتيب الأبجدي.
ربما قبل معالجة هذه الأمور، قم بمراجعة برنامج FIZZBUZZ الموصوف بالكامل أولاً.
ثم جرب هذا كمشروعك الأول. مع بعض الأسطر الفارغة والتعليقات يصل وزنه إلى 35 سطرًا.
يوضح مشروع DIRENT كيف يمكن استخدام struct
معقدة في لغة التجميع.
يوضح مشروع PI تعليمات النقطة العائمة. سيقوم البرنامج "برمي السهام على الهدف"، وحساب تقريبي لـ PI من خلال تتبع عدد السهام "التي أصابت الهدف" مقابل إجمالي عدد السهام "التي تم رميها".
يركز مشروع SINE على رياضيات النقطة العائمة ووظائفها.
يستخدم مشروع SNOW تقنية حقبة السبعينيات لتحريك نظام جسيمات بسيط. يوضح هذا المشروع عملية تصميم معقولة لتقسيم المشكلات المعقدة إلى أجزاء أبسط.
يقدم WALKIES رسمًا متحركًا صغيرًا لطيفًا يوضح التكرار مع بعض إلغاء مرجعية المؤشر.
تمتد مسيرة بيري كيفولويتز المهنية في علوم الكمبيوتر إلى ما يقل قليلاً عن خمسة عقود. أطلق أكثر من 5 شركات، معظمها يتعلق بالأجهزة ومعالجة الصور والمؤثرات البصرية (للصور المتحركة والتلفزيون). حصل بيري على تقدير Emmy لعمله في The Gathering، الحلقة التجريبية من Babylon 5. وفي وقت لاحق حصل على جائزة Emmy Award للهندسة مع زملائه في SilhouetteFX, LLC. يتم استخدام SilhouetteFX في كل الصور المتحركة المهمة تقريبًا من أجل التصوير الفوتوغرافي، والطلاء، والتتبع، وإعادة البناء ثنائي الأبعاد إلى ثلاثي الأبعاد، والتركيب، والمزيد.
في عام 1996، حصل بيري على جائزة الأوسكار للإنجاز العلمي والتقني لاختراعه الشكل المدفوع بالتشوه والتحويل. هذه هي التقنية المسؤولة عن العديد من المؤثرات الشهيرة في Forrest Gump وTitanic وStargate.
ثلاثة وعشرون عامًا يمثل العام التاسع عشر لبيري في تدريس علوم الكمبيوتر على مستوى الكلية، وعشر سنوات في جامعة ويسكونسن ماديسون والآن عمره 8+ في كلية قرطاج.
لغة التجميع هي شغف بيري بعد أن عمل في ISAs التالية (بالترتيب الزمني):
يونيفاك 1100
شركة المعدات الرقمية PDP-11
شركة المعدات الرقمية VAX-11
موتورولا 68000
ARM يبدأ بـ AARCH64
هذا العمل إهداء لزوجتي سارة وأبنائي إيان وإيفان.
أنشأ بيري مكتبة تضم حوالي 200 مشروع برمجة مناسبة لفصول CS 1 وCS 2 وهياكل البيانات والشبكات وأنظمة التشغيل وتنظيم الكمبيوتر. إذا كان ناشر الكتب المدرسية لعلوم الكمبيوتر (أو أي محتوى آخر متعلق بعلوم الكمبيوتر) مهتمًا بشراء المكتبة، فيرجى التواصل معنا.
يمكنك أيضًا الاطلاع على Get Off My L@wn، وهي رواية زومبي للمبرمجين.
لقد قرأت ذلك بشكل صحيح... يتقاعد المبرمج النخبة دوج هاندسمان في شمال ولاية ويسكونسن، مسقط رأس زوجته روث آن. وبعد ذلك، حسنًا، تحدث نهاية العالم. الخسارة.
تم تقييمه بـ 4.3 من أصل 5 مع أكثر من 70 تقييمًا، وهو قراءة ممتعة ولا يكلف شيئًا تقريبًا.