Đây là chương trình C của tôi sử dụng puts()
:sự khác biệt giữa puts và printf trong C biên dịch thành ngôn ngữ hội là gì
#include <stdio.h>
int main(void){
puts("testing");
}
Sau khi sử dụng gcc -S -o sample.s sample.c
để biên dịch nó thành hội, đây là những gì tôi nhận:
.file "sample.c"
.section .rodata
.LC0:
.string "testing"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)
call puts
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.5 20110214 (Red Hat 4.4.5-6)"
.section .note.GNU-stack,"",@progbits
tôi đã làm theo cách tương tự, lần này tôi đã sử dụng printf()
thay vì puts và đây là những gì tôi nhận:
.file "sample.c"
.section .rodata
.LC0:
.string "testing"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, %eax //this is the difference
movl %eax, (%esp)
call printf
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.4.5 20110214 (Red Hat 4.4.5-6)"
.section .note.GNU-stack,"",@progbits
Dưới đây là những gì tôi không hiểu, các printf()
chức năng mov $.LC0
-%eax
, sau đó mov %eax
-(%esp)
trong khi puts()
chức năng mov %.LC0
trực tiếp đến (%esp)
. Tôi không biết tại sao lại như thế.
Có lẽ vì 'printf' là một chức năng varargs, và họ được gọi cách khác nhau từ chức năng mà có một số cố định của các đối số. – Barmar
Thú vị đủ, sử dụng clang trên os x, cả hai chương trình biên dịch vào cùng một hội đồng. – Leandros
Ngoài ra tại sao GCC biên dịch mã phụ thuộc vào vị trí trên linux? – Leandros