配色: 字号:
ARM汇编基础
2013-05-03 | 阅:  转:  |  分享 
  
;寻址方式,使用AXD调试时,可使用单步调试(F10)

;使用AXD的processorviews-->register查看寄存器变化

;使用AXD的processorviews-->memory查看内存的值

;使用AXD的processorviews-->disassembly查看反汇编代码



GBLA Test1 ;声明一个全局的数学变量,变量名为Test1

GBLL Test2 ;申明一个全局的逻辑变量,变量名为Test2

Test1 SETA0x3 ;将变量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的processorviews-->register查看

ADDR0,R0,#1 ;R0<=R0+1

ADDR0,R0,#0x3f ;R0<=R0+0x3f



;寄存器寻址

MOVR1,#1 ;R1<=1,将立即数0x01存入寄存器R1

MOVR2,#2 ;R2<=2,将立即数0x02存入寄存器R2

ADDR0,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的processorviews-->memory查看0x30003100的值



;基址变址寻址

LDR R1,=COUNT ;将存储器地址0x30003100放入寄存器R1

LDR R2,=(COUNT+4) ;将存储器地址0x30003104放入寄存器R2

MOVR3,#0x12 ;将立即数0x12存入寄存器R3

STR R3,[R2] ;将寄存器R3的内容存入寄存器R2所指向的存储器

LDR R4,[R1,#4] ;将寄存器R1的内容加上4所指向的存储器的字存入寄存器R4



;多寄存器寻址

LDR R1,=COUNT ;将存储器地址0x30003100放入寄存器R1

LDMIAR1,{R5,R6} ;R5<=[R1],R6<=[R1+4]





;相对寻址

BLNEXT ;跳转到子程序NEXT处执行,注意使用F8(stepin)

NOP

NOP





;跳转指令(B)

B label1 ;跳转到子程序label1处执行

NOP

NOP

NOP



NEXT

MOVR0,LR

NOP

NOP

NOP

MOVPC,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时,CPSREQ位被设置

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=R1R2



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

MRS R0,CPSR ;传送CPSR的内容到R0

MRS R1,SPSR ;传送SPSR的内容到R1



;LDR指令

LDR R1,=0x30003100 ;R1=0x30003100,使用AXD的processorviews-->memory查看内存的值

LDR R0,[R1] ;R0=[R1]

LDR R0,[R1,#4] ;R0=[R1+4]



;LDRB,LDRH指令

LDR R1,=0x30003100

LDRBR0,[R1] ;将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零

LDRHR2,[R1] ;将存储器地址为R1的半字数据读入寄存器R2,并将R2的高16位清零



;STR指令,内存地址0x30003100=0xab

LDR R1,=0x30003100

MOV R0,#0xab

STRR0,[R1] ;将R0中的字数据写入以R1为地址的存储器中

STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中





;LDM,STM指令

LDR R1,=0x30003100

LDMIAR1,{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

MOVR0,#Test1

MOVR1,#1

Test1SETATest1+1

WEND



;汇编控制伪指令,IF指令

IFTest2={TRUE}

MOVR0,#1

MOVR1,#2

ELSE

MOVR0,#0

MOVR1,#0

ENDIF

B out

lable2

MOVR0,LR ;查看R14

NOP

NOP

MOV PC,LR ;从子程序返回





out

NOP













END
献花(0)
+1
(本文系cshi1990首藏)