当前位置 博文首页 > 缘分锝天空的博客:利用跳转表实现具有跳转功能的汇编程序(带详
(1)当r0为1时,调用子程序CASE1,完成r1加r2把结果放入r3的计算;
(2)当r0为2时,调用子程序CASE2,完成r1减r2把结果放入r3的计算;
(3)当r0为3时,调用子程序CASE3,完成r1与r2把结果放入r3的计算;
(4)否则,完成r1或r2把结果放入r3的计算。
?参考程序:
AREA JumpTest,CODE,READONLY ; 定义代码段
CODE32 ; 设置为arm指令集
ENTRY ; 程序入口
start ;start段给寄存器初始化
MOV r0, #1; 初始化程序中使用的寄存器,将1存到r0
MOV r1, #3; 将3存到r1寄存器
MOV r2, #2; 将2存到r2寄存器
ADR r4, JumpTable ; 将跳转表地址送给r4
CMP r0, #1; 如果 r0==1 就跳转到 CASE1
MOVEQ r3, #0 ;与CMP等比较指令连用,判断程序状态寄存器(R15/PC)中的Z bit,为1即相等则执行r3==0
LDREQ pc, [r4,r3,LSL #2] ;EQ指出了该LDR指令的执行条件。意思是判断条件码,相等则执行LDR操作。
;先将r3逻辑左移2位,然后与r4比较,如果相等就执行LDR操作,即将r4加载到pc中
CMP r0, #2 ; ;操作同上
MOVEQ r3, #1
LDREQ pc, [r4,r3,LSL #2]
CMP r0, #3 ;
MOVEQ r3, #2
LDREQ pc, [r4,r3,LSL #2]
DEFAULT ; ;否则调用DEFAULT
ORR r0, r1, r2 ;将r1与r2做或运算,结果放到r0中
SWITCHEND
MOV r0, #0x18 ; 调用软中断 返回操作系统
LDR r1, =0x20026 ;将r1的值设置成ADP_Stopped_ApplicationExit,该宏表示程序正常退出
SWI 0x123456 ;结束程序,将CPU的控制权交回调试器手中
JumpTable ; 定义跳转表
DCD CASE1 ; 分配一片连续的字存储单元并用指定的数据初始化,下面同理
DCD CASE2
DCD CASE3
CASE1 ; 子程序1
ADD r3, r1, r2 ;r1与r2相加,和放到r3里面
B SWITCHEND ;跳转到SWITCHEND
CASE2 ; 子程序2
SUB r3, r1, r2 ;r1与r2相减,差放到r3里面
B SWITCHEND ;跳转到SWITCHEND
CASE3 ; 子程序3
AND r3, r1, r2 ;r1与r2相与,结果放到r3里面
B SWITCHEND ;跳转到SWITCHEND
END ;ENTRY 和END成对出现,说明他们之间的代码是程序的主体
cs?以上是个人对程序的理解,发现不对欢迎指正哦!!!
创作不易,三连支持一下哈!!!