انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: Mehrdad Dolatkhah در 22 آبان 1393، 10:24 قظ
-
سلام به همه عزیزان
بنده به تازگی به دنیای لینوکس وارد شدم و سوال های زیادی برام بوجود امده . یکی از این سوال ها اینه که چطوری یه برنامه اسمبلی ساده رو با nasm یا emacs بنویسم و اجراش کنم .
-
درود بر تو. به دنیای آزاد خوش اومدی.
نخستین راهنمایی که میتونم بهش بکنم اینه که اسم این سیستمعامل زیبای ما لینوکس نیست. لینوکس تنها یکی از برنامههاییه که ما روی این سیستمعامل داریم. اسم درست اون گنو/لینوکسه که یعنی سیستمعامل گنو به اضافهی لینوکس به عنوان کرنل. حالا با توجّه به این نکته به سراغ پاسخ پرسشت میریم.
اسمبلر گنو (GNU assembler) بخشی از بستهی GNU Bin-utils هست که به صورت پیشفرض در توزیعهای گنو/لینوکس مثل اوبونتو نصبه. برای اجرای اون میتونی از عبارت as که مخفّف assembler استفاده کنی. برای یاد گرفتن کار با این برنامه مثل همهی برنامههای دیگه میتونی از برنامهی man که مخفّف manual هست استفاده کنی. کافیه ترمینال رو باز کنی و بنویسی:
$ man as
تا راهنمای ۱۳۹۸ خطی اون رو ببینی. خلاصهای اون به این صورته که fه فرض اگه اسم پروندهای که توش اسمبلی نوشتی باشه hello.s و محتویاتش این باشه:
.data
.globl hello
hello:
.string "Hello, world!"
.text
.global main
main:
pushq %rbp
movq %rsp, %rbp
movq $hello, %rdi
call puts
movq $0, %rax
leave
ret
ایتدا باید بزنی:
$ as hello.s -o hello.o
تا as کدت رو تبدیل به آبجکت hello.o کنه. در مرحلهی بعد باید از لینکر گنو (GNU linker) استفاده کنی که اون هم توی همون بستهاست و با دستور ld میشه اجراش کرد. یعنی بنویسی:
$ ld hello.o -o hello
تا ld آبجکت hello.o رو تبدیل به پروندهی اجرای hello کنه.
البته استفاده از این روش به صورت خام ممکنه برات سخت باشه. در این صورت میتونی از فرانتاند GCC که سرنام GNU Compiler Collection هست برای این کار استفاده کنی. طبق نمونهی بالا میتونی با این دستور از کدت خروجی بگیری:
$ gcc hello.s -o hello
این دستور gcc رو اجرا میکنه و بهش میگه پروندهی hello.s رو کامپایل (در اینجا اسمبل) کن و خروجی اون رو در قالب پروندهی اجرایی به نام hello بهم بده.
حالا میتونی hello رو اجرا کنی، ولی قبل از هرچیز باید بهش دسترسی اجرایی بدی. اینجوری:
$ chmod +x hello
حالا میتونی اون رو اجرا کنی:
$ ./hello
به همین راحتی
-
البته as از سینتکس AT&T بهره می گیره.
برای کار با سینتکس اینتل همون nasm رو نصب کن.
ویرایش: این خود آموز می تونه مفید باشه:
http://docs.cs.up.ac.za/programming/asm/derick_tut/ (http://docs.cs.up.ac.za/programming/asm/derick_tut/)
-
درود و شاد باش
دوستان بابت اطلاعاتی که به بنده دادید ازتون ممنونم.واقعا دنیای جالبیه !
خیلی خوشحالم که به این دنیا جالب امدم و در کنار شما عزیزانم .
دوستان برای شروع برنامه نویسی با اسمبلی چه منبعی رو استفاده کنم ؟ (سابقه برنامه نویسی بصورت کاملا مبتدی رو دارم ) و سطح دانشم هم در سطح همون دانشگاه هستش ! (متوجه شدید که منظورم چیه دیگه ؟!)