常用的汇编指令与技巧(收藏)
1.数据传送指令:mov
mover1,r2/*r1=r2*/
mover1,#4096/*r1=4096*/
2.大范围的地址读取指令:ldr
ldrr1,=0x123456789/*r1=0x123456789*/
ldrr1,=label/*获取绝对地址,即label的地址*/
label:
……
3.内存访问指令(当ldr后面没有=号时为内存读取指令)
读取指令:ldr
ldrr1,[r2,#4]/*将内存地址为r2+4的数据读取到r1中,相当于C语言中的*操作*/
ldrr1,[r2],#4/*将内存地址为r2的数据读取到r1中,再将地址加4,r2=r2+4*/
ldrpc,_irq/*pc=*(_irq)将标号中的内容放入pc中
_irq:
.worddo_swi
存储指令:str
strr1,[r2,#4]/*将r1的值存入地址为r2+4的内存中*/
strr1,[r2],#4/*将r1的值存入地址为r2的内存中,再将地址加4,r2=r2+4*/
4.批量内存访问指令ldm,stm
格式:ldm{cond}
stm{cond}
格式说明:
1){cond}:表示指令的执行条件,根据cpsr寄存器中的条件标志位决定是否执行该条指令,每条ARM指令包含4bit的条件码域,
可以定义16个执行条件,具体如下表:
2)
3)
4)
它表示指令执行后,spsr寄存中的值将自动复制到cpsr寄存器中--这通常用于中断处理函数的返回;如果没有pc寄存器,那^表示操作的是
用户模式下的寄存器,而不是当前特权模式下的寄存器。
5)指令中
扩展:
ldmfd
stmfd
5.算术指令
加指令:add
addr1,r2,#1/*r1=r2+1*/
减指令:sub
subr1,r2,#1/*r1=r2-1*/
乘指令:mul
mulr1,r2,#4/*r1=r2*4*/
6.程序状态寄存器的访问指令
msrcpsr,r0/*s<-r,r0的值复制到cpsr中*/
mrsr0,cpsr/*r<-s,将cpsr的值复制到r0中*/
7.相对跳转指令b,bl
1)这两条指令的区别在于bl除了跳转以外,还将返回地址(bl的下一条指令地址)保存在lr寄存器中
2)这两条指令的跳转范围是当前指令前后32M范围内
3)他们是位置无关的指令,相对跳转
e.g:
bfun1
fun1:
blfun2
fun2:
..............
扩展:绝对跳转ldrpc,=xxx
直接将要执行的指令地址存入pc中,pc为程序计数器,指向当前指向位置
8.其他指令
比较指令:cmp
cmpr1,r2/*根据对比的结果设置cpsr寄存器的标志位,参考ARM指令条件码表
逻辑指令
位与:and(相当于&)
andr0,r1,#0xff/*r0=r1&0xff*/
位或:orr(相当于|)
orrr0,r1,#0xff/*r0=r1|0xff*/
清零:bic
bicr0,r0,#0x03/*将r0中的第一位和第二位清零*/
测试:tst
tstr0,#0x20/*测试第六位是否为0,为0则将cpsr的Z位置1*/
总结
以上所述是小编给大家介绍的常用的汇编指令与技巧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。