C-汇编(一)

最近还真是挺忙的,做欢神的小内核实验,读书,学汇编,今天一个朋友问了个问题,  内联函数在传指针参数的时候,有没有拷贝这个指针,然后我就尝试写了个代码,汇编看代码,我去!64位的贝尔实验室汇编,老实说我只会32位因特尔汇编。。。。。。。不过基本上差不多,还基本看懂了,过后我有随手写了个简单的C汇编了下,在纸画了画。居然还挺好懂的。
#include<stdio.h> int main2(){ int a = 100; int b = 25 ; if(a > b ){ printf("The higher value is %d %c\n",a,b); }else{ printf("The higher value is %d %c\n",b,a); } return 0; } int main(){ main2(); }
	.file	"moni.c"    ;文件名
	.section	.rodata
.LC0:
	.string	"The higher value is %d %c\n"
	.text
	.globl	main2
	.type	main2, @function
main2:
.LFB0:
	.cfi_startproc         ;函数开始,进行相关初始化
	pushq	%rbp           ;保存本函数栈指针
	.cfi_def_cfa_offset 16 ;定义偏移量
	.cfi_offset 6, -16
	movq	%rsp, %rbp     ;设置本程序的栈指针
	.cfi_def_cfa_register 6 ;使用寄存器的新值替换旧值
	subq	$16, %rsp      ;预分配栈指针的空间,会以16字节对齐
	movl	$100, -4(%rbp)  ;初始化值
	movl	$25, -8(%rbp)   
	movl	-4(%rbp), %eax
	cmpl	-8(%rbp), %eax   ;if语句
	jle	.L2
	movl	-8(%rbp), %edx
	movl	-4(%rbp), %eax
	movl	%eax, %esi
	movl	$.LC0, %edi
	movl	$0, %eax
	call	printf
	jmp	.L3
.L2:
	movl	-4(%rbp), %edx
	movl	-8(%rbp), %eax
	movl	%eax, %esi    ;esi 指向实参
	movl	$.LC0, %edi   ;edi 指向变参
	movl	$0, %eax
	call	printf        ;调用例程
.L3:
	movl	$0, %eax
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main2, .-main2
	.globl	main
	.type	main, @function
main:
.LFB1:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$0, %eax
	call	main2
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE1:
	.size	main, .-main
	.ident	"GCC: (GNU) 4.9.2 20150212 (Red Hat 4.9.2-6)"
	.section	.note.GNU-stack,"",@progbits

为了以后提高读写汇编的能力,每天反汇编一个程序,读一读。

查看原文:http://zmrlinux.com/2016/07/15/c-%e6%b1%87%e7%bc%96%ef%bc%88%e4%b8%80%ef%bc%89/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值