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

25 篇文章 0 订阅
0 篇文章 0 订阅

貌似和我学的汇编不一样,我学的是 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


在调用函数内取值区别

交换区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值