- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
1.内嵌汇编--内嵌汇编注意事项对于寄存器R0~R3、LR和PC的使用要格外小心。编译器在计算表达式时可能会将寄存器R0~R3、R12和R14用于子程序调用,因此在内嵌的汇编指令中,不要将这些寄存器同时指定为物理寄存器。2.5.4汇编语言与C语言的混合编程__asm{ MOV R0,x ADD y,R0,x/y /*(x/y)的结果覆盖了R0*/}例:__asm{ MOV var,x ADD y,var,x/y }*1.内嵌汇编--内嵌汇编注意事项不要使用寄存器寻址变量。2.5.4汇编语言与C语言的混合编程intbad_f(intx){ __asm{ADDR0,R0,#1} /*将发生寄存器冲突,R0 中保存的x的值将不变*/ returnx; }例:intbad_f(intx){ __asm{ADDx,x,#1} /*将发生寄存器冲突,R0 中保存的x的值将不变*/ returnx; }*1.内嵌汇编--内嵌汇编注意事项使用内嵌汇编时,编译器会自动保存和恢复可能用到的寄存器,用户无须在程序中再作这些工作。读物理寄存器(除PSR寄存器之外)之前必须先进行写入。2.5.4汇编语言与C语言的混合编程intf(intx){__asm { STMFD SP,{R0} ;由于SP出现了写前先读,因 此对R0的保存是非法的 ADD R0,x,#1 EOR x,R0,x LDMFD SP!,{R0} ;对R0的恢复没有必要 }returnx;}例:*1.内嵌汇编--内嵌汇编注意事项LDM和STM指令的寄存器列表中只允许使用物理寄存器。内嵌汇编可以修改处理器模式、协处理器状态和FP、SL、SB等ATPCS寄存器,但是编译器在编译时并不了解这些变化,所以必须保证在执行C语言代码前恢复被改变了的处理器模式。2.5.4汇编语言与C语言的混合编程由于汇编语言使用“,”作为操作数的分隔符,因此带“,”的C语言表达式作为操作数时,必须用“()”括起来归为一个汇编操作数。*#include stdio.hvoid my_strcpy(char *src,constchar *dst){ intch; __asm { loop: #ifdef _arm /*ARM版本*/ LDRB ch,[src],#1 STRB ch,[dst],#1 #else /*Thumb版本*/ LDRB ch,[src] ADD src,#1 STRB ch,[dst] ADD dst,#1 #endif CMP ch,#0 BNE loop }}例1、字符串复制6.ARM分支指令--BX2.4.3ARM指令集BX R6例:*BLX {cond} Rm6.ARM分支指令--BLX2.4.3ARM指令集句法:*6.ARM分支指令--BLX2.4.3ARM指令集指令用于实现带链接分支,并可选地交换指令集。BLX指令具体用途有:将下一条指令的地址拷贝到R14(LR,链接寄存器)中;转移到label或Rm中的地址;切换到Thumb指令集,条件是Rm的位[0]为1或者使用“BLXlabel”的形式。机器级的“BLXlabel”指令的转移不能超过当前指令地址的±32Mb范围。指令说明:*6.ARM分支指令--BX2.4.3ARM指令集BLX R0BLX thumbsub例:*7.ARM协处理器指令2.4.3ARM指令集ARM支持16个协处理器,如用于控制片上功能(如cache、MMU)的系统协处理器、浮点协处理器以及其它一些专用的协处理器。每个协处理器均忽略ARM处理器和其它协处理器的指令。如果协处理器没有接受ARM的协处理器指令,则ARM将产生未定义指令中止的陷阱,以此可用来实现“协处理器丢失”的软件仿真。*SWI {cond}immed_248.ARM杂项指令--SWI2.4.3ARM指令集句法:SWI指令引起处理器SWI异常,即处理器变为管理模式,CPSR内容保存到管理模式的SPSR中,执行转移到SWI向量。这条指令不影响条件码标志。指令说明:软件中断指令——SWI*BKPT
文档评论(0)