ldr pc,Reset_Addr ; = #Reset_Addr
Arm启动时在0地址的第一条指令都是0xe59ff018,将reset_addr的地址load到pc,不管reset_addr是多少,指令都是一样的,处理器是如何知道将要到哪个地址去?比如像jmp addr 或者bx addr都有一个确定的地址,而第一条指令并没有。我碰到了一个问题,软件仿真正常,但是在硬件平台上仿真时跳转不对,请哪位高手赐教,谢谢!
编译器编译的时候会将Reset_Addr这个函数的地址计算出来,并在生成机器码中使用的是这个地址,虽然你在调试过程中看到的仍然是ldr pc,Reset_Addr这样的命令,但是实际上已经有这个地址了。
你可以进行一下测试,在Reset_Addr标号前加些代码,导致Reset_Addr标号的位置不同,然后分别进行调试,看下ldr pc,Reset_Addr这句代码所在位置(比如说0地址)的内存数据,实际上代码数据是不一样的。
但是不管要跳转的地址是什么,指令总是0xe59ff018,是没有地址信息的,而且arm中断向量表的前五条指令都是0xe59ff018
不像单片机第一条指令是个ajmp addr,指令中就包含了addr的值
因为那是以PC为基准的相对寻址,实际生成的指令是LDR PC, [PC,#NUM]的格式,而它要加载的目标地址表格总是紧接着跳转的指令,所以无论这些指令处于什么地址,指令编码都不会变