Cortex_M3指令集解析.ppt

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

Cortex M3指令集 ?? 汇编语言基础 ?? 指令集 ?? 近距离地检视指令 ?? Cortex‐M3 中的一些新好指令 一、汇编语言基础 1.汇编语言:基本语法 2.汇编语言:后缀的使用 3.汇编语言:统一的汇编语言 二、指令集 三、近距离地检视指令 1. 汇编语言:数据传送 2. 汇编语言:数据处理 3. 汇编语言: 子程呼叫与无条件转移指令 4. 汇编语言:标志位与条件转移 5. 汇编语言:指令隔离(barrier)指令和存储器隔离指令 6.汇编语言:饱和运算 7. CM3 中的一些有用的新指令 呼叫子程序时,需要保存返回地址,正点的指令是: BL Label ;转移到Label 处对应的地址,并且把转移前的下 条指令地址保存到LR BLX reg ;转移到由寄存器reg 给出的地址,根据REG 的 LSB 切换处理器状态, ;并且把转移前的下条指令地址保存到LR 执行这些指令后,就把返回地址存储到LR(R14)中了,从而才能使用”BX LR”等形式返回。使用BLX 要小心,因为它还带有改变状态的功能。因此reg 的LSB 必须是1,以确保不会试图进入ARM 状态。如果忘记置位LSB,则fault 伺候。 对于艺高胆大的玩家来说,使用以PC 为目的寄存器的MOV 和LDR 指令也可以实现转移,并且往往能借此实现很多常人想不到的绝活,常见形式有: MOV PC, R0 ;转移地址由R0 给出 LDR PC, [R0] ;转移地址存储在R0 所指向的存储器中 POP {…,PC} ;把返回地址以弹出堆栈的风格送给PC, ;从而实现转移(这也是OS 惯用的一项必杀技— —译注) LDMIA SP!, {…, PC} ;POP 的另一种等效写法 同理,使用这些密技,你也必须保证送给PC 的值必须是奇数(LSB=1) 注意:有心的读者可能已经发现,ARM 的BL 虽然省去了耗时的访内操作,却只能支持一级子程序调用。如果子程序再呼叫 “孙程序”,则返回地址会被覆盖。因此当函数嵌套多于一级时,必须在调用“孙程序”之前先把LR 压入堆栈——也就是所谓的“溅出” 在应用程序状态寄存器中有5 个标志位,但只有4 个被条件转移指令参考。绝大多数ARM 的条件转移指令根据它们来决定是否转移,如表4.25 所示 在ARM 中,数据操作指令可以更新这4 个标志位。这些标志位除了可以当作条件转移的判据之外,还能在一些场合下作为指令是否执行的依据(详见If‐Then 指令块),或者在移位操作中充当各种中介角色(仅进位位C) 担任条件转移及条件执行的判据时,这4 个标志位既可单独使用,又可组合使用,以产生共15 种转移判据,如下表4.26 所示 表中共有15 个条件组合(AL 相当于无条件——译注),通过把它们点缀在无条件转移指令(B)的后面,即可做成各式各样的条件转移指令,例如: BEQ label ;当Z=1 时转移 亦可以在指令后面加上“.W”,来强制使用Thumb‐2 的32 位指令来做更远的转移(没必要,汇编器会自行判断——译注),例如: BEQ.W label 这些条件组合还可以用在If‐Then 语句块中,比如: CMP R0, R1 ;比较R0,R1 ITTET GT ;If R0R1 Then(T代表Then,E代表Else) MOVGT R2, R0 MOVGT R3, R1 MOVLE R2, R0 MOVGT R3, R1 在CM3 中,下列指令可以更新PSR 中的标志: ?? 16 位算术逻辑指令 ?? 32 位带S 后缀的算术逻辑指令 ?? 比较指令(如,CMP/CMN)和测试指令(如TST/TEQ) ?? 直接写 PSR/APSR (MSR 指令) 大多数16 位算术逻辑指令不由分说就会更新标志位(不是所有,例如ADD.N Rd, Rn, Rm 是16 位指令,但不更新标志位——译注),32 位的都可以让你使用S 后缀来控制。例如: ADDS.W R0, R1, R2 ;使用32 位Thumb-2 指令,并更新标志 ADD.W R0, R1, R2 ;使用32 位Thumb-2 指令,但不更新标志位 ADD R0, R1 ;使用16 位Thumb 指令,无条件更新标志位 ADDS R0, #0xcd ;使用16 位Thumb 指令,无条件更新标志位 虽然真实指令的行为如上所述。但是在你用汇编语言写代码时,因为有了 UAL(统一汇编语言),汇编器会做调整,最终生成的指令不一定和与你在字面上写的指令相同。对于ARM 汇编器而言,调整的结果是:如果没有写后缀S,汇编器就一定会产生不更新标志位的指令。 S 后缀的使用要当心。16 位Thumb

文档评论(0)

此项为空 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档