6705|0

446

帖子

0

TA的资源

裸片初长成(高级)

楼主
 

浅析arm汇编中^、!、cxsf符号和movs等指令使用学习 [复制链接]

.macro restore_user_regs ldr r1,[sp, #S_PSR] ldr lr,[sp, #S_PC]! @ !用来控制基址变址寻址的最终新地址是否进行回写操作, @ 执行ldr之后sp被回写成sp+#S_PC基址变址寻址的新地址 msr spsr,r1 @ 把cpsr的值保存到spsr中 ldmdb sp,{r0 - lr}^ @ lr=[sp-1*4],r13=[sp-2*4],r12=[sp-3*4],......,r0=[sp-15*4] @ 因为没对pc赋值,所以^的表示将数据恢复到User模式的[r0-lr]寄存器组中[gliethttp] mov r0,r0 add sp,sp,#S_FRAME_SIZE - S_PC movs pc,lr .endm 其他指令正在学习中[随时补充gliethttp] ----------------------------- 1.ldr ip,[sp],#4 将sp中内容存入ip,之后sp=sp+4; ldr ip,[sp,#4] 将sp+4这个新地址下内容存入ip,之后sp值保持不变 ldr ip,[sp,#4]!将sp+4这个新地址下内容存入ip,之后sp=sp+4将新地址值赋给sp str ip,[sp],#4 将ip存入sp地址处,之后sp=sp+4; str ip,[sp,#4] 将ip存入sp+4这个新地址,之后sp值保持不变 str ip,[sp,#4]!将ip存入sp+4这个新地址,之后sp=sp+4将新地址值赋给sp ----------------------------- 2.movs r1,#3 ;movs将导致ALU被更改,因为r1赋值非0,即操作结果r0非0,所以ALU的Z标志清0 bne 1f ;因为Z=0,说明不等,所以向前跳到标号1:所在处继续执行其他语句 ----------------------------- 3.LDM表示装载,STM表示存储. LDMED LDMIB 预先增加装载 LDMFD LDMIA 过后增加装载 LDMEA LDMDB 预先减少装载 LDMFA LDMDA 过后减少装载 STMFA STMIB 预先增加存储 STMEA STMIA 过后增加存储 STMFD STMDB 预先减少存储 STMED STMDA 过后减少存储 注意ED不同于IB;只对于预先减少装是相同的.在存储的时候,ED是过后减少的. FD、ED、FA、和 EA 指定是满栈还是空栈,是升序栈还是降序栈. 对于存储STM而言 先加后存 FA 姑且这么来记,先加(first add),存数据 后加先存 EA 姑且这么来记,存数据,后加end add 先减后存 FD 姑且这么来记,先减first dec,存数据 后减先存 ED 姑且这么来记,存数据,后减end dec 然后记忆LDM,LDM是STM的反相弹出动作,所以 因为是先加后存,所以后减先取 FA 就成了与STM对应的取数据,后减 因为是后加先存,所以先减后取 EA 就成了与STM对应的先减,取数据 因为是先减后存,所以后加先取 FD 就成了与STM对应的取数据,后加 因为是后减先存,所以先加后取 ED 就成了与STM对应的先加,取数据 我想通过上面的变态方式可以比较容易的记住这套指令[gliethttp] 一个满栈的栈指针指向上次写的最后一个数据单元,而空栈的栈指针指向第一个空闲单元. 一个降序栈是在内存中反向增长(就是说,从应用程序空间结束处开始反向增长)而升序栈在内存中正向增长. 其他形式简单的描述指令的行为,意思分别是 IA过后增加(Increment After)、 IB预先增加(Increment Before)、 DA过后减少(Decrement After)、 DB预先减少(Decrement Before). RISC OS使用传统的满降序栈.在使用符合APCS规定的编译器的时候,它通常把你的栈指针设置在应用程序空间的 结束处并接着使用一个FD(满降序-Full Descending).如果你与一个高级语言(BASIC或C)一起工作,你将别无选择. 栈指针(传统上是R13)指向一个满降序栈.你必须继续这个格式,或则建立并管理你自己的栈.
此帖出自ARM技术论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【有奖直播】2025是德科技数字月-数字新品来助阵
直播时间:3月19日(周三)14:00
直播奖励:小米口红充电宝、倍思充电线、是德科技十周年鼠标垫

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表