;文件名:TEST1.S
;功能:实现两个寄存器相加
;说明:使用ARMulate软件仿真调试
AREA RESET,CODE,READONLY ;声明代码段RESET
ENTRY ;标识程序入口
CODE32 ;声明32位ARM指令
START MOV R0,#0 ;设置参数
MOV R1,#10
LOOP BL ADD_SUB ;调用子程序ADD_SUB
B LOOP ;跳转到LOOP
ADD_SUB
ADDS R0,R0,R1 ;R0 = R0 + R1
MOV PC,LR ;子程序返回
END ;文件结束
先看上面这个两个寄存器相加的例子,分号后面的是注释,标号要顶格写,最后要有END声明结束
一指令格式
<opcode> {cond} {S} <Rd> ,<Rn> , {operand2}
其中<>号内的项是必须的,{}号内的项是可选的。
opcode:指令助记符;
cond:执行条件;
S:是否影响CPSR寄存器的值;
Rd:目标寄存器; Rn:第1个操作数的寄存器;
operand2:第2个操作数;
1 、灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:
(1)#immed_8r——常数表达式;
该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到。8位图立即数必须满足:能用8位长度的小窗把32位数据中所有的“1”圈起来,并且这个32位的数能通过某个8位的常数通过循环右移偶数位得到
(2)Rm——寄存器方式;
在寄存器方式下,操作数即为寄存器的数值。比如:SUB R1,R1,R2
(3)Rm,shift——寄存器移位方式;
将寄存器的移位结果作为操作数,但Rm值保持不变,移位方法如下 比如:ADD R1,R1,R1,LSL #3 ;R1=R1+R1*8=9R1
补充移位方式如下:
ASR #n 算术右移n位; LSL #n 逻辑左移n位; LSR #n 逻辑右移n位; ROR #n 循环右移n位; RRX 带扩展的循环右移1位