@1.2跳转指令实现程序跳转,本质就是修改了PC寄存器
@方式一:直接修改PC寄存器的值(需要自己计算寄存器地址)
MAIN:
MOV R1,#1
MOV R2,#2
MOV R3,#3
MOV PC,#0X18
MOV R4,#4
MOV R5,#5
FUNC:
MOV R6,#6
MOV R7,#7
MOV R8,#8
@方式二:不带返回的跳转指令,修改PC寄存器的值到FUNC
MAIN:
MOV R1,#1
MOV R2,#2
MOV R3,#3
B FUNC
MOV R4,#4
MOV R5,#5
FUNC:
MOV R6,#6
MOV R7,#7
MOV R8,#8
@方式三:带返回的跳转指令,修改PC寄存器的值到FUNC,同时将跳转指令下一条指令的地址存储到LR寄存器
MAIN:
MOV R1,#1
MOV R2,#2
MOV R3,#3
BL FUNC
MOV R4,#4
MOV R5,#5
FUNC:
MOV R6,#6
MOV R7,#7
MOV R8,#8
MOV PC,LR
@比较指令
CMP R1,R2
@CMP的本质就是一条减法指令(只是没有将减法的结果放入寄存器)
MAIN:
MOV R1,#1
MOV R2,#2
MOV R3,#3
CMP R1,R2
BEQ FUNC@ 本质 if(EQ){B FUNC}:CPU读Z位,if(Z==1){B FUNC}
MOV R4,#4
MOV R5,#5
FUNC:
MOV R6,#6
MOV R7,#7
MOV R8,#8
MOV PC,LR
ARM大多数指令集都可以带指令后缀
@1.3 Load/Store指令:访问(读写)内存
@写内存
STR R1,[R2]
@将R1寄存器中存的数据存储到R2指向的内存空间
@读内存
LDR R3,[R2]
@将内存中R2指向的内存空间的数据读取到R3寄存器中
ARM 的寻址方式
寻址方式就是CPU去寻找一个操作数的方式
@立即寻址
MOV R1,#1
ADD R2,R1,#1
@寄存器寻址
ADD R2,R1,R3
@寄存器移位寻址
MOV R1,R2,LSL #1
@寄存器间接寻址
STR R1,[R2]
@基址变址寻址
MOV R1,#0xFFFFFFFF
MOV R2,#0x400000000
MOV R3,#4
STR R1,[R2,R3]
@将R1寄存器的内容写入到R2+R3指向的内存空间
STR R1,[R2,R3,LSL #1]
@将R1寄存器的内容写入到R2+(R3<<1)指向的内存空间
@前索引
MOV R1,#0xFFFFFFFF
MOV R2,#0x400000000
STR R1,[R2,#8]
@将R1寄存器的内容写入到R2+8指向的内存空间
@后索引
MOV R1,#0xFFFFFFFF
MOV R2,#0x400000000
STR R1,[R2],#8
@将R1寄存器的内容写入到R2指向的内存空间,R2自增8
@自动索引
MOV R1,#0xFFFFFFFF
MOV R2,#0x400000000
STR R1,[R2,#8]!
@将R1寄存器的内容写入到R2+8指向的内存空间,R2自增8
实现1-100求和
.text
.global _start
_start:
MOV R2, #0@sum
MOV R1, #0@num
BL ADDSUM
B STOP
ADDSUM:
ADD R2, R2, R1 @将R2+R1的结果存储到R2寄存器
ADD R1, R1, #1 @R1自增1后的结果存入R1寄存器
CMP R1, #100 @比较自增的最大值是否等于100
MOVEQ PC, LR
B ADDSUM
STOP:
B STOP
.end