版权声明:本文为博主原创文章,如需转载,请注明出处 https://blog.csdn.net/qq_36554582/article/details/81269005 </div>
<div id="content_views" class="markdown_views prism-atom-one-dark">
<!-- flowchart 箭头图标 勿删 -->
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
<ul>
- ARM对存储器只有加载和存储两种操作,因此凡是与存储器操作有关的指令仅限于两类指令,即LDR和STR,其他指令无效
- “#”:立即数符号
- 例:#12(十进制),#0x12(十六进制)
- “!”:更新基址寄存器符号,它表示指令在完成操作之后最后的地址应该写入基址寄存器中
LDR(加载)
- 例:
LDR R0, [R1,#4] ;R0<—[R1+4]
LDR R0, [R1,#4]! ;R0<—[R1+4]、R1<—R1+4
LDR R0,[R1],R2 ;将由R1指示的存储器的字数据读入寄存器R0,并 将新地址R1+R2写入R1
LDR R0,#0X23 ;这是错误的指令,因为LDR是把第二个操作数给加载到第一个操作数,且第二个操作数不能使立即数。如果第二个数必须是立即数的时候,要在立即数前面加上“=”,如
LDR R1,=0X1234 ; R1=0X1234
- 例:
STR(存储)
- 例:
STR R1, [R2,#8] ;[R2+8]<—R1
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1
- 例:
MOV(数据传送)
- 例:
MOV R1,R0,LSL #3 ;将寄存器R0中的值左移3位后传送到R1
- 例:
TST(位测试指令):按位相与,查看CPSR对应标志位
- TEQ(相等测试指令):按位相异或,查看CPSR对应标志位
ADD(不带进位的加法):
- 例:
ADD R0,R2,R3,LSL,#1 ;R0=R2+(R3<<1)
- 例:
BIC(位清除指令)
- 例:
BIC R0,R0,#0X0B ;该指令清除R0中的位0,1和3,其余的位保持不变
- 例:
ARM汇编分支程序采用转移指令B子程序调用指令BL或条件转移指令BX来实现;在ARM汇编中一般没有专门的指令用来实现循环,一般采用比较指令CMP、ADD或SUB等能实现产生条件的指令,然后再通过带状态的条件转移指令BX来实现
- IMPORT:
- 例:
IMPORT Label ;IMPORT伪指令用于通知编译器要使用的标号在其他源文件中已经定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
- 例:
- EXPORT:此伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用
ARM处理器支持的伪指令有ADR、LDR和NOP
- ADR伪指令:用于把相对偏移地址加载到通用寄存器中
- 例:
ADR R0,mloop ;将mloop对应的相对偏移地址传送到R0中
- 例:
LDR伪指令:用于一个32位常数的加载或地址的加载
使用LDR伪指令有两个目的:
- 当用MOV或MNV指令无法加载符合要求的32位立即数时,可用LDR伪指令加载任意32位操作数到寄存器。因为MOV或MNV指令加载的32位数据只能是8位立即数通过移位的方式得到,所以不能加载任意32位常数
- 当需要程序的相对偏移地址或外部地址加载到寄存器时可用LDR伪指令
- ADR伪指令:用于把相对偏移地址加载到通用寄存器中
例:
LDR R1,=0X1234 ;R1=0X1234
LDR R1,=0XABCDEF98 ;R2=0XABCDEF98
LDR R3,=Mloop ;将Mloop对应的地址传送到R3中- HI: 无符号数大于
- CS:无符号数大于等于
- GT:带符号数大于
- LT:带符号数小于