ARM指令寻址的几种方式

//部分注释不正确



;寻址方式,使用AXD调试时,可使用单步调试(F10)

;使用AXD的processor views-->register查看寄存器变化
;使用AXD的processor views-->memory查看内存的值
;使用AXD的processor views-->disassembly查看反汇编代码






GBLA Test1   ;声明一个全局的数学变量,变量名为Test1
GBLL Test2  ;申明一个全局的逻辑变量,变量名为Test2
Test1   SETA  0x3  ;将变量Test1赋值为3,注意书写格式,需要顶格写
Test2 SETL {TRUE} ;将变量Test2赋值为TRUE


;EQU伪指令
COUNT EQU 0x30003100 ; 定义一个变量,地址为0x30003100


AREA Example1,CODE,READONLY ; 声明代码段Example1
ENTRY ; 标识程序入口
CODE32 ; 声明32位ARM指令

START

;立即寻址
MOV R0,#0    ; R0 <= 0,将立即数0x00存入寄存器R0,可通过AXD的processor views-->register查看
ADD R0,R0,#1    ; R0 <= R0 + 1
ADD R0,R0,#0x3f  ; R0 <= R0 + 0x3f

;寄存器寻址
MOV R1,#1    ; R1 <= 1,将立即数0x01存入寄存器R1
MOV R2,#2    ; R2 <= 2,将立即数0x02存入寄存器R2
ADD R0,R1,R2 ; R0 <= R1+R2,将寄存器R1和R2的内容相加,其结果存放在寄存器R0中

;寄存器间接寻址
 LDR R1,=COUNT     ; R1 <= COUNT,将存储器地址放入寄存器R0
;MOV R0,#0x12 ; R0 <= 0x12,MOV指令目地操作数只能是8位
LDR R0,=0x12345678
STR R0,[R1]     ; [R1] <= R0,将寄存器R0的内容存入寄存器R1所指向的存储器
    ;即设置COUNT为0x12345678,
    ;STR指令用于从源寄存器中将一个32位的字数据传送到存储器中
      ;可通过AXD的processor views-->memory查看0x30003100的值

;基址变址寻址
LDR R1,=COUNT ;将存储器地址0x30003100放入寄存器R1
LDR R2,=(COUNT+4) ;将存储器地址0x30003104放入寄存器R1
MOV R3,#0x12             ;将立即数0x12存入寄存器R3
STR R3,[R2] ;将寄存器R3的内容存入寄存器R2所指向的存储器
LDR R4,[R1,#4] ;将寄存器R1的内容加上4所指向的存储器的字存入寄存器R4

;多寄存器寻址
LDR R1,=COUNT ;将存储器地址0x30003100放入寄存器R1
LDMIA R1,{R5,R6} ;R5 <= [R1],R6 <= [R1+4]



;相对寻址
BL NEXT ;跳转到子程序NEXT处执行,注意使用F8(step in)
NOP
NOP


;跳转指令(B)
B label1 ;跳转到子程序label1处执行
NOP
NOP
NOP

NEXT
MOV R0,LR
NOP
NOP
NOP
MOV PC,LR ;从子程序返回


label1
NOP 
NOP
NOP

;跳转指令(BL)
BL lable2 ;跳转到子程序label2处执行
NOP
NOP

;MOV指令
MOV R0,#0x12 ;R0=0x12
MOV R1,R0 ;R1=R0
MOV R1,R0,LSL#3 ;R1=R0<<3

;MVN指令
MVN R0,#0xff ; R0 = 0xfffff00 
MVN R0,#0xA0000007 ; 0xA0000007的反码为0x5FFFFFF8


;CMP指令(使用AXD查看CPSR)
MOV R0,#1
MOV R1,#2
CMP R0,R1 ;若R0>R1,则置R0=3,若R0<=R1,则置R1=3
MOVHI R0,#3 ;根据CPSR条件标志位中的HI(无符号大于)判断,若R0>R1,则R0=3
MOVLS R1,#3 ;根据CPSR条件标志位中的LS(无符号小于或等于)判断,R0<=R1,则R1=3


;TST指令,测试R5的bit23是否为1,若是则置R5=0x01,不是则置R5=0x00
LDR R5,=0xffffffff
TST R5,#(1<<23) ;当bit23位为1时,CPSR EQ位被设置
MOVEQ R5,#0x00
MOVNE R5,#0x01

;ADD指令
MOV R1,#1
MOV R2,#2
MOV R3,#3
ADD R0,R1,R2 ;R0=R1+R2
ADD R0,R1,#256 ;R0=R1+256
ADD R0,R2,R3,LSL#1 ;R0=R2+(R3<<1)

;SUB指令
MOV R1,#100
MOV R2,#8
SUB R0,R1,R2 ;R0=R1-R2
SUB R0,R1,#55 ;R0=R1-256

;AND指令
MOV R0,#0xff
AND R0,R0,#3 ;逻辑与运算,R0 = R0 & 3

;ORR指令
MOV R0,#0xff
ORR R0,R0,#3 ;逻辑或运算,R0 = R0 | 3


;BIC指令
MOV R0,#0x77
BIC R0,R0,#0x0b ;将R0的bit0,bit1,bit3清零,其余位不变


;MUL指令
MOV R1,#10
MOV R2,#20
MUL R0,R1,R2 ;R0=R1*R2

;MRS指令(将CPSR或者SPSR的内容传送到通用寄存器)
MRS R0,CPSR ;传送CPSR的内容到R0
MRS R1,SPSR ;传送SPSR的内容到R1

;LDR指令
LDR R1,=0x30003100 ;R1=0x30003100,使用AXD的processor views-->memory查看内存的值
LDR R0,[R1] ;R0=[R1]
LDR R0,[R1,#4] ;R0=[R1+4]

;LDRB,LDRH指令
LDR R1,=0x30003100
LDRB R0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零
LDRH R2,[R1] ;将存储器地址为R1的半字数据读入寄存器R2,并将R2的高16位清零

;STR指令,内存地址0x30003100=0xab
LDR R1,=0x30003100
MOV R0,#0xab
STR R0,[R1] ;将R0中的字数据写入以R1为地址的存储器中
STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中


;LDM,STM指令
LDR R1,=0x30003100
LDMIA R1,{R5,R6} ;R5 = [R1],R6 = [R1+4]
MOV R2,#0x33
MOV R3,#0X44
STMIA R1,{R2,R3} ;[R1]=R2,[R1+4]=R2


;SWP指令
SWP R0,R0,[R1] ; 该指令完成将R1所指向的存储器中的字数据与R0中的字数据交换

;移位指令
MOV R1,#4
MOV R0,R1,LSL#2 ;R0=R1<<2
MOV R1,#3
MOV R0,R1,ROR#2 ;将R1中的内容循环右移两位后传送到R0中




;汇编控制伪指令,while指令 
WHILE Test1<10
MOV R0,#Test1
MOV R1,#1
Test1   SETA Test1+1
WEND

 ;汇编控制伪指令,IF指令
IF Test2 = {TRUE}
MOV R0,#1
MOV R1,#2
ELSE
MOV R0,#0
MOV R1,#0
ENDIF
B out
lable2
MOV R0,LR ;查看R14
NOP
NOP
MOV PC,LR ;从子程序返回



out
NOP











END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值