نظيفة X86_64 إخراج التجميع مع دول مجلس التعاون الخليجي؟ [مكرر

StackOverflow https://stackoverflow.com/questions/1481520

  •  18-09-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

لقد قمت بتدريس نفسي جمعية جنو لفترة من الوقت الآن عن طريق كتابة البيانات في C، وتجميعها مع "دول مجلس التعاون الخليجي -S" ودراسة الإخراج. يعمل هذا على ما يرام على X86 (وتجميع مع -M32) ولكن على صندوق AMD64 الخاص بي، لهذا الرمز (بمجرد المثال):

int main()
{
    return 0;
}

GCC يعطيني:

 .file "test.c" .Text .globl. الرئيسية،.-الرئيسية. شخص .EH_FRAME، "A"، @ progbits .lframe1: .long .LECIE1-.LSCIE1 .LSCIE1: .long 0x0 .byte 0x1 .byte 0x1. . uleb128 0x1 .byte 0x3.byte 0xc .ulyb128 0x7 .ulyb128 0x8.byte 0x90 .ulyb128 0x1.align 8.lecie1: .lsfde1: .long.lefde1-.lasfde1 .lasfde1: .lasfde1: .long.lasfde1-. LFB2 .long .lfe2-.lfb2 .ulyb128 0x0 .byte 0x4.long .lcfi0-.lfb2 .byte 0xe .ulyb128 0x10.byte 0x86.ulyb128 0x2 .byte 0x4 .byte 0x4.logfi1-.lcfi0. محاذاة 8 .LEFDE1:

مقارنة مع:

 .file "test.c". الإختيار .globl الرئيسية. Type الرئيسية، @ Main الرئيسية: Leal 4 (٪ ESP)،٪ ECX ANDL $ -16،٪ ESP Pushl -4 (٪ ECX) Pushl٪ EBP Movl٪ ESP، ٪ ebp pushl٪ ECX MOVL $ 0،٪ EAX POPL٪ ECX POPL٪ EBP LEAL -4 (٪ ECX)،٪ ESP RET. الحجم الرئيسي،.-Main. ". البيانات .note.gn-stack،"، @ progbits

على X86.

هل هناك طريقة لجعل دول مجلس التعاون الخليجي -S على إخراج x86_64 دون الزغب؟

هل كانت مفيدة؟

المحلول

الاشياء التي تدخل .eh_frame القسم هو الواصفات المفترضة، والتي تحتاجها فقط لاسترداد المكدس (على سبيل المثال مع GDB). أثناء تعلم التجميع، يمكنك ببساطة تجاهلها. هنا طريقة للقيام ب "التنظيف" الذي تريده:

gcc -S -o - test.c | sed -e '/^\.L/d' -e '/\.eh_frame/Q'
        .file   "test.c"
        .text
.globl main
        .type   main,@function
main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $0, %eax
        leave
        ret
        .size   main,.Lfe1-main

نصائح أخرى

يمكنك محاولة وضع الرمز الذي تريد دراسته في وظيفة.

على سبيل المثال:

int ftest(void)
{
    return 0;
}

int main(void)
{
    return ftest();
}

إذا نظرت إلى مصدر التجميع للاختبار، فسيكون نظيفا كما تحتاج.

..snip..
test:
.LFB2:
        pushq   %rbp
.LCFI0:
        movq    %rsp, %rbp
.LCFI1:
        movl    $0, %eax
        leave
        ret
..snip..

لقد وجدت أن استخدام -Os العلم يجعل الأمور أكثر وضوحا. لقد جربت ذلك مثالك الصغير، لكنه حقق اختلافا بسيطا للغاية.

ومع ذلك، أتذكر أنه مفيد عندما كنت أتعلم التجميع (على سبارك).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top