使用Hello World程序了解GCC内联汇编

时间:2015-04-19 12:50:13

标签: c gcc assembly inline-assembly

一位朋友帮我提出以下代码,在64位Windows机器上使用GCC中的内联汇编:

int main() {
    char* str = "Hello World";
    int ret;

    asm volatile(
        "call puts"
        : "=a" (ret), "+c" (str)
        :
        : "rdx", "rdi", "rsi", "r8", "r9", "r10", "r11");

    return 0;
}

用-S -masm = intel编译后(我更喜欢Intel语法),我得到这个汇编代码:

    .file   "hello.c"
    .intel_syntax noprefix
    .def    __main; .scl    2;  .type   32; .endef
    .section .rdata,"dr"
.LC0:
    .ascii "Hello World\0"
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    push    rbp
    .seh_pushreg    rbp
    push    rdi
    .seh_pushreg    rdi
    push    rsi
    .seh_pushreg    rsi
    mov rbp, rsp
    .seh_setframe   rbp, 0
    sub rsp, 48
    .seh_stackalloc 48
    .seh_endprologue
    call    __main
    lea rax, .LC0[rip]
    mov QWORD PTR -8[rbp], rax
    mov rax, QWORD PTR -8[rbp]
    mov rcx, rax
/APP
 # 7 "hello.c" 1
    call puts
 # 0 "" 2
/NO_APP
    mov DWORD PTR -12[rbp], eax
    mov QWORD PTR -8[rbp], rcx
    mov eax, 0
    add rsp, 48
    pop rsi
    pop rdi
    pop rbp
    ret
    .seh_endproc
    .ident  "GCC: (x86_64-posix-seh-rev1, Built by MinGW-W64 project) 4.9.2"

它有效,但看起来似乎是多余的代码看起来很混乱。再说一遍,我最后一次组装的经历是80年代的65816,而不是内联。无论如何,我清理了代码,就我所知,以下内容完成了同样的事情:

.intel_syntax noprefix
.data:
    .ascii "Hello World\0"
.text
.globl  main
main:
    sub     rsp, 48 
    lea     rax, .data[rip]
    mov     rcx, rax
    call    puts
    mov     eax, 0
    add     rsp, 48
    ret

更简单。 GCC增加了多少额外的东西?

编辑:不重复,因为除了结构化异常处理之外,我还询问被调用者保存的寄存器,对__main的调用,显式大小指令以及APP / NO_APP部分。

0 个答案:

没有答案