位置相关和位置无关主要体现在程序运行时的地址和编译时指定的代码段的地址是否为同一地址
编译环境:ADS1.2
开发板:GEC210(s5pv210soc)
程序运行方式:使用uboot的tftp下载bin文件到内存(0x30008000),然后运行
汇编代码如下:
ldr r3,=delay 1
ldr r3,delay 2
adr r3,delay 3
。。。。。
delay
mov r2,#0xff00000
.......
end
在ADS中设置入口地址为0x30008000(ARM linker选项中的RO base)
在AXD中查看到反汇编代码如下
30008000 [0xe59f3040] ldr r3,0x30008048 ; = #0x30008038
30008004 [0xe59f302c] ldr r3,delay ; = #delay
30008008 [0xe28f3028] add r3,pc,#0x28 ; #0x30008038
。。。。
30008048 [0x30008038] dcd 0x30008038 8..0
。。。。
第一列30008000为地址,第二列的中括号中的数字表示相应的机器码,后面的为对应的arm指令。
其中我们看到第一条指令,原指令写为ldr r3,=delay
反汇编的指令变为ldr r3,0x30008048
相应的机器码为0xe59f3040
我们看机器码的低12bits,其值为0x040。
计算pc+0x40 = 0x30008000 + 8 + 0x40 = 0x30008048
得到新的地址0x30008048,看看0x30008048地址的内容0x30008038
0x30008038为delay标号的地址,从内存单元读取该值
所以看的出ldr r3,=delay 是位置相关的指令(没看懂的接着往下看)
看看另外两条指令
原指令ldr r3,delay
反汇编指令ldr r3,delay
机器指令0xe59f302c
保留机器指令的最低12bits为0x02c
计算PC+0x02c = 0x30008004+8+0x02c = 0x30008038
0x30008038为delay标号的地址,这个地址是与pc的值相加算出来的。
而前面那条指令的这个值是保存在某个单元,然后用指令读出来的。
这个值(0x30008038)是算出来的与pc相关,是根据pc的值算出来的,而第一条指令的那个地址是读出来的,是个确定值,与pc无关。
第三条指令 adr r3,delay
反汇编 add r3,pc,#0x28
直接看的出r3的值与pc加上某个数得到的。
以上指令可以看出来,与pc相关的值那么就是位置无关指令,与pc无关的代码就是位置有关的指令。
未完,继续
两种情况
1.我把编译出来的bin文件下载到0x30008000这个位置,3条指令都能正确获取数据
2.我把bin文件下载到 0x30001000(或者其他可用内存地址),那么第一条指令不能获取正确数据,2,3条可以获取正确数据。
此时pc的值应该为0x30001000+8 = 0x30001008;
第一条指令计算的地址为0x30001048,这个地址有一个数据0x30008038,指令想再间接访问0x30008038读取一个值出来时,明显会出错,实际也不是对应delay标号的地址,delay的地址应该为0x30001038
后面的两条指令都可以计算得到值为0x30001038,就是delay实际的地址了。
以上对位置相关和位置无关进行一个简单说明。如果还是不能理解可以使用ads或者keil之类的调试工具尝试。
简单来说,位置无关就是不管你编译的时候指定的代码段起始地址在哪,而我随便下载到哪个内存空间,程序都能正常运行
而位置有关代码,就是程序编译是指定代码段的位置,程序必须下载到指定位置才能正常运行的代码。
备注:pc的值等于当前正在执行指令的地址+8
上一篇:gec210 led裸机开发 汇编指令
下一篇:GEC210 系统更新说明
推荐阅读最新更新时间:2024-11-13 06:47
设计资源 培训 开发板 精华推荐
- LTM4643MPV 4V 至 20V 输入、4 相、1.2V/12A 降压稳压器的典型应用,具有温度监控功能
- 带参考稳压器的 AZ431A PWM 转换器的典型应用
- 用于消费电子产品的 PSoC 嵌入式系统
- FEBFOD8316,基于 FOD8316 2.5A 输出电流、具有去饱和检测和隔离故障检测功能的 IGBT 驱动光耦合器的评估板
- ADA4627-1ARZ-R7带保护同相放大器的典型应用电路
- 具有 PWM 调光功能的 NSV50350AST3G LED 灯串的典型应用
- 51单片机I2C热敏打印机
- LT1117CM-2.85 调节固定稳压器输出电压的典型应用
- 用于便携式的 1W、1 通道、AB 类音频功率放大器
- R_150_V10基于IPS2电机换向传感器的设计