自己写bootloader笔记8---反汇编文件boot.dis分析
来源:互联网 发布:python中的 编辑:程序博客网 时间:2024/06/05 04:16
1、ldr r0, =0x4c000004
(1)对应的反汇编
33f80024:e59f0084 ldrr0, [pc, #132]; 33f800b0 <sdram_config+0x38>
33f80024是运行地址
e59f0084是机器码
ldrr0, [pc, #132]是汇编指令编译时执行的指令
33f800b0是PC+132得出的地址
<sdram_config+0x38>表示偏移函数sdram_config的0x38处
(2)分析
如果对于ldr伪汇编指令,0x4c000004这个数比较复杂,不能用mov指令表示,会吧这个数存在地址(pc + 132)处,也就是33f800b0处,然后从(pc + 132)的存储器地址处取出数据,加载到寄存器r0中。
33f800b0: 4c000004stcmi0, cr0, [r0], {4}
2、adr r1, sdram_config
(1)对应的反汇编
r1等于当前PC+60,60就是0x3c.如果是从0地址开始运行,当前PC等于当前地址0x33f80034加8,再加上0x3c,等于33f80078
33f80034: e28f103caddr1, pc, #60; 0x3c
(2)分析
3f80078是函数sdram_config的链接地址
3f80078 <sdram_config>:
3、ldr r1, =_start和ldr r2, =__bss_start
(1)对应的反汇编
r1是目标地址,也是运行地址,其值在33f800b8,因为33f800b8:33f80000mvnccsr0, #0; 0x0,因而可知运行地址r1等于33f80000,33f80000是链接脚本指定的起始地址
33f80058:e59f1058ldrr1, [pc, #88]; 33f800b8 <sdram_config+0x40>
r2对应的是长度,其值在33f800bc处,因为33f800bc:33f806b0mvnccsr0, #184549376; 0xb00000。因而可知r2等于33f806b0
33f8005c: e59f2058 ldr r2, [pc, #88]; 33f800bc <sdram_config+0x44>
r2的最终结果是33f806b0-33f80000,也就是0x6b0,十进制是1712(因为向4对齐,在boot.lds内加了ALIGN(4)),就是我们要拷贝的文件大小,查看编译出来的boot.bin文件
3f80060:e0422001subr2, r2, r1、
4、C语言
(1)源程序
//清除bss段
void clear_bss(void)
{
把__bss_start, __bss_end定义为外部的整型变量
extern int __bss_start, __bss_end;
定义指针指向bss段的首地址
int *p = &__bss_start;循环把bss段中变量赋为0,直到bss段的结尾
for (; p < &__bss_end; p++)
*p = 0;
}
(2)对应汇编
__bss_start取地址为33f80118的值, __bss_end取地址为33f8011c 的值
33f800f4:e59f301cldrr3, [pc, #28]; 33f80118 <.text+0x118>
33f800f8: e59f101c ldr r1, [pc, #28]; 33f8011c <.text+0x11c>
地址为33f80118的值为33f806b0 , 地址为33f8011c 的值为33f806b4
33f80118:33f806b0mvnccsr0, #184549376; 0xb000000
33f8011c: 33f806b4 mvnccs r0, #188743680; 0xb400000
从上面可知bss段只有4字节(33f806b4- 33f806b0,__bss_end-__bss_start),这4字节是
bss段的反汇编只有变量params,初始值为0,并没有存在二进制文件里面,让变量初始值为0,要通过清除bss操作
Disassembly of section .bss:
33f806b0 <params>:
33f806b0: 00000000 andeq r0, r0, r0
- 自己写bootloader笔记8---反汇编文件boot.dis分析
- 自己写bootloader笔记1---流程分析
- 自己写bootloader笔记7---Makefile分析
- 自己写bootloader笔记1---流程分析
- 自己写bootloader笔记7---Makefile分析
- 自己写bootloader笔记5---设置u-boot传给内核的参数分析
- 自己写bootloader笔记5---设置u-boot传给内核的参数分析
- 自己写bootloader------汇编---第1阶段(学习笔记)
- 自己写bootloader笔记6---boot.c分析(u-boot向内核传递参数及跳转到内核)
- 自己写bootloader笔记6---boot.c分析(u-boot向内核传递参数及跳转到内核)
- 写一个简单的BootLoader(四)——链接文件boot.lds分析笔记
- LPC824 ROM-bootloader反汇编分析
- 自己写bootloader笔记2---start.S分析
- 自己写bootloader笔记3---init.c分析
- 自己写bootloader笔记4---uboot.lds分析
- 自己写bootloader笔记2---start.S分析
- 自己写bootloader笔记4---uboot.lds分析
- 自己写bootloader笔记3---init.c分析
- 五十道编程小题目 --- 20 java
- Python与Java交互
- 数据库订单表状态字段值设计的一些思考
- JPA和Hibernate浅析
- Android内存优化建议
- 自己写bootloader笔记8---反汇编文件boot.dis分析
- Spring AOP 实践(五)基础篇下
- 如何退出Activity?如何安全退出已调用多个Activity的Application?
- MediaCodec解码h264流
- Linux系统利用脚本删除空行或者空格的方法
- DFS-PATA-1003
- 电商样衣领用
- 【分享】泽越止系列游戏ら~じPonPon+SummerRadishVacation!【日文硬盘版】[
- 安卓TimePicker在当前页面通过按键事件切换焦点的方法