我有一个关于 ARM BLX 指令的问题,特别是关于 BLX RX 指令的问题。 ARM手册上规定,对于BLX标签,标签应在32MB范围内。在我的代码中,我将 R0 寄存器设置为指向地址 1。我当前的地址和address1(目标地址)之间的距离约为0x05000000。
当我到达指令时,它崩溃了(地址1中的代码是ARM,所以T模式没有问题)。在 BLX 中使用绝对值时有任何限制吗?我应该使用贴面吗?
Thanks!
您可以使用任何地址作为 RX 寄存器,格式为 BLX RX。它将执行手臂arm中描述的动作。
if ConditionPassed(cond) then
target = Rm
LR = address of instruction after the BLX instruction
CPSR T bit = target[0]
PC = target AND 0xFFFFFFFE
如果代码、调用或被调用的代码都不是拇指模式,那么您可能没问题,请确保在这种情况下您给出的地址的 lsbit 为零。您实际上需要在 0x05000000 处有代码,并且需要是旨在处理分支链接的代码,这意味着如果它进行更多 bl 样式调用,它会维护链接寄存器 (r14)。同样,如果您在从其他人调用的函数内进行此 blx 调用,则需要在进行 blx 调用之前保留 r14 并恢复 r14,或者在从函数返回时执行任何操作将该值放回到 r15 (pc) 中。
反汇编/objdump 列表的代码示例或片段将有助于进一步帮助您解决此问题。包含 blx 的代码和被调用的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)