3 汇编语言
day3.txt
汇编语言:
1.传输指令
直接传输 mov r0, #12 //r0 = 12
取反传输 mvn r0, #1 //r0 = ~0x1;
MVN{S}<c> <Rd>, <Rm>{, <shift>} //指令的操作数可以进行移位操作。
mvn r1, r0, lsr #12 r1 = ~(r0>>12)
lsr 逻辑右移 低位丢弃,高位补0
lsl 逻辑左移 高位丢失,低位补0
asr 算术右移 符号位不丢失,按照lsr进行移位操作,空位补符号位
ror 循环右移 按照lsr操作,最低位不丢失,补到最高位
如果存在第二操作数,第一操作数必须是寄存器
如果第一操作数和目标寄存器是同一个寄存器,则可以省略
2.运算指令:
add r0, r1, #12 r0 = r1 + 12
add r0, #12 r0 = r0 + 12
sub r0, r1, #12 r0 = r1 - 12
mul
主要完成64位数据运算
adc R0, R1, #12 R0 = R1 + 12 + C(cpsr的c域 cpsr.c)
sbc R0, R1, #12 R0 = R1 - 12 - !C
3.位操作指令
按位与 and r0, r1, #12 r0 = r1 & 0x12
按位或 orr r0, r1, r2 r0 = r1 | r2
按位异或 eor r0, r1, r2 r0 = r1 ^ r2
位清除 bic r0, r1, r2 r0 = r1 & ~r2
(将第二操作数按位取反后和第一操作数按位与,结果回写到目标寄存器,清除第一操作数中第二操作数为1的那些位)
bic r0, #0x80
4.比较指令:可以改变cpsr标志位
cmp r0, r1 r0 - r1,根据结果自动改变cpsr标志,可以使用全部条件
cmn r0,r1 ==== r0 + r1 取反比较,快速判断补码
teq r0, r1 ===== r0 ^ r1 判断是否相等,可以使用的条件 eq和ne
(位测试指令)tst r0, r1 ==== r0 & r1 判断第一操作数中第二操作数为1的那些位是否位0 ,可以使用的条件eq和ne
条件执行:cpu会自动的判断cpsr的标志,单不会改变cpsr
eq (相等)
ne (不等)
ge (大于等于)
lt (小于)
gt (大于)
le (小于等于)
5.跳转
短跳转,相对跳转。相对域当前pc前后32M范围寻址
b fun //不带返回的跳转
bl fun //带返回的跳转, 比b跳转多了保存返回地址到lr, mov lr, pc
c函数有自返回机制。最后会增加mov pc, lr
标号:标号是地址的助记符,没有空间
fun: “标号”
长跳转:
mov pc, lr
ldr pc, =0x12345678 //将0x12345678写入pc
arm的伪指令:
ldr r0, =0x1221111 //ldr可以完成任意32位数值到寄存器的传递
ldr pc, =fun //fun为标号,将fun的地址写入pc
*************************************************
*6.特殊寄存器操作指令,读-改-写 *
* spsr操作cpu自动完成不须要程序控制 *
*cpsr操作必须借助核心寄存器,只能通过如下指令。 *
* *
*mrs r0, cpsr //r0 = cpsr *
*bic r0, #0x80 //irq使能 *
*msr cpsr , r0 cpsr = r0 *
*************************************************
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步