您的位置:首页 > 运维架构 > Linux

Linux下C++汇编查看指针和引用区别

2017-01-12 11:49 330 查看
貌似和我学的汇编不一样,我学的是 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


在调用函数内取值区别



交换区别

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: