主题 : C程序链接后的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 24210
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2010-07-04
最后登录: 2010-11-09
楼主  发表于: 2010-09-03 11:42

 C程序链接后的问题

最近碰到个问题,好久也搞不明白,希望了解的朋友帮忙解答一下:
我的C程序:
#define    V01    (*((volatile unsigned int *)(0x33ff0000)))
int Main()
{
    V01 = 0x01;
    return 0;
}
RO地址0x30000000
链接后的二进制文件就是下面的汇编语言:
        0x00000000:      LDR      r1,0x14
        0x00000004:      MOV      r0,#1
        0x00000008:      STR      r0,[r1,#0]
        0x0000000c:      MOV      r0,#0
        0x00000010:      MOV      pc,r14
        0x00000014:      DCD    872349696
我的问题:
        第一行汇编保存了常量的地址0x14,但常量0x33ff0000在加载到RO地址(0x30000000)后应该就变成了0x30000014,是我的RO地址0x30000000设置没有起作用还是我的理解有问题?还请明白的朋友讲解一下。
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2010-09-03 12:09
LDR      r1,0x14

这句话的意思是把当前PC地址+偏移0x14的地址上的内容作为地址,再从这个地址上获取内容放入r1寄存器。PC地址+偏移0x14 = 0x0 + 0x14 = 0x14,这个地址上的内容是872349696, 也就是16进制的0x33FF0000.
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 24210
精华: 0
发帖: 4
金钱: 20 两
威望: 4 点
综合积分: 8 分
注册时间: 2010-07-04
最后登录: 2010-11-09
2楼  发表于: 2010-09-04 12:44

 回 1楼(kasim) 的帖子

感谢版主回复,已经清楚了,这个0x14和一般的标号是一样的,都是根据PC寄存器来相对寻址的,不过由于ARM9有3级流水线,所以真正的偏移是0x0c,可以从指令的编码里面看出来