第08讲_第5章ARM指令集特点、寻址方式和指令分类详解 习题4 88页.ppt

第08讲_第5章ARM指令集特点、寻址方式和指令分类详解 习题4 88页.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第08讲_第5章ARM指令集特点、寻址方式和指令分类详解 习题4 88页

* fields可以是以下的一种或多种;(字母必须为小写);c 控制域屏蔽字节 (psr[7…0]);x 扩展域屏蔽字节 (psr[15…8]); s 状态域屏蔽字节 (psr[23…16]);f 标志域屏蔽字节 (psr[31…24])。 immed_8r 要传送到状态寄存器指定域的立即数,8位。 Rm 要传送到状态寄存器指定域的数据的源寄存器。 * * * * * * * * * * * ADR是 ◇当地址值不是字对齐时,其取值范围为-255~255。 ◇当地址值是字对齐时,其取值范围为-1020~1020。 ◇当地址值是16字节对齐时,其取值范围将更大。 举例: start MOV R0, #10 ;因为PC值为当前指令地址值加8字节 ADR R4, start ;本ADR伪指令将被编译器替换成SUB R4, PC, #0xC * 是中等范围的地址读取伪指令。该指令将基于PC或基于寄存器的地址值读取到寄存器中。ADRL伪指令比ADR伪指令可以读取更大范围的地址。ADRL伪指令在汇编时被编译器替换成两条指令。语法:ADRL {cond} register, expr 其中,register为目标寄存器。expr为基于PC或者基于寄存器的地址表达式,其取值范围如下: ◇当地址值不是字对齐时,其取值范围为-64KB~64KB。 ◇当地址值是字对齐时,其取值范围为-256KB~256KB。 ◇当地址值是16字节对齐时,其取值范围将更大。 * * * * * * 俞建新、王健、宋健建《嵌入式系统基础教程》,2008年3月,机械工业出版社,第119页 * * * * * 负数=minus * * * * * * * 注意:RRX只右移1位 * * 俞建新、王健、宋健建《嵌入式系统基础教程》,2008年3月,机械工业出版社,第126页 * 注意:前索引和后索引的区别。 [1] 针对LDR和STR的存储器访问指令 [2] LDR R2, [R3, #0x0C] 前索引 [3] LDR R2, [R3] #0x0C 后索引 数据传送完毕后将偏移量加到Rn中 * 俞建新、王健、宋健建《嵌入式系统基础教程》,2008年3月,机械工业出版社,第121页 * xxM{条件}{类型} Rn{!}, 寄存器列表{^} ‘xx’是 LD 表示装载,或 ST 表示存储。 再加 4 种‘类型’就变成了 8 个指令: 栈 其他 LDMED LDMIB 预先增加装载 LDMFD LDMIA 过后增加装载 LDMEA LDMDB 预先减少装载 LDMFA LDMDA 过后减少装载 STMFA STMIB 预先增加存储 STMEA STMIA 过后增加存储 STMFD STMDB 预先减少存储 STMED STMDA 过后减少存储 * * * * * * * * B BL(保存子程序的返回地址) BX (根据目标地址的最低位切换到Thumb状态) BLX * * * * * * 堆栈指令初始化 INITSTACK MOV R0,LR ;保存返回地址 MSR CPSR_c,#0xD3 LDR SP,StackSvc ;设置管理模式堆栈,M[4:0]=0b10011 MSR CPSR_c,#0xD2 LDR SP,StackIrq ;设置中断模式堆栈,M[4:0]=0b10010 MOV PC,R0 5.3.5 软中断指令SWI SWI指令用于产生软中断,从而实现从用户模式变换到管理模式,CPSR保存到管理模式的SPSR中,执行转移到SWI向量。在其它模式下也可使用SWI指令,处理器同样地切换到管理模式。 指令格式如下: SWI{cond} immed_24 // Thumb指令是 immed_8 其中: immed_24是24位立即数,值为0~16,777,215之间的整数。立即数用于指定指令请求的具体SWI服务。 指令举例如下: SWI 0 ;软中断,中断立即数为0 SWI 0x123456 ;软中断,中断立即数为0x123456 获得SWI指令的立即数 在SWI异常中断处理程序中,取出SWI立即数的步骤为:首先确定引起软中断的SWI指令是ARM指令还是Thumb指令,这可通过对SPSR访问得到; 然后取得该SWI指令的地址,这可通过访问LR寄存器得到; 接着读出指令,分解出立即数。 程序清单如下所示。 获得SWI指令的立即数(续) T_bit EQU 0x20 SWI

文档评论(0)

138****7331 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档