2
回答
AT&T 汇编中的.cfi 系列的指令是干嘛用的?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

对一个.c 文件 进行了 g++ -S xx.c 的处理,

有几点疑问想请各位大牛指点一下 。 基本上都是想问在我的.s文件中的.cfi系列的指令都是些什么用途。


.file	"test.cpp"
	.section	.rodata
.LC0:
	.string	"hello"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$16, %esp
	movl	$.LC0, (%esp)
	call	puts
	movl	$0, %eax
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
	.section	.note.GNU-stack,"",@progbits
问题1 .cfi系列的指令都是干嘛用的(如上面的: .cfi_startproc,.cfi_endproc, .cfi_def_cfa_offset 8,.cfi_offset 5, -8),请大牛们给一个简短介绍,这些都做了什么事情,因为我觉得没有这些东西,我的程序也照样跑来着。


问题2 在哪可以找到这一系列指令的帮助和参考文档

问题3 【调用函数的时候】在网上看到说会先push一个return address 进来,也就是说在调用函数的时候,在函数的内部,会先push一个返回地址等待ret 重设ip寄存器?

    比如call func的过程是如下

        //1 . 准备参数    

        pushl arg1

        pushl arg2

        //2 . 调用func  

        call func

                            

        /*[func的定义如下]*/

        .type     func,@function

        func:

                                //<-----在这里(或者是别的地方)会隐性的放一个return address? 然后等待ret指令用它?

        enter

        dosomestring

        leave

        ret

问题3.1 【接着上面的那段code】参数的使用

        我要在func中使用上面的arg2 则需要8(%ebp)我要使用arg1 则要使用12(%ebp)就是因为 多了一个return adress? 


问题4    ret之后的指令有什么用处

        当改变cs:ip之后 那么最上面那段代码中的.cfi_endproc指令 还能干嘛? 

<无标签>
举报
云松
发帖于5年前 2回/3K+阅
顶部