آزمایشگاه زبان اسمبلی 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
فایل های زیر را خواهید دید
- سلام گاز.s
- hello-nasm.s
- Makefile
حال اجازه میدهیم محتویات فایل hello-gas.s خود را بررسی کنیم که به شکل زیر است
این برنامه در دستور اسمبلر gnu نوشته شده است بنابراین نام hello-gas را دارد
بعدی hello-nasm.s است
شما می توانید تفاوت در نحو دو فایل را مشاهده کنید زیرا این یکی از اسمبلر Netwide استفاده می کند که یک اسمبلر محبوب برای معماری x86 است. ما برای امروز با hello-gas کار خواهیم کرد. بنابراین، اجازه دهید آن را با کامد کامپایل کنیم make hello-gas
.
در معماری aarch64 کامپایل نمی شود زیرا duh!! این فقط برای x86
این یک فایل باینری به نام hello-gas و زمانی که باینری را با کامد اجرا می کنیم تولید می کند ./hello-gas
نتایج زیر را خواهیم دید.
حال اجازه دهید نگاهی به شیء dump این برنامه بیندازیم. می توانید از دستور te استفاده کنید objdump -d hello-gas
که چیزی شبیه به این خواهد بود.
این جداسازی بخش متن. بخش .text شامل دستورالعمل های اجرایی واقعی برنامه است. هنگامی که برنامه اجرا می شود، CPU دستورالعمل های این بخش را می خواند و اجرا می کند.
مرحله 4: برنامه زبان اسمبلی aarch64 را بسازید و اجرا کنید
• به دایرکتوری spo600/examples/hello/assembler/aarch64 بروید.
• از make برای ساخت برنامه زبان اسمبلی استفاده کنید.
• از objdump -d در فایل شی تولید شده برای بررسی کد اسمبلی استفاده کنید.
• کد اسمبلی را با کد منبع C مقایسه کنید و تفاوت ها را یادداشت کنید.
اجازه می دهد تا همان اقدامات را برای برنامه aarch64 انجام دهیم.
وقتی شما یک ls
پس از رفتن به آدرس دایرکتوری فایل های زیر را مشاهده خواهید کرد.
- سلام
- 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
من می دانم، می دانم که شما بچه ها نیاز به بررسی دارید و من شما را منتظر نخواهم گذاشت.
بنابراین، شما را در پست بعدی می بینم.
تا اون موقع کدنویسی مبارک!!!!😉