;文件名: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位
2使用条件码“cond”可以实现高效的逻辑操作,提高代码效率。
举例比如EQ 代表相等 NE代表不相等 AL无条件执行 VS溢出 PL正数或零 MI负数 CC/LO无符号数小于 CS/HS无符号数大于或等于 HI 无符号数大于 LS无符号数小于或等于
示例代码如下:

本文详细介绍了ARM处理器的指令格式,包括必填项和可选项,如opcode、cond、S、Rd、Rn和operand2。讨论了如何利用灵活的operand2提高代码效率,以及条件码cond的高效逻辑操作。此外,还详细阐述了存储器访问指令,如LDR和STR,包括单寄存器操作和多寄存器操作,以及各种寻址方式和数据块传送指令。
最低0.47元/天 解锁文章
1699

被折叠的 条评论
为什么被折叠?



