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

تازه کار => انجمن تازه‌کاران => نویسنده: Mohammad reza در 01 فروردین 1396، 11:40 ب‌ظ

عنوان: خروجی asm از G++/GCC
ارسال شده توسط: Mohammad reza در 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
عنوان: پاسخ : خروجی asm از G++/GCC
ارسال شده توسط: nixoeen در 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 رو از پشته برمی‌گردونیم.
عنوان: پاسخ : خروجی asm از G++/GCC
ارسال شده توسط: Mohammad reza در 18 فروردین 1396، 04:31 ب‌ظ
ممنون با توضیحات شما مشکلم حل شد.

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

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

ممکنه در این مورد هم یکم توضیح بدیدی خیلی گیج م کرده. :o
عنوان: پاسخ : خروجی asm از G++/GCC
ارسال شده توسط: nixoeen در 18 فروردین 1396، 07:04 ب‌ظ
RBP برای سیستم‌های ۶۴ بیتی هست و EBP برای سیستم‌های ۳۲ بیتی.