برنامه نویسی

آزمایشگاه زبان اسمبلی 64 بیت 3 قسمت 2

به همه خوش آمدید!! در آخرین پست چند برنامه اولیه hello world را در معماری x86_64 و aarch64 دیدیم که تفاوت بین 2 و نحوه کار آنها چیست. برنامه هایی که ما تحلیل کردیم در c نوشته شده بودند. اما در پست امروز ما قصد داریم آنها را به زبان اسمبلی در هر دو معماری تحلیل کنیم. و ممکن است دوباره ارزیابی کنیم تصمیم ما در مورد مونتاژ دشوار و خسته کننده است، ممکن است ⚠️.
پس بیایید کارها را شروع کنیم.

مرحله 3: برنامه های زبان اسمبلی x86_64 را بررسی، ساخت و اجرا کنید

• به دایرکتوری spo600/examples/hello/assembler/x86_64 بروید.
• از make برای ساختن برنامه های زبان اسمبلی استفاده کنید.
• از objdump -d روی فایل های شی تولید شده برای بررسی کد اسمبلی استفاده کنید.
• کد اسمبلی را با کد منبع C مقایسه کنید و تفاوت ها را یادداشت کنید.

بنابراین ابتدا باید به آدرسی که همه برنامه ها در آن حضور دارند برویم، می توانیم این کار را با کامد سی دی ساده انجام دهیم. cd spo600/examples/hello/assembler/x86_64 همانطور که قبلاً بایگانی tar را با استفاده از آن استخراج کرده ایم tar xvf /public/spo600-assembler-lab-examples.tgz
اگر شما یک ls فایل های زیر را خواهید دید

  1. سلام گاز.s
  2. hello-nasm.s
  3. Makefile

حال اجازه می‌دهیم محتویات فایل hello-gas.s خود را بررسی کنیم که به شکل زیر است

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttoqq9adfp4yr3fimltp

این برنامه در دستور اسمبلر gnu نوشته شده است بنابراین نام hello-gas را دارد

بعدی hello-nasm.s است

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz4vghlcyzmimk1o3vc64

شما می توانید تفاوت در نحو دو فایل را مشاهده کنید زیرا این یکی از اسمبلر Netwide استفاده می کند که یک اسمبلر محبوب برای معماری x86 است. ما برای امروز با hello-gas کار خواهیم کرد. بنابراین، اجازه دهید آن را با کامد کامپایل کنیم make hello-gas.

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6ston8s9bs1o7h4biji

در معماری aarch64 کامپایل نمی شود زیرا duh!! این فقط برای x86
این یک فایل باینری به نام hello-gas و زمانی که باینری را با کامد اجرا می کنیم تولید می کند ./hello-gas نتایج زیر را خواهیم دید.

https%3A%2F%2Fdev to

حال اجازه دهید نگاهی به شیء dump این برنامه بیندازیم. می توانید از دستور te استفاده کنید objdump -d hello-gas که چیزی شبیه به این خواهد بود.

توضیحات تصویر

این جداسازی بخش متن. بخش .text شامل دستورالعمل های اجرایی واقعی برنامه است. هنگامی که برنامه اجرا می شود، CPU دستورالعمل های این بخش را می خواند و اجرا می کند.

مرحله 4: برنامه زبان اسمبلی aarch64 را بسازید و اجرا کنید

• به دایرکتوری spo600/examples/hello/assembler/aarch64 بروید.
• از make برای ساخت برنامه زبان اسمبلی استفاده کنید.
• از objdump -d در فایل شی تولید شده برای بررسی کد اسمبلی استفاده کنید.
• کد اسمبلی را با کد منبع C مقایسه کنید و تفاوت ها را یادداشت کنید.
اجازه می دهد تا همان اقدامات را برای برنامه aarch64 انجام دهیم.
وقتی شما یک ls پس از رفتن به آدرس دایرکتوری فایل های زیر را مشاهده خواهید کرد.

  1. سلام
  2. Makefile

Hello.s شامل برنامه ما است و Makefile فایلی است که پروژه ما را کامپایل و می سازد همانطور که در آخرین پست من صحبت کردیم.
بیایید ببینیم در hello.s چه چیزی وجود دارد

توضیحات تصویر

توجه داشته باشید که برنامه aarch64 در سیستم x86 کامپایل نمی شود. کاملا رنگارنگ aarch64 درست است! خوشم می آید.

حالا بیایید آن را با آن بسازیم make hello که نتیجه زیر را به ما می دهد.

توضیحات تصویر

شیء dump و execution چیزی شبیه به این است.

توضیحات تصویر

توجه داشته باشید که در هر دو سیستم به غیر از فایل باینری، یک فایل دیگر به نام hello.o در aarch64 و hello-gas.o در x86 در حال تولید است. الان این فایل ها چیه؟

فایل های شی، معمولا با پسوند .o، فایل های میانی هستند که توسط اسمبلر یا کامپایلر از کد منبع تولید می شوند. آنها حاوی کد ماشینی هستند که هنوز به یک برنامه اجرایی کامل پیوند داده نشده است. را .o فایل ها ترجمه کد ماشینی فایل های منبع جداگانه را نشان می دهند. آنها به طور مستقیم قابل اجرا نیستند اما حاوی کدهای کامپایل شده هستند که بعداً به یکدیگر پیوند داده می شوند تا یک فایل اجرایی تشکیل دهند.

وقتی به شما می گویم که اینها فقط اصول اولیه آشنایی ما با اجرا و کامپایل برنامه ها بود، عصبانی نشوید. وظیفه واقعی نوشتن برنامه ای است که کلمه “Loop” یا هر کلمه دیگری را با تعداد شاخص حلقه چاپ کند. حلقه باید 30 بار اجرا شود.

آروم باش و نگران نباش یه راهنمایی داریم!!😅

در اینجا یک حلقه اصلی در اسمبلر AArch64 وجود دارد – این حلقه از 0 تا 9، با استفاده از r19 به عنوان شمارنده شاخص (کنترل حلقه):

 .text
 .globl _start
 min = 0                          /* starting value for the loop index; **note that this is a symbol (constant)**, not a variable */
 max = 10                         /* loop exits when the index hits this number (loop condition is i 0 */
     mov     x8, 93          /* exit is syscall #93 */
     svc     0               /* invoke syscall */
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این کد در حین حلقه زدن هیچ کاری انجام نمی دهد، زیرا بدنه حلقه خالی است. اما می توانیم از این کد استفاده کنیم و آن را با برنامه hello world ترکیب کنیم تا هر بار که حلقه می شود یک کلمه چاپ کند.
من قبلاً کارهای سخت را برای شما انجام دادم و مدتی طول کشید.

افشای کد 🤫

.text
.globl _start
min = 0                          /* starting value for the loop index; **note that this is a symbol (constant)**, not a variable */
max = 30                     /* loop exits when the index hits this number (loop condition is i
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

من می دانم، می دانم که شما بچه ها نیاز به بررسی دارید و من شما را منتظر نخواهم گذاشت.

بنابراین، شما را در پست بعدی می بینم.

تا اون موقع کدنویسی مبارک!!!!😉

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا