Linux下C++汇编查看指针和引用区别
2017-01-12 11:49
330 查看
貌似和我学的汇编不一样,我学的是 mov dest source;而这里的貌似是 movq source dest;
g++ -S filename.c
查看 cat filename.s
原代码
汇编得到的代码
在调用函数内取值区别
交换区别
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
在调用函数内取值区别
交换区别
相关文章推荐
- C++中指针(pointer)和引用(reference)的区别和联系
- C++ 指针与引用的区别
- C++中指针和引用的区别
- C++中指针和引用的区别
- [More Effective C++]条款一:指针与引用的区别
- c++中的引用与指针的区别
- C++中指针和引用的区别
- C++指针与引用的区别
- c++中引用和指针的区别
- c++中,引用和指针的区别
- c++中引用和指针的区别
- java中的引用和C++中的指针的区别
- java中的引用和C++中的指针的区别
- 通过汇编代码看引用和指针的区别
- 指针与引用的区别c++
- c++中的引用与指针的区别
- C++中引用和指针的区别
- 重新巩固C++指针和引用的区别
- C++中引用和指针的两个重要区别
- (转)C++中指针和引用的区别