Chcę się dowiedzieć więcej na temat montażu x86/x86_64. Niestety, jestem na Macu. Nie ma problemu, prawda?Co się dzieje w zestawie Apple LLVM-gcc x86?
$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build
5658) (LLVM build 2336.11.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Napisałem prosty "Hello World" w C, aby uzyskać informację o tym, jakiego rodzaju kodu będę musiał napisać. Zrobiłem trochę x86 Powrót na studiach, i spojrzał liczne tutoriale, ale żaden z nich nie wyglądał na wyjściu szalonym widzę tutaj:
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
subq $32, %rsp
Ltmp2:
movl %edi, %eax
movl %eax, -4(%rbp)
movq %rsi, -16(%rbp)
leaq L_.str(%rip), %rax
movq %rax, %rdi
callq _puts
movl $0, -24(%rbp)
movl -24(%rbp), %eax
movl %eax, -20(%rbp)
movl -20(%rbp), %eax
addq $32, %rsp
popq %rbp
ret
Leh_func_end1:
.section __TEXT,__cstring,cstring_literals
L_.str:
.asciz "Hello, World!"
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame0:
Lsection_eh_frame:
Leh_frame_common:
Lset0 = Leh_frame_common_end-Leh_frame_common_begin
.long Lset0
Leh_frame_common_begin:
.long 0
.byte 1
.asciz "zR"
.byte 1
.byte 120
.byte 16
.byte 1
.byte 16
.byte 12
.byte 7
.byte 8
.byte 144
.byte 1
.align 3
Leh_frame_common_end:
.globl _main.eh
_main.eh:
Lset1 = Leh_frame_end1-Leh_frame_begin1
.long Lset1
Leh_frame_begin1:
Lset2 = Leh_frame_begin1-Leh_frame_common
.long Lset2
Ltmp3:
.quad Leh_func_begin1-Ltmp3
Lset3 = Leh_func_end1-Leh_func_begin1
.quad Lset3
.byte 0
.byte 4
Lset4 = Ltmp0-Leh_func_begin1
.long Lset4
.byte 14
.byte 16
.byte 134
.byte 2
.byte 4
Lset5 = Ltmp1-Ltmp0
.long Lset5
.byte 13
.byte 6
.align 3
Leh_frame_end1:
.subsections_via_symbols
... może teraz wiele się zmieniło trochę, ale to nie jest dokładnie przyjazne, nawet dla kodu zespołu. Ciężko mi o tym opowiadać ... Czy ktoś pomógłby zepsuć to, co się dzieje w tym kodzie i dlaczego to wszystko jest potrzebne?
Wiele, wielkie dzięki z góry.
To nie jest dziwaczne. A jeśli włączysz optymalizację kodu (np. Z '-O2'), prawdopodobnie będzie to miało więcej sensu. –
Witamy w zestawie x86_64. Spróbuj skompilować z opcją '-m32'. To może dać ci bardziej znane wyniki. –
@AlexeyFrunze Właśnie skompilowałem próbkę C Witaj, świecie, który napisałem z -O2, na wszelki wypadek, gdyby nie był już domyślny (byłem przekonany, że gcc używa -O2 domyślnie, jakoś ... może byłem w trakcie moich dni w Gentoo). Kod źródłowy zespołu nie wygląda inaczej niż powyższy kod: –