历史上的今天

今天是:2024年09月16日(星期一)

2021年09月16日 | TQ2440开发板学习纪实(9)--- 利用Undefined异常模拟BLX指令

发布者:幸福的时光 来源: eefocus关键字:TQ2440  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  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

关键字:TQ2440  Undefined 引用地址:TQ2440开发板学习纪实(9)--- 利用Undefined异常模拟BLX指令

上一篇:GNU ARM交叉汇编环境的搭建与测试
下一篇: 初始化片外RAM,让程序有更大内存空间

推荐阅读

在实验1的电机驱动基础上,这里补充编码器测速的程序部分#include "encoder.h"#include "led.h"///TIM4 编码器输入,TIM4_CH1作A相,TIM4_CH2作B相GPIO_Pin_6|GPIO_Pin_7;TIM_ICInitTypeDef TIM_ICInitStructure;void TIM4_Encoder_Init(u16 arr,u16 psc){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure...
本周讨论最多的就数苹果发布的iPhone11系列了,该系列总共有三款手机,由于升级幅度没有超出外界的预期,三摄浴霸设计太丑,定价还是过高,引来无数吐槽。不甘落寞的中国手机厂商纷纷发表了自己的看法。小米王腾:iPhone 11系列卖这么贵,没有5G在中国市场可能会比较惨小米公司产品总监王腾评价iPhone 11系列:把产品做精致这件事上,iPhone无出其右,无...
9月14日,英伟达宣布以最高400亿美元的价格收购软银所持的全部Arm股权。如果交易达成将创下半导体并购历史上最大规模的交易金额,超过2015年安华高370亿美元收购博通创下的纪录,而以失败告终的高通收购恩智浦案则高达440亿美元。英伟达CEO黄仁勋在公开信中指出,英伟达收购Arm,将打造出AI时代世界顶级的计算公司。在此之前,这桩交易被大多数人认为是不...
PoE市场前景以太网供电市场(PoE)调查数据以及对全球PoE市场预测情况显示,截止到2022年底,全球PoE市场的年复合增长率(CAGR)预计将增长13%(如图1所示),达到10亿美金。 图1 全球PoE市场预测(数据来源Research And Markets)最受欢迎的PoE产品主要有交换机、供电器、IP摄像头、VoIP电话、无线AP这五种。根据市场研究公司Research And Markets的...

史海拾趣

问答坊 | AI 解惑

求高手帮助波形整形

直流无刷电机霍尔传感器OC门(接5V330电阻)输出50us的负脉冲输出信号高电平5V,低电平0V,波形很好。 经过TLP521光耦之后,高电平3.3V(光耦输出端接的上拉就是3.3),低电平却在2V以上,导致单片机无法读取。 请问该如何解决?是用隧道二极管, ...…

查看全部问答∨

理想、激情、生存——位技术管理人员的20年工作经历和感悟

我是一个有10年电子产品研发经验的工程师和 10年IT知名公司研发中心管理经验的技术管理者。世上好的管理理念可能归纳起来就那么1~2百条,也都好理解,难的是怎么适当地运用在特定的环境中。下面的文章共18篇,是我20年工作中的片段,也是我在研发及 ...…

查看全部问答∨

谁有STM32LIN的读写例子参考下

                                 小弟目前正在搞STM32 lin 总线请问有做过这块的么,能给参考下么?…

查看全部问答∨

dsp2407中long型的赋值

我做电机控制,采样电机位置数据定义为长整型 long position 又定义了一个长整形数组,long p[500]来记录1500个位置信息 在中断周期内,将 position赋值于P; 出现如下问题: 例如:position=92362;       p=position; ...…

查看全部问答∨

关于STM32的IO之FT困惑

文档中也有关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 让我比较困惑 ...…

查看全部问答∨

应聘助理工程师需要做哪些准备(毕业两年后从返本专业)

各位朋友,我原本是专科的应用电子专业毕业生,两年后打算从返电子行业,那么如果要应聘助理工程师或者技术员岗位,需要做哪些准备?哪些地方需要特别注重呢?         之前我也看到过招聘网站对该岗位的招聘要求, ...…

查看全部问答∨

LED变色是怎么实现的呢?

本帖最后由 jameswangsynnex 于 2015-3-3 19:59 编辑 LED变色是怎么实现的呢?晚上霓虹灯闪耀的高楼大厦外墙,看到那些LED在一直不停滴变色,我想知道变色的原理是什么?难到LED本身会变色?初学者,请教大家。 …

查看全部问答∨

Control China 项目组恭祝马年吉祥

新年快乐~~HAPPY  NEW  YEAR  ~~…

查看全部问答∨

提问+msp430与电容式触摸按键51也可以吗

msp430与电容式触摸按键51也可以吗。51也可以像430那样直接驱动电容式按键吗,正好现在有个项目正好用到电容式触摸按键。 …

查看全部问答∨

线号机切刀出现问题如何解决? 

      线号机切刀呈现疑问怎么解决?   切刀绷簧简单断是不是运用的线号管有偏硬的状况?目前咱们所出售的线号管十分少呈现开裂切刀绷簧状况;能够测验咱们供给的线号管试用是不是仍然呈现开裂绷簧疑问;热缩套管相对比PVC ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved