免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4844 | 回复: 1
打印 上一主题 下一主题

[BootLoader] 如何查看C或汇编的源代码所对应的真正的汇编代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-01 21:18 |只看该作者 |倒序浏览
本帖最后由 crifan 于 2011-05-01 21:22 编辑

1.1.如何查看C或汇编的源代码所对应的真正的汇编代码

首先解释一下,由于汇编代码中会存在一些伪指令等内容,所以,写出来的汇编代码,并不一定是真正可以执行的代码,这些类似于伪指令的汇编代码,经过汇编器,转换或翻译成真正的可以执行的汇编指令。所以,上面才会有将“汇编源代码”转换为“真正的汇编代码”这一说。

然后,此处对于有些人不是很熟悉的,如何查看源代码真正对应的汇编代码。

此处,对于汇编代码,有两种:

一种是只是进过编译阶段,生成了对应的汇编代码

另外一种是,编译后的汇编代码,经过链接器链接后,对应的汇编代码。

总的来说,两者区别很小,后者主要是更新了外部函数的地址等等,对于汇编代码本身,至少对于我们一般所去查看源代码所对应的汇编来说,两者可以视为没区别。

在查看源代码所对应的真正的汇编代码之前,先要做一些相关准备工作:

[编译uboot]

在Linux下,一般编译uboot的方法是:

1. make distclean

去清除之前配置,编译等生成的一些文件。

2. make EmbedSky_config

去配置我们的uboot

3. make

去执行编译

【查看源码所对应的汇编代码】

对于我们此处的uboot的start.S来说:

(1)对于编译所生成的汇编的查看方式是:

用交叉编译器的dump工具去将汇编代码都导出来:

arm-linux-objdump –d cpu/arm920t/start.o > uboot_start.o_dump_result.txt

这样就把start.o中的汇编代码导出到uboot_start.o_dump_result.txt中了。

然后查看uboot_start.o_dump_result.txt,即可找到对应的汇编代码。

举例来说,对于start.S中的汇编代码:

  1. /* Set up the stack */
  2. stack_setup:
  3. ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
  4. sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
  5. sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */

  6. #ifdef CONFIG_USE_IRQ
  7. sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
  8. #endif
  9. sub sp, r0, #12 /* leave 3 words for abort-stack */

  10. bl clock_init
复制代码

去uboot_start.o_dump_result.txt中,搜索stack_setup,即可找到对应部分的汇编代码:


  1. 00000090 <stack_setup>:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
  2.   90:      e<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />51f0058     ldr   r0, [pc, #-88]       ; 40 <_TEXT_BASE>
  3.   94:      e2400701    sub r0, r0, #262144    ; 0x40000
  4.   98:      e2400080    sub r0, r0, #128   ; 0x80
  5.   9c:      e240d00c    sub sp, r0, #12    ; 0xc
  6.   a0:      ebfffffe        bl    0 <clock_init>
复制代码

(2)对于链接所生成的汇编的查看方式是:

和上面方法一样,即:

arm-linux-objdump –d u-boot > whole_uboot_dump_result.txt

然后打开该txt,找到stack_setup部分的代码:


  1. 33d00090 <stack_setup>:
  2. 33d00090:    e51f0058     ldr   r0, [pc, #-88]       ; 33d00040 <_TEXT_BASE>
  3. 33d00094:    e2400701    sub r0, r0, #262144    ; 0x40000
  4. 33d00098:    e2400080    sub r0, r0, #128   ; 0x80
  5. 33d0009c:    e240d00c    sub sp, r0, #12    ; 0xc
  6. 33d000a0:    eb000242    bl    33d009b0 <clock_init>
复制代码

两者不一样地方在于,我们uboot设置了text_base,即代码段的基地址,上面编译后的汇编代码,经过链接后,更新了对应的基地址,所以看起来,所以代码对应的地址,都变了,但是具体地址中的汇编代码,除了个别调用函数的地址和跳转到某个标号的地址之外,其他都还是一样的。

对于C语言的源码,也是同样的方法,用对应的dump工具,去从该C语言的.o文件中,dump出来汇编代码。

【总结】


不论是C语言还是汇编语言的源文件,想要查看其对应的生成的汇编代码的话,方法很简单,就是用dump工具,从对应的.o目标文件中,导出对应的汇编代码,即可。

论坛徽章:
0
2 [报告]
发表于 2011-05-01 21:23 |只看该作者
懒得弄了,本来好好的颜色和字体,从word粘贴到这里,编辑的时候可以保持原状,发布后,颜色字体,格式,都丢失了。。。一坨杯具。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP