反汇编Dis解析

反汇编dis解析

关于段,反汇编文件中包含了代码段,数据段,bss段,comm段和注释段.

COMM段BSS段#

对于全局变量来说,如果初始化了不为0的值,那么该全局变量则被保存在data段,如果初始化的值为0,那么将其保存在bss段,如果没有初始化,则将其保存在common段,等到链接时再将其放入到BSS段。关于第三点不同编译器行为会不同,有的编译器会把没有初始化的全局变量直接放到BSS段。

参考 链接脚本.md

Copy
Disassembly of section .text: Disassembly of section .data: Disassembly of section .rodata: // 只读数据段(const全局变量) Disassembly of section .bss: //(初始值为0,无初始值的全局变量) Disassembly of section .comment:

COMM段BSS段#

这两个段并不在bin文件中保存,可以查看反汇编的代码前面的标号与bin的大小对比.所以实际上bss段代码的实现要自己写的.

注释段#

这个在反汇编文件的最下方,类似如下,其实他是字符串的asc编码,复制到winhex中查看一下即可

Copy
00000000 <.comment>: 0: 43434700 cmpmi r3, #0 ; 0x0 4: 4728203a undefined 8: 2029554e eorcs r5, r9, lr, asr #10 c: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1} 10: 47000035 smladxmi r0, r5, r0, r0 14: 203a4343 eorcss r4, sl, r3, asr #6 18: 554e4728 strplb r4, [lr, #-1832] 1c: 2e332029 cdpcs 0, 3, cr2, cr3, cr9, {1} 20: 00352e34 eoreqs r2, r5, r4, lsr lr 24: 43434700 cmpmi r3, #0 ; 0x0 28: 4728203a undefined 2c: 2029554e eorcs r5, r9, lr, asr #10 30: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1} 34: 47000035 smladxmi r0, r5, r0, r0 38: 203a4343 eorcss r4, sl, r3, asr #6 3c: 554e4728 strplb r4, [lr, #-1832] 40: 2e332029 cdpcs 0, 3, cr2, cr3, cr9, {1} 44: 00352e34 eoreqs r2, r5, r4, lsr lr

注意使用hex格式复制,显示的是gcc的版本,这里是直接列复制的,实际的需要按地址排序,小端模式

mark

mark

Bl指令#

反汇编的Bl指令中的地址,并不是实际的跳转地址,他只是起到方便查看的作用,实际跳转的地址是pc指针的偏移量

Copy
3000005c: eb000106 bl 30000478 <sdram_init> 30000060: e3a01000 mov r1, #0 ; 0x0 30000064: e59f204c ldr r2, [pc, #76] ; 300000b8 <.text+0xb8> 30000068: e59f304c ldr r3, [pc, #76] ; 300000bc <.text+0xbc> 这里的bl 30000478不是跳转到30000478,这个时候sdram并未初始化; 为了验证,我们做另一个实验,修改连接脚本sdram.lds, 链接地址改为0x32000478,编译,查看反汇编: 3000005c: eb000106 bl 30000478 <sdram_init> 30000060: e3a01000 mov r1, #0 ; 0x0 30000064: e59f204c ldr r2, [pc, #76] ; 300000b8 <.text+0xb8> 30000068: e59f304c ldr r3, [pc, #76] ; 300000bc <.text+0xbc>

可以看到现在变成了bl 30000478,但两个的机器码eb000106都是一样的,机器码一样,执行的内容肯定都是一样的。 因此这里并不是跳转到显示的地址,而是跳转到: pc + offset,这个由链接器决定。

假设程序从0x30000000执行,当前指令地址:0x3000005c ,那么就是跳到0x30000478;如果程序从0运行,当前指令地址:0x5c 调到:0x00000478

跳转到某个地址并不是由bl指令所决定,而是由当前pc值决定。反汇编显示这个值只是为了方便读代码。

重点: 反汇编文件里, B或BL 某个值,只是起到方便查看的作用,并不是真的跳转。

posted @   zongzi10010  阅读(1788)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示
CONTENTS