【LV12 Day7 跳转与存储器访问指令】

@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大多数指令集都可以带指令后缀

【LV12 Day7 跳转与存储器访问指令】_第1张图片

@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

你可能感兴趣的:(LV12,ARM体系结构与接口技术,linux,笔记)