Linux Assembly

  • Uploaded by: mohamad amin Rastgoo
  • 0
  • 0
  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Linux Assembly as PDF for free.

More details

  • Words: 1,470
  • Pages: 5
‫بسمه تعالی‬ ‫مبحث اسمبلی در لینوکس شاید یکی از موضوعاتی باشد که بسیار بر روی آن کم کار شده است‪.‬‬ ‫شاید بیشترین علت آن عدم وجود نیازی چون درایورهای نوشته شده توسط اسمبلی در داس باشد‪.‬‬ ‫چرا که تقریبا تمام کارها توسط زبانهایی چون ‪ c‬در لینوکس انجام میشود و آنجا که صحبت از‬ ‫سرعت به میان می آید در نوشتن بوت لودر ‪ ،‬کرنل و سرویسی چون ‪ httpd‬اسمبلی به کار می‬ ‫آید ‪ .‬و احتمال همین باعث میشود که در ابتدای هر کدام از مقالت نوشته شده در این زمینه بخش‬ ‫عظیمی به تلش جهت منصرف کردن شما از نوشتن اسمبلی در لینوکس می کند‪.‬‬ ‫به هر حال در زیر مجالی را به لینوکس اسمبلی اختصاص داده ایم‪:‬‬ ‫یکی از مهمترین تفاوتهای اسمبلی داس و لینوکس این است که در داس بیشتر کارها با ‪interrupt‬‬ ‫داس ‪ int 21h‬د و اینتراپتهای سرویس ‪ bios‬مانند ‪ int 10h‬و ‪ int 16h‬صورت میگیرد در حالی‬ ‫که در لینوکس تمام این کارها توسط کرنل انجام میشود‪.‬همه چیز توسط “‪“kernel system calls‬‬ ‫صورت میگیرد و شما میتوانید کرنل را به وسیله ‪ int 80h‬صدا بزنید‪(.‬همچنین میتوانید از‬ ‫کتابخانه های ‪ libc‬استفاده کنید که ممکن است راحت تر باشد اما برنامه نوشته شده را وابسته به‬ ‫کتابخانه های مذکور میکند )‪ .‬یک چیز شگفت آور در مورد لینوکس این است که نسبت به داس‬ ‫کمتر میباشند(حدود ‪ (190‬ولی کارآتر هستند‪ .‬سیستم کال های لینوکس فایلها را ایجاد میکنند و‬ ‫پروسه ها را تحویل میگیرند وکارهای مفیدی دیگری را انجام میدهند‪.‬‬ ‫کامپایلر های اسمبلی در لینوکس بسایر زیادتر از آنند که بخواهیم مجالی را به بررسی هر کدام‬ ‫اختصاص دهیم ‪ .‬که این در واقع یکی از مزایای ‪ open source‬میباشد که برای انجام هر کار‬ ‫چندین نرم افزار جدا موجود میباشد‪.‬‬ ‫در زیر لیستی را از چندین اسمبلر لینوکس میبینیم سپس به بررسی ‪ GAS‬و ‪ GCC‬و ‪NASM‬‬ ‫میپردازیم‪:‬‬ ‫‪GCC Inline assembly.1‬‬ ‫‪GAS.2‬‬ ‫‪NASM.3‬‬ ‫‪AS86.4‬‬ ‫‪YASM.5‬‬ ‫‪FASM.6‬‬ ‫‪(OSIMPA(SHASM.7‬‬ ‫‪TDASM.8‬‬ ‫‪HLA.9‬‬ ‫‪TALK.10‬‬ ‫‪FREE PASCAL.11‬‬ ‫‪Win32Forth assembler.12‬‬ ‫‪Terse.13‬‬ ‫در میان اسمبلرهای فوق که هر یک ‪ Syntax‬خود را دارا میباشد از اسمبلرهای ‪ 1-4‬استفاده‬ ‫بیشتری میشود و ما بقی شهرت چندانی ندارند ‪ .‬حال آنکه ‪ HLA‬در واقع ‪high level‬‬ ‫‪ assembly‬بوده و دارای ‪ syntax‬ای مشابه زبانهایی چون ‪ C‬میباشد‪.‬‬

‫کتاب ‪ Art of assembly‬که یکی از کتابهای مرجع جهت آموزش زبان اسمبلی میباشد در‬ ‫نسخه موجود لینوکسی خود از این ‪ syntax‬استفاده کرده است‪.‬‬ ‫قبل از ادامه اجازه دهید دو ‪ syntax‬مختلف ‪ AT&T‬و ‪ Intel‬را که بیشترین ‪ Syntax‬های‬ ‫مورد استفاده در لینوکس میباشند بررسی کنیم‪:‬‬ ‫‪ :AT&T‬شباهت زیادی به ‪ Intel syntax‬دارد با تفاوتهای خاص زیر‪:‬‬ ‫در ‪ syntax‬اینتل در دستورتی چون ‪ mov‬ابتدا ‪ dest‬و سپس ‪ source‬می آید‬ ‫‪Mov ax,3‬‬ ‫در حالی که در ‪ AT&T‬این برعکس است و ابتدا ‪ source‬و سپس ‪ destination‬می آید‪ .‬برای‬ ‫دستورات ‪ mov‬و ‪ Add‬و ‪ ...‬باید نوع متغیر را مشخص کرد مثل در صورتی که متغیر ما از‬ ‫نوع ‪ long‬میباشد باید از دستور ‪ movl‬استفاده کرد‪ .‬در ابتدای نام رجیستر ها باید از علمت ‪%‬‬ ‫و ابتدای نام ثابت ها باید از ‪ $‬استفاده کرد‪ .‬و کامنت ها با ‪ #‬به نمایش می آیند‪.‬‬ ‫‪Movl $0,%ebx‬‬ ‫‪PUT 0 IN EBX#‬‬ ‫همچنین فایل های اسمبلی در این ‪ Syntax‬به صورت ‪ s.‬ذخیر میشوند‪.‬‬ ‫‪:Intel syntax‬‬ ‫با این ‪ syntax‬به اندازه کافی آشنا میباشید ‪.‬‬ ‫‪:GCC Inline assembly‬‬ ‫‪ Gcc‬به عنوان یکی از کمپایلرهای مشهور لینوکس که زبانهای مختلفی را پشتیبانی میکند اسمبلر‬ ‫ناشناخته ای نیست‪ GCC .‬تا چندی پیش تنها از ‪ AT&T Syntax‬پشتیبانی میکرد ‪ .‬به طوری‬ ‫که هر جا اسم ‪ gcc‬به میان می آید صحبت از ‪ AT&T Syntax‬به میان می آید)‪ .‬همچنین گاه از‬ ‫‪ Inline assembly‬صحبت به میان می آید ‪ .‬که از لحاظ ‪ syntax‬همان ‪AT&T syntax‬‬ ‫میباشد( اما در ورژن های اخیر ‪ gcc‬پشتیبانی ‪ Intel syntax‬را اضافه کرده است‪ .‬که متاسفانه‬ ‫داکیومنت مفیدی در این رابطه پیدا نکردم‪ .‬بهترین مزیت ‪ gcc‬نسبت به دیگر اسمبلر زمانی است‬ ‫که از کدهای اسمبلی در میان کدهای زبان دیگری همچون ‪ C‬استفاده کرده ایم که کار ما را‬ ‫راحت میکند‪.‬‬ ‫‪:GAS‬‬ ‫یکی از اسمبلر های مشهور و محبوب لینوکس میباشد که مخفف ‪ GNU Assembler‬بوده و بر‬ ‫پایه ‪ GCC‬میباشد‪ .‬این اسمبلر برای ‪ Syntax AT&T‬بوده ولی اخیرا پشتیبانی ‪Intel syntax‬‬ ‫را اضافه کرده است‪ .‬که باید از دایرکتیو ‪ Intel syntax.‬استفاده شود‪ .‬متاسفانه هنوز کتابخانه‬ ‫های مربوطه ‪ document‬نشده اند‪.‬‬ ‫‪:NASM‬‬ ‫‪ Net wide Assembler project‬که یک اسمبلر ‪ i386‬میباشد که توسط ‪ c‬نوشته شده است‪.‬‬ ‫‪ Syntax‬مورد استفاده ‪ Intel Syntax‬میباشد و فرمت های ‪ object‬فایل زیر را پشتیبانی میکند‪:‬‬ ‫‪Bin,aout,coff,elf,as86,obj)DOS(,win32,rdf‬‬ ‫‪ Nasm‬با ‪ parser‬نوشته شده دستی خود سریعتر از ‪ GAS‬میباشد ولی برخی ساختارها را‬ ‫پشتیبانی نمی کند ‪ .‬به هر حال برای ‪ Intel Syntax‬این اسمبلری میباشد که پیشنهاد میشود‪.‬‬

.‫ میپردازد‬Nasm syntax ‫ با‬assembly ‫این نوشته به بررسی برنامه نویسی‬

: hello world ‫یک برنامه‬ :AT&T Syntax data # section declaration. :msg string "Hello, world!\n" # our dear string. Len = . -- msg # length of our dear string text # section declaration. we must export the entry point to the ELF linker or # global _start # loader. They conventionally recognize _start as their. .entry point. Use ld --e foo to override the default # :start_ write our string to stdout # movl $len,%edx # third argument: message length movl $msg,%ecx # second argument: pointer to message to write )movl $1,%ebx # first argument: file handle )stdout )movl $4,%eax # system call number )sys_write int $0x80 # call kernel and exit # movl $0,%ebx # first argument: exit code )movl $1,%eax #system call number )sys_exit int $0x80 # call kernel

:Intel Syntax msg db "Hello, world!",0xa ;our dear string len equ $ - msg ;length of our dear string section .text ;section declaration we must export the entry point to the ELF linker or ; global _start ;loader. They conventionally recognize _start as their .entry point. Use ld -e foo to override the default ; :start_

‫; ‪write our string to stdout‬‬ ‫‪mov edx,len‬‬ ‫‪;third argument: message length‬‬ ‫‪mov ecx,msg‬‬ ‫‪;second argument: pointer to message to write‬‬ ‫‪(mov ebx,1‬‬ ‫‪;first argument: file handle (stdout‬‬ ‫‪(mov eax,4‬‬ ‫‪;system call number (sys_write‬‬ ‫‪int 0x80‬‬ ‫‪;call kernel‬‬ ‫; ‪and exit‬‬ ‫‪mov ebx,0‬‬ ‫‪;first syscall argument: exit code‬‬ ‫‪(mov eax,1‬‬ ‫‪;system call number (sys_exit‬‬ ‫‪int 0x80‬‬ ‫‪;call kernel‬‬ ‫کامپایل کردن (اسمبل کردن( برنامه در لینوکس‪:‬‬ ‫برای کامپایل کردن برنامه با ‪ Intel syntax‬از دستور زیر استفاده کنید‪:‬‬ ‫‪$ nasm −f elf hello.asm‬‬

‫خروجی برنامه به فرمت ‪ elf‬خواهد بود‬ ‫برای کامپایل کردن برنامه با ‪ AT&T Syntax‬از دستور زیر استفاده کنید‪:‬‬ ‫‪$ as −o hello.o hello.S‬‬

‫دستور ذکرشده تنها فایل ‪ object‬را تولید میکند برای لینک کردن فایل مذکور و ساختن فایل قابل‬ ‫اجرا باید از دستور ‪ ld‬استفاده کرد‪ ld .‬لینکر استاندارد محیط لینوکس میباشد توجه داشته باشید که‬ ‫در ‪ gcc‬لینک کردن به صورت خودکار انجام میشود و در صورتی که نخواهید که عمل لینک‬ ‫شدن انجام شود باید از سویچ های مربوطه استفاده کنید‪.‬‬ ‫‪$ ld −s −o hello hello.o‬‬

‫سویچ –‪ o‬به ‪ ld‬میگوید که نام فایل خروجی را ‪ hello‬بگذارد‪.‬‬ ‫‪ Debug‬کردن برنامه در ‪:Linux‬‬ ‫برای ‪ debug‬کردن یک برنامه در محیط تکست میتوان از ‪ gdb‬استفاده کرد و در محیط ‪gui‬‬ ‫نیز میتوان از ‪ ddd‬که ربط گرافیکی ‪ gdb‬میباشد استفاده کرد‪ .‬برای استفاده از ‪ gdb‬برای‬ ‫‪ debug‬کرن یک برنامه که میخواهید توسط ‪ gcc‬کامپایل کنید از سویچ ‪ g-‬استفاده کنید‪.‬‬ ‫‪ Debugger‬های زیادی برای محیط لینوکس وجود دارد که میتوانید از آنها استفاده کنید ‪.‬‬ ‫همچنین محیط برنامه نویسی ‪ Kdevelop‬ابزار بسیار قوی ای جهت نوشتن برنامه در لینوکس‬ ‫را برای شما فراهم میکند و ‪ debugger‬خوبی را نیز در اختیر شما قرار میدهد‪.‬‬

‫ورودی و خروجی در ‪:Linux assembly‬‬ ‫برخی استفده از ‪ libc‬را تنها راه بیان میکنند و استفاده مستقیم از ‪ system call‬ها را راه‬ ‫خوبی نمیدانند این در حالی است که در بیشتر موارد تنها کار اضافه ای که در توابع ‪ libc‬انجام‬ ‫میشود چک کردن برخی از پارامترها و ‪ ...‬میباشد و سپس ‪ system call‬مذکور صدا زده‬ ‫میشود‪.‬‬ ‫برای استفاده از ‪ system call‬ها ‪:‬‬ ‫‪.1‬شماره ‪ sysyemcall‬را در رجیستر ‪ eax‬قرار دهید‬ ‫‪.2‬پارامترهای دیگر را در رجیسترهای ‪ ebx‬و ‪ ecx‬و ‪ ...‬قرار دهید‬ ‫‪.3‬کرنل را صدا بزنید(‪)int 80h‬‬ ‫‪.4‬نتیجه در رجیستر ‪ eax‬برگردانده میشود‪.‬‬ ‫برای مثال در انتهای برنامه کد زیر نوشته میشود‪:‬‬ ‫‪; The exit syscall number‬‬ ‫‪; Have an exit code of 0‬‬ ‫‪; call kernel‬‬

‫‪eax,1‬‬ ‫‪ebx,0‬‬ ‫‪80h‬‬

‫‪mov‬‬ ‫‪mov‬‬ ‫‪int‬‬

‫نوشن ماکرو در ‪:NASM‬‬ ‫‪:Single line macros‬‬ ‫در اسمبلی علمت ‪ %‬در ابتدای یک دایرکتیو آن را به ‪ preprocessor‬به عنوان یک‬ ‫‪ preprocessor directive‬معرفی میکند ‪.‬‬ ‫برای داشتن یک ماکرو در یک خط مانند زبان ‪ c‬میتوانیم از ‪ define‬استفاده کنیم ‪))define%‬‬ ‫& ‪%define ctrl 0x1F‬‬ ‫‪:multiple line macros‬‬ ‫تعریف ماکروهای ‪ multiple line‬شباهت بیشتری به تعریف ماکرو در ‪ MASM‬دارد‬ ‫تعریف ماکرو با ‪ macro%‬شروع شده و با ‪ endmacro%‬پایان میپذیرد‬ ‫‪%macro prologue 1‬‬ ‫‪push ebp‬‬ ‫‪mov ebp,esp‬‬ ‫‪sub esp,%1‬‬ ‫‪%endmacro‬‬

Related Documents

Linux Assembly
November 2019 18
Assembly
November 2019 72
Assembly
May 2020 56
Assembly
November 2019 58
Assembly
August 2019 45
Assembly
June 2020 29

More Documents from ""

Linux Assembly
November 2019 18
April 2020 10
Linux
November 2019 37
Ant
November 2019 38
November 2019 16
November 2019 14