1. LDR r0,=label 用于加载立即数或一个地址值到指定寄存器中
1.1 如果label是立即数: LDR r0,=0X123 ;将0X123存入r0中
1.2 如果name是个标识符: LDR r0,=label_1 ;将label_1所指向的地址值存入r0中
2. LDR r0,[r1] ;将R1中的值存到r0中
3. LDR r1,[r2,#16] ;将(r2+16)地址中的内容存到r1中
4. LDR r1,[r2],#4 ;将r2地址中的内容存到r1中,同时r2=r2+4
a. STR r1,[r2] ; 将r1中的值存到r2所指定的地址中
b. STR r1,[r2,#4] ;将r1中的值存到r2+4所指定的地址中
c. STR r1,[r2],#4 ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4
LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件(我的一篇新的文章),说明了这两个文件用于栈操作时的注意事项。
(1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register。下面这条语句就说明的很清楚:
LDR R1, [R2]
R1< Rbr />就是把R2中的内容对应的地址的值(一个memory地址),读取到R1中(一个register)
(2)STR:S表示STORE,STORE的含义应该理解为:Store from a register into memory。下面这条语句表示的很清楚:
STR R1, [R2]
R1——>[R2]
就是把寄存器R1中的内容“保存”到R2的值对应的地址中(一个memory地址)。
显然,这两条语句都有个特点,就是寄存器写在前面(左边)而内存地址写在后面(右边),数据传送的方向则是恰好相反的。
(3)LDM:L的含义仍然是LOAD,即是Load from memory into register。不同之处在于,该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:
LDMFD SP! , {R0, R1, R2}
实际上可以理解为: LDMFD [SP]!, {R0, R1, R2}
显然,这里SP是个地址,但是写在了左边,而把寄存器组—R0, R1, R2 写在了右边,这个是要注意的。
(4)STM:S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。
STMFD SP! , {R0}
同样的,该指令也可理解为: STMFD [SP]!, {R0}
这里,是把R0保存到堆栈中。
显然,这两个堆栈操作指令也有个特点,就是寄存器组写在后面(右边)而堆栈指针写在前面(左边),而且实际上使用的是堆栈指针中的内存地址,这一点与前面两条指令是有区别的。
这四条指令中,前面两条和后面两条其实联系不多,反而是差别很大,因此,可以直接把这两组指令区分开来,认为它们之间没有联系,这样避免误解。
1.1 如果label是立即数: LDR r0,=0X123 ;将0X123存入r0中
1.2 如果name是个标识符: LDR r0,=label_1 ;将label_1所指向的地址值存入r0中
2. LDR r0,[r1] ;将R1中的值存到r0中
3. LDR r1,[r2,#16] ;将(r2+16)地址中的内容存到r1中
4. LDR r1,[r2],#4 ;将r2地址中的内容存到r1中,同时r2=r2+4
a. STR r1,[r2] ; 将r1中的值存到r2所指定的地址中
b. STR r1,[r2,#4] ;将r1中的值存到r2+4所指定的地址中
c. STR r1,[r2],#4 ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4
LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件(我的一篇新的文章),说明了这两个文件用于栈操作时的注意事项。
(1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register。下面这条语句就说明的很清楚:
LDR R1, [R2]
R1< Rbr />就是把R2中的内容对应的地址的值(一个memory地址),读取到R1中(一个register)
(2)STR:S表示STORE,STORE的含义应该理解为:Store from a register into memory。下面这条语句表示的很清楚:
STR R1, [R2]
R1——>[R2]
就是把寄存器R1中的内容“保存”到R2的值对应的地址中(一个memory地址)。
显然,这两条语句都有个特点,就是寄存器写在前面(左边)而内存地址写在后面(右边),数据传送的方向则是恰好相反的。
(3)LDM:L的含义仍然是LOAD,即是Load from memory into register。不同之处在于,该指令是将内存中堆栈内的数据,批量的赋值给寄存器,即是出栈操作;其中堆栈指针一般对应于SP,注意SP是寄存器R13,实际用到的却是R13中的内存地址,只是该指令没有写为[R13],同时,LDM指令中寄存器和内存地址的位置相对于前面两条指令改变了,下面的例子:
LDMFD SP! , {R0, R1, R2}
实际上可以理解为: LDMFD [SP]!, {R0, R1, R2}
显然,这里SP是个地址,但是写在了左边,而把寄存器组—R0, R1, R2 写在了右边,这个是要注意的。
(4)STM:S的含义仍然是STORE,与LDM是配对使用的,其指令格式上也相似,即区别于STR,是将堆栈指针写在左边,而把寄存器组写在右边。
STMFD SP! , {R0}
同样的,该指令也可理解为: STMFD [SP]!, {R0}
这里,是把R0保存到堆栈中。
显然,这两个堆栈操作指令也有个特点,就是寄存器组写在后面(右边)而堆栈指针写在前面(左边),而且实际上使用的是堆栈指针中的内存地址,这一点与前面两条指令是有区别的。
这四条指令中,前面两条和后面两条其实联系不多,反而是差别很大,因此,可以直接把这两组指令区分开来,认为它们之间没有联系,这样避免误解。