TQ2440开发板学习纪实(9)--- 利用Undefined异常模拟BLX指令

本文介绍了如何利用S3C2440A处理器在遇到不支持的BLX指令时引发的Undefined异常,来模拟执行BLX指令,从而使得依赖BLX的程序能在该CPU上正常运行。文章详细阐述了Undefined异常处理流程、模拟指令的思路,以及具体实现BLX模拟的方法,并提供了测试和完整源码。
摘要由CSDN通过智能技术生成

在博文 《紧急求助!ARM-GCC对于函数指针调用的编译有错误?》中,我提到了GCC在编译函数指针调用的时候,会生成绝对地址跳转指令BLX。而S3C2440A这款CPU不支持BLX指令,从而导致陷入Undefined异常。

本文就利用这个Undefined异常,来模拟BLX指令,从而让使用BLX指令的程序可以正常运行在S3C2440上。

1 Undefined异常的处理流程

ARM9在执行未定义指令时,会跳转到0x00000004处执行,进入Undefined模式,并把下一条指令的地址存入LR。

2 指令模拟的思路

利用Undefined异常处理的一个非常重要的作用就是用来扩展CPU指令集,模拟执行硬件不能直接支持的指令。原理非常简单,在Undefined异常处理中,通过(LR-#4)这个地址就可以获取未定义的指令,然而根据不同的指令写出不同的等价程序即可。

例如本节将要实现的BLX指令,下面是源码事例:

ldr r3, [pc, #32]
ldr r3, [r3]
mov r0, r2
blx r3

其中blx r3的等效源码为:

mov lr, pc
bx r3

需要注意的是:

  • 进入Undefined异常处理时,CPU处于Undefined模式,此时的堆栈与异常前模式不同;
  • 我们的模拟指令程序应该运行在原模式下,而不是Undefined模式下,否则无法获取原来的寄存器环境;
  • 运行模拟指令程序前应保存所有用到的寄存器,运行返回前恢复。否则就会破坏原来的执行环境;
  • 保存寄存器的通用方法就是入栈,而入栈保存需要一定的技巧来保证返回的同时恢复所有寄存器;
  • 在Undefined模式下需要保存LR(此时存放的是原指令的下一条指令),此时不能通过入栈保存,因为Undfined的栈是独立的。变通方式,是存放LR的值到内存中。

3 BLX模拟实现

/* save the instruction's address after the undefined one. */
    .global AddrUnd
AddrUnd:
    .word  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值