.fnstart,.fnend等伪操作对assembler的影响?
来源:互联网 发布:淘宝alexa 编辑:程序博客网 时间:2024/06/06 13:59
在汇编语言程序源码中添加.fnstart,.fnend等伪操作,会对汇编器有什么影响呢?
参考上一篇的 编译C/C++语言程序源码生成的汇编语言程序源码中的.fnstart,.fnend等伪操作 文章,依然使用相同的C语言程序源码,将上一篇中生成的两组汇编语言程序源码分别进行汇编,然后再进行反汇编,查看反汇编的汇编代码的差别:
1、汇编arm-c-no-unwind.s:
arm-linux-androideabi-as -o arm-c-no-unwind.o arm-c-no-unwind.s
2、汇编arm-c-unwind.s:
arm-linux-androideabi-as -o arm-c-unwind.o arm-c-unwind.s
3、使用arm-linux-androideabi-objdump工具,对汇编生成的目标文件进行反汇编;
4、反汇编arm-c-no-unwind.o:
arm-linux-androideabi-objdump -D arm-c-no-unwind.o > no-unwind
查看反汇编生成的代码:
arm-c-no-unwind.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <sum>:
0: e52db004 push {fp} ; (str fp, [sp, #-4]!)
4: e28db000 add fp, sp, #0
8: e24dd00c sub sp, sp, #12
c: e50b0008 str r0, [fp, #-8]
10: e50b100c str r1, [fp, #-12]
14: e51b2008 ldr r2, [fp, #-8]
18: e51b300c ldr r3, [fp, #-12]
1c: e0823003 add r3, r2, r3
20: e1a00003 mov r0, r3
24: e24bd000 sub sp, fp, #0
28: e49db004 pop {fp} ; (ldr fp, [sp], #4)
2c: e12fff1e bx lr
00000030 <sub>:
30: e52db004 push {fp} ; (str fp, [sp, #-4]!)
34: e28db000 add fp, sp, #0
38: e24dd00c sub sp, sp, #12
3c: e50b0008 str r0, [fp, #-8]
40: e50b100c str r1, [fp, #-12]
44: e51b2008 ldr r2, [fp, #-8]
48: e51b300c ldr r3, [fp, #-12]
4c: e0633002 rsb r3, r3, r2
50: e1a00003 mov r0, r3
54: e24bd000 sub sp, fp, #0
58: e49db004 pop {fp} ; (ldr fp, [sp], #4)
5c: e12fff1e bx lr
Disassembly of section .comment:
00000000 <.comment>:
0: 43434700 movtmi r4, #14080 ; 0x3700
4: 4728203a ; <UNDEFINED> instruction: 0x4728203a
8: 2029554e eorcs r5, r9, lr, asr #10
c: 00382e34 eorseq r2, r8, r4, lsr lr
Disassembly of section .ARM.attributes:
00000000 <.ARM.attributes>:
0: 00003e41 andeq r3, r0, r1, asr #28
4: 61656100 cmnvs r5, r0, lsl #2
8: 01006962 tsteq r0, r2, ror #18
c: 00000034 andeq r0, r0, r4, lsr r0
10: 726f4305 rsbvc r4, pc, #335544320 ; 0x14000000
14: 2d786574 cfldr64cs mvdx6, [r8, #-464]! ; 0xfffffe30
18: 06003941 streq r3, [r0], -r1, asr #18
1c: 0841070a stmdaeq r1, {r1, r3, r8, r9, sl}^
20: 0a020901 beq 8242c <sub+0x823fc>
24: 12010c03 andne r0, r1, #768 ; 0x300
28: 15011404 strne r1, [r1, #-1028] ; 0x404
2c: 18031701 stmdane r3, {r0, r8, r9, sl, ip}
30: 1a011901 bne 4643c <sub+0x4640c>
34: 1e031b02 vmlane.f64 d1, d3, d2
38: 2a012206 bcs 48858 <sub+0x48828>
3c: Address 0x000000000000003c is out of bounds.
4、反汇编arm-c-unwind.o:
arm-linux-androideabi-objdump -D arm-c-unwind.o > unwind
查看反汇编生成的代码:
arm-c-unwind.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <sum>:
0: e52db004 push {fp} ; (str fp, [sp, #-4]!)
4: e28db000 add fp, sp, #0
8: e24dd00c sub sp, sp, #12
c: e50b0008 str r0, [fp, #-8]
10: e50b100c str r1, [fp, #-12]
14: e51b2008 ldr r2, [fp, #-8]
18: e51b300c ldr r3, [fp, #-12]
1c: e0823003 add r3, r2, r3
20: e1a00003 mov r0, r3
24: e24bd000 sub sp, fp, #0
28: e49db004 pop {fp} ; (ldr fp, [sp], #4)
2c: e12fff1e bx lr
00000030 <sub>:
30: e52db004 push {fp} ; (str fp, [sp, #-4]!)
34: e28db000 add fp, sp, #0
38: e24dd00c sub sp, sp, #12
3c: e50b0008 str r0, [fp, #-8]
40: e50b100c str r1, [fp, #-12]
44: e51b2008 ldr r2, [fp, #-8]
48: e51b300c ldr r3, [fp, #-12]
4c: e0633002 rsb r3, r3, r2
50: e1a00003 mov r0, r3
54: e24bd000 sub sp, fp, #0
58: e49db004 pop {fp} ; (ldr fp, [sp], #4)
5c: e12fff1e bx lr
Disassembly of section .ARM.exidx:
00000000 <.ARM.exidx>:
0: 00000000 andeq r0, r0, r0
4: 00000001 andeq r0, r0, r1
8: 00000030 andeq r0, r0, r0, lsr r0
c: 00000001 andeq r0, r0, r1
Disassembly of section .comment:
00000000 <.comment>:
0: 43434700 movtmi r4, #14080 ; 0x3700
4: 4728203a ; <UNDEFINED> instruction: 0x4728203a
8: 2029554e eorcs r5, r9, lr, asr #10
c: 00382e34 eorseq r2, r8, r4, lsr lr
Disassembly of section .ARM.attributes:
00000000 <.ARM.attributes>:
0: 00003e41 andeq r3, r0, r1, asr #28
4: 61656100 cmnvs r5, r0, lsl #2
8: 01006962 tsteq r0, r2, ror #18
c: 00000034 andeq r0, r0, r4, lsr r0
10: 726f4305 rsbvc r4, pc, #335544320 ; 0x14000000
14: 2d786574 cfldr64cs mvdx6, [r8, #-464]! ; 0xfffffe30
18: 06003941 streq r3, [r0], -r1, asr #18
1c: 0841070a stmdaeq r1, {r1, r3, r8, r9, sl}^
20: 0a020901 beq 8242c <sub+0x823fc>
24: 12010c03 andne r0, r1, #768 ; 0x300
28: 15011404 strne r1, [r1, #-1028] ; 0x404
2c: 18031701 stmdane r3, {r0, r8, r9, sl, ip}
30: 1a011901 bne 4643c <sub+0x4640c>
34: 1e031b02 vmlane.f64 d1, d3, d2
38: 2a012206 bcs 48858 <sub+0x48828>
3c: Address 0x000000000000003c is out of bounds.
通过对比,我们发现unwind.o的反汇编代码比no-unwind.o的反汇编代码多出一个section:
Disassembly of section .ARM.exidx:
00000000 <.ARM.exidx>:
0: 00000000 andeq r0, r0, r0
4: 00000001 andeq r0, r0, r1
8: 00000030 andeq r0, r0, r0, lsr r0
c: 00000001 andeq r0, r0, r1
那么,这个section中的内容的作用是什么呢?
参考ARM文档”ELF for the ARM Architecture“,章节4.4.4,Special Sections,列出了部分ARM special sections,其中有一个就是”.ARM.exidx*“,其类型是SHT_ARM_EXIDX,表示Exception Index table,marks a section containing index information for exception unwinding。Names beginning .ARM.exidx names sections containing index entries for section unwinding.
关于”.ARM.exidx*“中的内容,需要参考文档”Exception Handling ABI for the ARM Architecture“,章节5, INDEX TABLE ENTRIES,
An index table entry consists of 2 words,因此,上面所列的.ARM.exidx section中包含两个index table entries:
- .fnstart,.fnend等伪操作对assembler的影响?
- 编译C/C++语言程序源码生成的汇编语言程序源码中的.fnstart,.fnend等伪操作
- 框架对性能的影响ssh等
- 对subList、substring等获得的子集进行操作会影响原集合
- GNU Assembler 伪指令
- 网站从伪静态换成静态对网站的影响
- 关于masm中OFFSET伪指令对结构的影响
- Nologging操作对standby的影响
- HWM对数据库操作的影响
- 数据压缩对DML操作的影响
- insert 操作对undo的影响
- 经常DML操作对索引的影响
- 移位操作对CPSR的影响
- Perl 上下文及其对操作的影响
- DML操作对索引的影响
- 试验:空调等功率较大电器对信号的影响!
- 操作影响cpsr的条件码的指令(teq等),与影响关系
- 分区表的常用操作对索引的影响
- DB2 9数据库分布式管理之执行节流的实用程序
- MFC利用CFileFind 类实现文件夹的复制
- udp套接字编程 C#
- unable to resolve target “android_8”
- hdu4334 Trouble
- .fnstart,.fnend等伪操作对assembler的影响?
- linux基础操作
- Java之发送邮件
- MFC 删除一个非空文件夹 新建文件夹
- 黑马程序员-面向对象(上)--继承、实现及多态
- 由浅入深探究mysql索引结构原理、性能分析与优化
- 14个简单有用的android源码,适合初学者
- Linux安装、配置sudo
- HDU 2845