stdcall和cdecl
阿新 • • 發佈:2017-12-12
_stdcall mov main $0 cde cdecl round return pan
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
pushl $3
pushl $2
pushl $1
call add
addl $12, %esp
movl %eax, -4(%ebp)
movl $0, %eax
leave
ret
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
pushl $3
pushl $2
pushl $1
call add
movl %eax, -4(%ebp)
movl $0, %eax
leave
ret
紅色部分為不同之處。代碼編譯 在x86_64的機器上 選擇了32位模式 gcc -S 1.c -m32
默認cdecl
int add(int a,int b,int c){
int sum = a+b+c;
return sum;
};
int main(void){
int c=add(1,2,3);
}
add:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 8(%ebp), %edx
movl 12(%ebp), %eax
addl %eax, %edx
movl 16(%ebp), %eax
addl %edx, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
leave
ret
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
pushl $3
pushl $2
pushl $1
call add
addl $12, %esp
movl %eax, -4(%ebp)
movl $0, %eax
leave
ret
stdcall:
int __attribute__((__stdcall__)) add(int a,int b,int c){
int sum = a+b+c;
return sum;
};
int main(void){
int c=add(1,2,3);
}
add:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 8(%ebp), %edx
movl 12(%ebp), %eax
addl %eax, %edx
movl 16(%ebp), %eax
addl %edx, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
leave
ret $12
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
pushl $3
pushl $2
pushl $1
call add
movl %eax, -4(%ebp)
movl $0, %eax
leave
ret
stdcall和cdecl