رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

سوال

درود و خسته نباشید بر دوستان عزیز؛

در New Features In C درحال بررسی قابلیّت‌های اضافه شده به استانداردهای سی بوده‌اند، درمورد توابع inline به چه صورت کامپایل می‌شود ؟ یک نمونه به این‌صورت نوشته‌ام :

int max_int(const int i, const int j)
{ return (i > j) ? i : j; }

int main (void)
{ return max_int(10, 15); }

و خروجی اسمبلی به این‌صورت می‌باشد :

	.file	"main.c"
	.text
	.globl	max_int
	.type	max_int, @function
max_int:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -4(%rbp)
	movl	%esi, -8(%rbp)
	movl	-4(%rbp), %eax
	cmpl	%eax, -8(%rbp)
	cmovge	-8(%rbp), %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	max_int, .-max_int
	.globl	main
	.type	main, @function
main:
.LFB1:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$15, %esi
	movl	$10, %edi
	call	max_int
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE1:
	.size	main, .-main
	.ident	"GCC: (GNU) 9.1.0"
	.section	.note.GNU-stack,"",@progbits

 

 

و هنگامی که تابع را به صورت inline‌ تعریف می‌کنم:

 

	.file	"main.c"
	.text
	.globl	main
	.type	main, @function
main:
.LFB1:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$15, %esi
	movl	$10, %edi
	call	max_int@PLT
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE1:
	.size	main, .-main
	.ident	"GCC: (GNU) 9.1.0"
	.section	.note.GNU-stack,"",@progbits

هر دو در اینجا max_int را فراخوانی کرده‌اند امّا در خروجی دوّم هیچ label برای max_int تعریف نشده است ! به چه صورت عمل می‌کند ؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

3 پاسخ به این سوال تا کنون داده شده است

پست های پیشنهاد شده

  • 1
در 14 ساعت قبل، قاسم رمضانی منش گفته است :

توضیحاتی که داده است : «توابع inline درواقع دستوراتشان در همان قسمت فراخوانی قرار گرفته و کامپایل می‌شد.»

بله این حرف کاملا درست است! منتهی به لطف پردازشگرهای پیشرفته امروزی وطبعا به لطف instruction های جدید در اسمبلرهای جدید دیگه کدها در محل فراخوانی کامپایل نمی شوند! (PLT@) یعنی ارجاع داینامیکی به کد در زمان اجرا که به نوعی special instruction دستورالعمل CALL محسوب میشود!

جناب رمضانی منش! پیشنهاد میکنم که برای اینکه بتونید جواب خیلی از سوالاتتون را بگیرید کتابهای زیر را مطالعه کنید...

X86 Assembly Language and C Fundamentals - CRC Press-

 C, Assembly and Program Execuation on IntelR 64 Architecture - Apress  -

Introduction to 64 Bit windows Assembly Programming -

  Digital Design, Fundamentals of Computer Architecture and Assembly Language - Springer

Assembly Oxford university press

Computer Organization Basic Processor Structure - CRC Press

در صورتی که تمایل داشتید اعلام کنید که این کتابها را براتون ارسال کنم..

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 21 ساعت قبل، قاسم رمضانی منش گفته است :

هر دو در اینجا max_int را فراخوانی کرده‌اند امّا در خروجی دوّم هیچ label برای max_int تعریف نشده است ! به چه صورت عمل می‌کند ؟

توابع inline و static در C همانند ++C رفتار یکسانی دارند، بنابراین کد در segment .text وجود نخواهد داشت بلکه در segment .bss قرار دارد.!

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
در 2 ساعت قبل، فرهاد شیری گفته است :

بلکه در segment .bss قرار دارد.!

پس برای چه در خروجی اسمبلی تولید شده وجود ندارند ؟ در فیلمی که پیوند آن را ارسال کرده‌ام توضیحاتی که داده است : «توابع inline درواقع دستوراتشان در همان قسمت فراخوانی قرار گرفته و کامپایل می‌شد.» در خروجی اسمبلی دوّم درست است ما تابعی با برچسب max_int (اسم تابع ما در مثال) نداریم امّا فراخوانی آن صورت گرفته است :

call	max_int@PLT

و این قسمتی هست که متوجه نمی‌شم که دقیقاً چی را فراخوانی کرده ؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
پاسخ به این سوال ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...