انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: خروجی asm از G++/GCC  (دفعات بازدید: 623 بار)

0 کاربر و 1 مهمان درحال مشاهده موضوع.

آفلاین Mohammad reza

  • Jr. Member
  • *
  • ارسال: 27
  • جنسیت : پسر
خروجی asm از G++/GCC
« : 01 فروردین 1396، 11:40 ب‌ظ »
اقا مردم از برنامه زیر :
int f ()
{
return 123 ;
};
به خروجی زیر میرسن (G++/GCC)
f :
mov
ret
eax, 123
اما من بدشنانس از همون برنامه بالا به خروجی زیر میرسم :
https://paste.ubuntu.ir/nwsa
به هر دستوری هم که بگید متوسل شدم از -S بگیر تا -Wa,-ahls
میشه بگید مشکل چیه ؟ چرا من خروجی به اون پیچیدگی رو دریافت میکنم!
iran@Man:~$ uname -a
Linux Man 3.13.0-107-generic #154-Ubuntu SMP Tue Dec 20 09:57:27 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz

آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4872
  • جنسیت : پسر
  • masoft قدیم
پاسخ : خروجی asm از G++/GCC
« پاسخ #1 : 02 فروردین 1396، 02:13 ق‌ظ »
خب خروجی درست همون چیزی هست که دارید، که البته یک سری موارد اضافه داره که می‌تونید حذفش کنید. اگر می‌خواید خواناتر باشه:
gcc -c test.c
objdump -M intel -S test.o
و نتیجه هم این خواهد بود:

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <f>:
   0: 55                    push   rbp
   1: 48 89 e5              mov    rbp,rsp
   4: b8 7b 00 00 00        mov    eax,0x7b
   9: 5d                    pop    rbp
   a: c3                    ret

مقدار return همیشه توی eax ذخیره می‌شه، در نتیجه قبلش باید با یک mov به eax انتقال داده بشه. همچنین چون یک تابع داریم، ابتدا مقدار قبلی اشاره‌گر پایه رو در پشته (استک) ذخیره می‌کنیم، بعد با rsp جایگزینش می‌کنیم و وقتی کارمون تموم شد، مقدار قبلی rbp رو از پشته برمی‌گردونیم.

آفلاین Mohammad reza

  • Jr. Member
  • *
  • ارسال: 27
  • جنسیت : پسر
پاسخ : خروجی asm از G++/GCC
« پاسخ #2 : 18 فروردین 1396، 04:31 ب‌ظ »
ممنون با توضیحات شما مشکلم حل شد.

فقط چرا توی لینوکس به جای EBP از rpb استفاده میکنه.

این مربوط میشه به syntex AT&T Intel یا خود لینوکس یا کامپایلر.... ؟

ممکنه در این مورد هم یکم توضیح بدیدی خیلی گیج م کرده. :o

آفلاین nixoeen

  • ناظر انجمن
  • *
  • ارسال: 4872
  • جنسیت : پسر
  • masoft قدیم
پاسخ : خروجی asm از G++/GCC
« پاسخ #3 : 18 فروردین 1396، 07:04 ب‌ظ »
RBP برای سیستم‌های ۶۴ بیتی هست و EBP برای سیستم‌های ۳۲ بیتی.