貌似和我学的汇编不一样,我学的是 mov dest source;而这里的貌似是 movq source dest;
g++ -S filename.c
查看 cat filename.s
原代码
#include<stdio.h>
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
void pq(int &a,int &b)
{
printf("quote a=%d b=%d\n",a,b);
printf("quote &a=%d &b%d\n",&a,&b);
swap(a,b);//交换
}
void p(int *a,int*b)
{
printf("point a=%d b=%d\n",a,b);
printf("point &a=%d &b=%d\n",&a,&b);
printf("point *a=%d *b=%d\n",*a,*b);
swap(*a,*b);//交换
}
int main()
{
int aa=0,bb=1;
printf("main val %d %d\n",aa,bb);
printf("main addr %d %d\n",&aa,&bb);
pq(aa,bb);
printf("after quote swap:a=%d b=%d\n",aa,bb);
p(&aa,&bb);
printf("after point swap:a=%d b=%d\n",aa,bb);
return 0;
}
汇编得到的代码
;注释---貌似和我学的汇编不一样,我学的是 mov dest source;而这里的貌似是 movq source dest;
.file "quote.c"
;注释---void p(int *a,int *b)
.section .rodata ;注释---只读数据段
.LC0:
.string "point a=%d b=%d\n"
.LC1:
.string "point &a=%d &b=%d\n"
.LC2:
.string "point *a=%d *b=%d\n"
.text
.align 2
.globl _Z1pPiS_
.type _Z1pPiS_, @function ;注释---函数段
_Z1pPiS_:
.LFB3:
pushq %rbp ;注释---压栈,环境保护
.LCFI0:
movq %rsp, %rbp;注释---
.LCFI1:
subq $16, %rsp ;注释---
.LCFI2:
movq %rdi, -8(%rbp)
movq %rsi, -16(%rbp)
movq -16(%rbp), %rdx
movq -8(%rbp), %rsi
movl $.LC0, %edi
movl $0, %eax
call printf ;注释---printf("point a=%d b=%d\n",a,b);
leaq -16(%rbp), %rdx
leaq -8(%rbp), %rsi
movl $.LC1, %edi
movl $0, %eax
call printf ;注释---printf("point &a=%d &b=%d\n",&a,&b);
movq -16(%rbp), %rax
movl (%rax), %edx
movq -8(%rbp), %rax
movl (%rax), %esi
movl $.LC2, %edi
movl $0, %eax
call printf ;注释---printf("point *a=%d *b=%d\n",*a,*b);
movq -8(%rbp), %rcx
movq -8(%rbp), %rax
movl (%rax), %edx
movq -16(%rbp), %rax
movl (%rax), %eax
xorl %edx, %eax
movl %eax, (%rcx)
movq -16(%rbp), %rcx
movq -16(%rbp), %rax
movl (%rax), %edx
movq -8(%rbp), %rax
movl (%rax), %eax
xorl %edx, %eax
movl %eax, (%rcx)
movq -8(%rbp), %rcx
movq -8(%rbp), %rax
movl (%rax), %edx
movq -16(%rbp), %rax
movl (%rax), %eax
xorl %edx, %eax
movl %eax, (%rcx) ;注释---swap(*a,*b);//交换
leave
ret
.LFE3:
.size _Z1pPiS_, .-_Z1pPiS_
;注释---end void p()
.globl __gxx_personality_v0
;注释---void pq(int &a,int &b)
.section .rodata;注释---只读数据段
.LC3:
.string "quote a=%d b=%d\n"
.LC4:
.string "quote &a=%d &b%d\n"
.text
.align 2
.globl _Z2pqRiS_
.type _Z2pqRiS_, @function ;注释---函数段
_Z2pqRiS_:
.LFB2:
pushq %rbp
.LCFI3:
movq %rsp, %rbp
.LCFI4:
subq $16, %rsp
.LCFI5:
movq %rdi, -8(%rbp)
movq %rsi, -16(%rbp)
movq -16(%rbp), %rax
movl (%rax), %edx
movq -8(%rbp), %rax
movl (%rax), %esi
movl $.LC3, %edi
movl $0, %eax
call printf
movq -16(%rbp), %rdx
movq -8(%rbp), %rsi
movl $.LC4, %edi
movl $0, %eax
call printf
movq -8(%rbp), %rax
movl (%rax), %edx
movq -16(%rbp), %rax
movl (%rax), %eax
xorl %eax, %edx
movq -8(%rbp), %rax
movl %edx, (%rax)
movq -16(%rbp), %rax
movl (%rax), %edx
movq -8(%rbp), %rax
movl (%rax), %eax
xorl %eax, %edx
movq -16(%rbp), %rax
movl %edx, (%rax)
movq -8(%rbp), %rax
movl (%rax), %edx
movq -16(%rbp), %rax
movl (%rax), %eax
xorl %eax, %edx
movq -8(%rbp), %rax
movl %edx, (%rax)
leave
ret
.LFE2:
.size _Z2pqRiS_, .-_Z2pqRiS_ ;注释---end void pq()
;注释---int main()
.section .rodata;注释---只读数据段
.LC5:
.string "main val %d %d\n"
.LC6:
.string "main addr %d %d\n"
.LC7:
.string "after quote swap:a=%d b=%d\n"
.LC8:
.string "after point swap:a=%d b=%d\n"
.text
.align 2
.globl main
.type main, @function;注释---函数段
main:
.LFB4:
pushq %rbp;注释---环境保护
.LCFI6:
movq %rsp, %rbp
.LCFI7:
subq $16, %rsp
.LCFI8:
movl $0, -4(%rbp)
movl $1, -8(%rbp)
movl -8(%rbp), %edx
movl -4(%rbp), %esi
movl $.LC5, %edi
movl $0, %eax
call printf;注释---printf("main val %d %d\n",aa,bb);
leaq -8(%rbp), %rdx
leaq -4(%rbp), %rsi
movl $.LC6, %edi
movl $0, %eax
call printf;注释---printf("main addr %d %d\n",&aa,&bb);
leaq -8(%rbp), %rsi
leaq -4(%rbp), %rdi
call _Z2pqRiS_
movl -8(%rbp), %edx
movl -4(%rbp), %esi
movl $.LC7, %edi
movl $0, %eax
call printf;注释---printf("after quote swap:a=%d b=%d\n",aa,bb);
leaq -8(%rbp), %rsi
leaq -4(%rbp), %rdi
call _Z1pPiS_
movl -8(%rbp), %edx
movl -4(%rbp), %esi
movl $.LC8, %edi
movl $0, %eax
call printf;注释--- printf("after point swap:a=%d b=%d\n",aa,bb);
movl $0, %eax
leave
ret
.LFE4:
.size main, .-main;注释---end main()
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zPR"
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x6
.byte 0x3
.long __gxx_personality_v0
.byte 0x3
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB3
.long .LFE3-.LFB3
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB3
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.LSFDE3:
.long .LEFDE3-.LASFDE3
.LASFDE3:
.long .LASFDE3-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI3-.LFB2
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI4-.LCFI3
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE3:
.LSFDE5:
.long .LEFDE5-.LASFDE5
.LASFDE5:
.long .LASFDE5-.Lframe1
.long .LFB4
.long .LFE4-.LFB4
.uleb128 0x0
.byte 0x4
.long .LCFI6-.LFB4
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI7-.LCFI6
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE5:
.ident "GCC: (GNU) 4.1.2 20080704 (Red Hat 4.1.2-52)"
.section .note.GNU-stack,"",@progbits
在调用函数内取值区别
交换区别