汇编语言(模式切换)
一、12位立即数
- 如果某个数的数值范围是0~255之间,那么这个数一定是立即数;
- 把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;
- 这个数的二进制序列的右边必须为偶数个连续的 0。
eg:0x132 = 0000 0000 0000 0000 0000 0001 0011 0010
最高位1至最低位1之间的二进制数序列:1001 1001 从第一个1开始到最后一个1之间没有超过8位
末尾1的右边有1个0,不满足第二条,所以0x132不是立即数。
原因:ARM中将这 12bits 分为 8bit 常数(0~255)和 4bit 循环右移位值(0~15)。
8bit 常数范围(0~255),位移的步进值是以2为单位(即实际位移 2 * rotate 位),可以表示循环有以(0~30)偶数位: 0、2、4、6、8、10、12、14、16、18、20、22、24、26、28、30。在实际存储这个数值的时候,要想办法把这个数压缩到这12位中去。压缩的方法就是找一个数,这个数必须是一个8bit数,之后循环右移2 * rotate位。如果能找到这个数,那么待保存的数就是立即数,否则就不是。
二、指令
1、mov指令
加载12位立即数到寄存器或转移一个寄存器的值到另外一个寄存器
MOV{S}<c> <Rd>, #<const>
eg:mov r0, #2 ;加载立即数2到寄存器r0。
MOV{S}<c> <Rd>, <Rm>
eg:mov r1, r0 ;将r0寄存器的值加载到r1。
注:大多数指令的格式为opcode rd, rn ,rm,其中,rd是目标寄存器,rn是第一操作数寄存器。
2、add指令
ADD{S}<c> <Rd>, <Rn>, #<const>
ADDS}<c> <Rd>, <Rn>, <Rm>{, <shift>}
3、sub指令
SUB{S}<c> <Rd>, <Rn>, #<const>
SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
4、ldr寄存器加载指令
LDR{<c>}{<q>} <Rt>, <label> ;
如:ldr r0, =0x2FAB4
ldr指令多用于从ram中将一个32位的字数据传送到目的寄存器中
LDR<c> <Rt>, [<Rn>{, #+/-<imm12>}]
如:LDR R0,[R1,#8];将内存地址为R1+8的字数据读入寄存器R0,这里的#8作为12位立即数是可以省略的。
LDR<c> <Rt>, [<Rn>], #+/-<imm12>
如:ldr r0, [r1], #8 ;将内存地址R1的字数据读入r0,之后r1+8
LDR<c> <Rt>, [<Rn>, #+/-<imm12>]!
如:LDR R0,[R1,#8] !;将存储器地址为R1+8的字数据读入寄存器R0,并将新地址R1+8写入R1。
5、bic指定位清零指令
BIC{S}<c> <Rd>, <Rn>, #<const>;
将rn中的字数据const为1的比特清零,把结果放入rd。<const>的反码与<Rn>按位逻辑与
6、orr指定位置位指令:
ORR{S}<c> <Rd>, <Rn>, #<const> 按位逻辑或
例如:
三、CPSR程序状态寄存器
1、N Z C V位
N:在结果是有符号的二进制补码情况下,如果结果为负数,则N=1;如果结果为非负数,则N=0。
Z:如果结果为0,则Z=1;如果结果为非零,否则Z=0。
C:是针对无符号数最高有效位向更高位进位时C=1;减法中运算结果的最高有效位从更高位借位时C=0。
V:该位是针对有符号数的操作,会在下面两种情形变为1,两个最高有效位均为0的数相加,得到的结果最高有效位为1;两个最高有效位均为1的数相加,得到的结果最高有效位为0;除了这两种情况以外V位为0。
更新NZCV,可使几乎所有的arm指令都可以在指令之后可选地增加执行条件。
四、汇编语言与C语言之间的调用
调用函数时所传递的参数是:r0 r1 r2 r3作为前四个参数;第五个参数通过栈来传递。返回值通过r0传递。
例如:
1、汇编语言调用c语言
例如:比较三个值中的最大值。
五、模式切换及7种异常处理
原文地址:https://blog.csdn.net/2301_80315592/article/details/142357346
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!