当前位置 博文首页 > 缘分锝天空的博客:利用跳转表实现具有跳转功能的汇编程序(带详

    缘分锝天空的博客:利用跳转表实现具有跳转功能的汇编程序(带详

    作者:[db:作者] 时间:2021-07-21 09:49

    (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