本文就利用这个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 0x00000000
UndHandler:
sub sp, sp, #8
str r0, [sp]
ldr r0, =AddrUnd
str lr, [r0]
ldr r0, =asm_und_handler
str r0, [sp, #4]
ldmfd sp!, {r0, pc}^
这段代码非常简单,实现的功能是保存原指令的下一条指令地址到AddrUnd中,然后跳转到asm_und_handler执行。注意此次跳转也会导致运行模式的变化。
另外为了不破坏寄存器环境,必须采用ldmfd sp!, {r0, pc}的形式来跳转,否则无法恢复r0的值。
实际的指令模拟在asm_und_handler中实现:
.global asm_und_handler
asm_und_handler:
sub sp, sp, #4 /* reserved space for AddrUnd */
stmfd sp!, {r0-r12}
ldr r0, =AddrUnd
ldr r0, [r0]
str r0, [sp, #52]
ldr r0, [r0, #-4] /* get the undefined instruction */
bic r1, r0, #0xF
ldr r2, =0xE12FFF30
cmp r1, r2
beq handle_BLX
ldmfd sp!, {r0-r12, pc}
handle_BLX:
ldr r3, =0xFFFFFFF0
bic r0, r0, r3
cmp r0, #0
beq BLX_R0
cmp r0, #1
beq BLX_R1
cmp r0, #2
beq BLX_R2
cmp r0, #3
beq BLX_R3
cmp r0, #4
beq BLX_R4
cmp r0, #5
beq BLX_R5
cmp r0, #6
beq BLX_R6
cmp r0, #7
beq BLX_R7
cmp r0, #8
beq BLX_R8
cmp r0, #9
beq BLX_R9
cmp r0, #10
beq BLX_R10
cmp r0, #11
beq BLX_R11
cmp r0, #12
beq BLX_R12
ldmfd sp!, {r0-r12, pc}
BLX_R0:
ldmfd sp!, {r0-r12, lr}
bx r0
BLX_R1:
ldmfd sp!, {r0-r12, lr}
bx r1
BLX_R2:
ldmfd sp!, {r0-r12, lr}
bx r2
BLX_R3:
ldmfd sp!, {r0-r12, lr}
bx r3
BLX_R4:
ldmfd sp!, {r0-r12, lr}
bx r4
BLX_R5:
ldmfd sp!, {r0-r12, lr}
bx r5
BLX_R6:
ldmfd sp!, {r0-r12, lr}
bx r6
BLX_R7:
ldmfd sp!, {r0-r12, lr}
bx r7
BLX_R8:
ldmfd sp!, {r0-r12, lr}
bx r8
BLX_R9:
ldmfd sp!, {r0-r12, lr}
bx r9
BLX_R10:
ldmfd sp!, {r0-r12, lr}
bx r10
BLX_R11:
ldmfd sp!, {r0-r12, lr}
bx r11
BLX_R12:
ldmfd sp!, {r0-r12, lr}
bx r12
因为实际中BLX 可以有
BLX r0
BLX r1
…
BLX r12
等12中方式,所以必须对每种方式都加以模拟。
需要注意的是,必须要在执行 bx r12之前确保寄存器环境与原指令运行时的环境完全相同,还是使用了ldmfd的方式来解决这个问题。因为ldmfd要求按照顺序加载寄存器,所以需要一点小技巧了合理安排栈中寄存器的分布。
本例中,对于除了BLX之外的未定义指令,直接忽略并跳转到下一条指令执行。
4 测试
GCC的C语言编译器对于函数指针形式的调用,会产生处BLX汇编指令,下面就是C源码和编译产生的汇编码。
int(*f)(const char*) = puts;
f("Hello BLXn");
对应的汇编码:
ldr r3, .L3+24
str r3, [fp, #-8]
ldr r3, [fp, #-8]
ldr r0, .L3+28
blx r3
S3C2440A这款CPU不支持BLX指令,如果不进行模拟实现,那么就无法实现函数调用的功能。幸好我们上面刚刚实现了BLX的模拟,此时该测试程序顺利执行,并打印出了Hello BLX。
Initialize Keys...[OK]
Initialize LEDs...[OK]
Initialize Beep...[OK]
Hello BLX
I'm idle, waiting for your order
I'm idle, waiting for your order
上一篇:GNU ARM交叉汇编环境的搭建与测试
下一篇: 初始化片外RAM,让程序有更大内存空间
推荐阅读
史海拾趣
ATP深知,优质的产品需要优质的服务来支撑。因此,公司一直致力于提升客户服务水平,为客户提供最优质的产品、最具竞争力的价格和最优质的服务。ATP通过建立完善的售后服务体系,及时解决客户在使用过程中遇到的问题,赢得了客户的信任和好评。同时,公司还积极开展市场调研,了解客户需求,不断优化产品和服务,以满足市场的不断变化。
这五个故事展示了ATP Electronics在电子行业中的发展历程和取得的成就。通过技术创新、推出工业级产品、践行环保理念、实施全球化战略以及提升优质服务,ATP成功地在激烈的市场竞争中脱颖而出,成为了闪存卡市场的领军企业。
ATP Electronics自创立之初,便以技术创新为核心竞争力。公司特有的SIP(Systems-In-Package:系统级封装)技术,在闪存卡制造领域引起了革命性的变革。通过SIP技术,ATP成功研发出超大容量的闪存卡,不仅满足了市场对于高性能存储的需求,也确立了公司在闪存卡市场的领先地位。这一技术的突破,为ATP带来了大量的订单和市场份额,奠定了公司持续发展的基础。
随着全球对环境保护意识的增强,G-Mag在2010年决定实施绿色转型战略。公司投入大量资源研发环保型电子产品和制造工艺,如开发可降解材料用于产品包装、优化生产线以减少能源消耗和废弃物排放等。同时,G-Mag还积极推广循环经济理念,与上下游企业合作建立废旧电子产品回收体系。这些举措不仅提升了G-Mag的品牌形象,还为其赢得了更多消费者的青睐和政府的支持。在绿色转型的推动下,G-Mag实现了可持续发展与经济效益的双赢。
川晶科技注重团队建设和人才培养。公司建立了完善的培训体系和发展机制,为员工提供丰富的培训机会和广阔的发展空间。通过引进高素质的人才和内部培养相结合的方式,川晶科技打造了一支高素质、专业化的团队。团队成员之间团结协作、互相支持,共同推动公司的持续成长和发展。同时,公司还建立了良好的激励机制和企业文化氛围,激发员工的工作积极性和创造力。
AIE公司自2005年成立以来,一直致力于推动电子测试配件的安全规范标准化。公司积极与各大电子厂商、行业协会以及标准化组织展开合作,共同制定了一系列关于测试配件的性能规格和安全标准。这一举措不仅提升了AIE产品的竞争力,也促进了整个电子行业的健康发展。通过与业界的紧密合作,AIE逐渐在电子测试配件领域树立了良好的口碑。
我是一个有10年电子产品研发经验的工程师和 10年IT知名公司研发中心管理经验的技术管理者。世上好的管理理念可能归纳起来就那么1~2百条,也都好理解,难的是怎么适当地运用在特定的环境中。下面的文章共18篇,是我20年工作中的片段,也是我在研发及 ...… 查看全部问答∨ |
|
我做电机控制,采样电机位置数据定义为长整型 long position 又定义了一个长整形数组,long p[500]来记录1500个位置信息 在中断周期内,将 position赋值于P; 出现如下问题: 例如:position=92362; p=position; ...… 查看全部问答∨ |
|
文档中也有关FT的说明, FT=Five -Volt tolerant .In order to sustain a voltage higher than Vdd+0.3 V the internal pull up / pull down resistors must be disable. 正是因为must be disable 让我比较困惑 ...… 查看全部问答∨ |
各位朋友,我原本是专科的应用电子专业毕业生,两年后打算从返电子行业,那么如果要应聘助理工程师或者技术员岗位,需要做哪些准备?哪些地方需要特别注重呢? 之前我也看到过招聘网站对该岗位的招聘要求, ...… 查看全部问答∨ |
本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 LED变色是怎么实现的呢?晚上霓虹灯闪耀的高楼大厦外墙,看到那些LED在一直不停滴变色,我想知道变色的原理是什么?难到LED本身会变色?初学者,请教大家。 … 查看全部问答∨ |
|
线号机切刀呈现疑问怎么解决? 切刀绷簧简单断是不是运用的线号管有偏硬的状况?目前咱们所出售的线号管十分少呈现开裂切刀绷簧状况;能够测验咱们供给的线号管试用是不是仍然呈现开裂绷簧疑问;热缩套管相对比PVC ...… 查看全部问答∨ |