Arm 启动时第一条指令跳转问题

ywqman   2010-2-2 10:16 楼主
ldr      pc,Reset_Addr ; = #Reset_Addr
Arm启动时在0地址的第一条指令都是0xe59ff018,将reset_addr的地址load到pc,不管reset_addr是多少,指令都是一样的,处理器是如何知道将要到哪个地址去?比如像jmp addr 或者bx addr都有一个确定的地址,而第一条指令并没有。我碰到了一个问题,软件仿真正常,但是在硬件平台上仿真时跳转不对,请哪位高手赐教,谢谢!

回复评论 (7)

编译器编译的时候会将Reset_Addr这个函数的地址计算出来,并在生成机器码中使用的是这个地址,虽然你在调试过程中看到的仍然是ldr pc,Reset_Addr这样的命令,但是实际上已经有这个地址了。
点赞  2010-2-2 10:18
你可以进行一下测试,在Reset_Addr标号前加些代码,导致Reset_Addr标号的位置不同,然后分别进行调试,看下ldr pc,Reset_Addr这句代码所在位置(比如说0地址)的内存数据,实际上代码数据是不一样的。
点赞  2010-2-2 10:21
但是不管要跳转的地址是什么,指令总是0xe59ff018,是没有地址信息的,而且arm中断向量表的前五条指令都是0xe59ff018
点赞  2010-2-2 10:22
不像单片机第一条指令是个ajmp addr,指令中就包含了addr的值
点赞  2010-2-2 10:30
因为那是以PC为基准的相对寻址,实际生成的指令是LDR PC, [PC,#NUM]的格式,而它要加载的目标地址表格总是紧接着跳转的指令,所以无论这些指令处于什么地址,指令编码都不会变
点赞  2010-2-2 13:39
引用: 引用 5 楼 great_bug 的回复:
因为那是以PC为基准的相对寻址,实际生成的指令是LDR PC, [PC,#NUM]的格式,而它要加载的目标地址表格总是紧接着跳转的指令,所以无论这些指令处于什么地址,指令编码都不会变


up
点赞  2010-2-2 14:38
是这样的,谢谢!
点赞  2010-2-2 17:44
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复