您的位置 首页 5G

ARM汇编的SWI指令软中止

从下面的一个ARM汇编小程序要弄懂的以下三个问题:1).在ARM状态转到THUNB状态和BX的应用2).汇编的架构3).SWI指令的使用AREAADDR…

从下面的一个ARM 汇编小程序要弄懂的以下三个问题:

1).在ARM状况转到THUNB状况和BX的运用

2).汇编的架构

3).SWI指令的运用

    AREA ADDREG,CODE,READONLY

    ENTRY

MAIN

  ADR r0,ThunbProg 1 ;(为什么要加1呢?由于BX指令跳转到指定的地址履行程序 时, 若   (BX{cond} Rm)Rm的位[0]为1,则跳转时主动将CPSR中的标志T置位即把方针 代码解释为 Thunb代码)

    BX r0

   CODE16

ThunbProg

   mov r2,#2

    mov r3,#3

    add r2,r2,r3

    ADR r0,ARMProg

    BX ro

    CODE32

ARMProg

    mov r4,#4

    mov r5,#5

    add r4,r4,r5

stop mov r0,#0x18

LDR r1,=0x20026

SWI 0x123456

END

SWI--软中止指令:

SWI指令用于发生软中止,从支持形式变换到管理形式,CPSR保存到管理形式的SPSR中.

 SWI{cond} immed_24 ;immed_24为软中止号(服务类型)

运用SWI指令时,一般运用以下两种办法进行传递参数,SWI 异常中止处理程序就可以供给相关的服务,这两种办法均是用户软件协议.SWI异常中止处理程序要经过读取引起软中止的SWI指令,以获得24位当即数.

(1) 指令中的24位当即数指定了用户恳求的服务类型,参数经过通用寄存器传递.

 mov r0,#34 ;设置子功用号位34

SWI 12 ;调用12号软中止

(2) 指令中的24位当即数被疏忽,用户恳求的服务类型有寄存器RO的值决议,参数经过其他的通用寄存器传递.

 mov r0,#12 ;调用12号软中止

 mov r1,#34 ;设置子功用号位34

 SWI  0

在SWI异常中止处理程序中,取出SWI当即数的过程为:首要确认引起软中止的SWI指令是ARM指令仍是Thunb指令,这可经过对SPSR拜访得到;然后获得该SWI指令的地址,这可经过拜访LR寄存器得到;接着读出指令,分解出当即数.如如下程序:

T_bit EQU 0X20

SWI_Handler

STMFD SP!,{R0-R3,R12,LR} ;现场维护

MRS R0,SPSR ;读取SPSR

STMFD SP!,{R0} :保存SPSR

TST R0,#T_bit

LDRNEH R0,[LR,#-2] ;若是Thunb指令,读取指令码(16位)

   BICNE R0,#0XFF00 :获得Thunb指令的8位当即数

   LDREQ R0,[LR,#-4] ;若是ARM指令,读取指令码(32位)

   BICEQ R0,#0XFF000000 ;获得ARM指令的24位当即数

   ....

   LDMFD SP!,{R0-R3,R12,PC}^ ;SWI异常中止回来

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/274730.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部