疑问:一个SPSR的奇怪表示方法:为什么要写成spsr_cf?

[复制链接]
 楼主| xjc 发表于 2007-3-13 11:01 | 显示全部楼层 |阅读模式
疑问:一个SPSR的奇怪表示方法:为什么要写成spsr_cf?<br /><br />在超级用户模式下使用&nbsp;SWI<br />当执行&nbsp;SWI&nbsp;指令时:<br />1.&nbsp;处理器进入超级用户模式<br />2.&nbsp;CPSR&nbsp;被存储在&nbsp;spsr_SVC&nbsp;中。<br />3.&nbsp;返回地址被存储在&nbsp;lr_SVC&nbsp;中(请参阅第&nbsp;6-7&nbsp;页的处理器对异常的反应)。<br />如处理器已经处在超级用户模式下,lr_SVC&nbsp;和&nbsp;spsr_SVC&nbsp;被破坏。<br />在超级用户模式下,如果调用&nbsp;SWI,则需存储&nbsp;lr_SVC&nbsp;和&nbsp;spsr_SVC,以确保链接寄存器和&nbsp;SPSR&nbsp;中的初始值不被丢失。例如,一个特定&nbsp;SWI&nbsp;编号的处理程序例程调用了另一个&nbsp;SWI,必须确保该该处理程序例程将&nbsp;lr_SVC&nbsp;和&nbsp;spsr_SVC&nbsp;存储在堆中。它确保了处理程序的每一次调用都保存了返回到调用&nbsp;SWI&nbsp;指令所需要的信息。<br /><br />STMFD&nbsp;sp!,{r0-r3,r12,lr}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Store&nbsp;registers.<br />MOV&nbsp;r1,&nbsp;sp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Set&nbsp;pointer&nbsp;to&nbsp;parameters.<br />MRS&nbsp;r0,&nbsp;spsr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Get&nbsp;spsr.<br />STMFD&nbsp;sp!,&nbsp;{r0}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Store&nbsp;spsr&nbsp;onto&nbsp;stack.<br />LDR&nbsp;r0,[lr,#-4]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;<br />BIC&nbsp;r0,r0,#0xFF000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;<br /><br />BL&nbsp;C_SWI_Handler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Call&nbsp;C&nbsp;routine&nbsp;to&nbsp;handle&nbsp;the&nbsp;SWI.<br /><br />LDMFD&nbsp;sp!,&nbsp;{r0}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Get&nbsp;spsr&nbsp;from&nbsp;stack.<br />MSR&nbsp;spsr_cf,&nbsp;r0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Restore&nbsp;spsr.为什么要写成spsr_cf?<br />LDMFD&nbsp;sp!,&nbsp;{r0-r3,r12,pc}^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;Restore&nbsp;registers&nbsp;and&nbsp;return.<br /><br />
我爱喝水 发表于 2007-3-15 12:26 | 显示全部楼层

指定PSR的域

参见&nbsp;<br />ADS_AssemblerGuide_B.pdf&nbsp;184页&nbsp;4-74<br />4.8.3&nbsp;MSR&nbsp;指令的解释<br />4.8.3&nbsp;MSR<br />Load&nbsp;specified&nbsp;fields&nbsp;of&nbsp;the&nbsp;CPSR&nbsp;or&nbsp;SPSR&nbsp;with&nbsp;an&nbsp;immediate&nbsp;constant,&nbsp;or&nbsp;from&nbsp;the<br />contents&nbsp;of&nbsp;a&nbsp;general-purpose&nbsp;register.<br />Syntax<br />MSR{cond}&nbsp;&ltpsr&gt_&ltfields&gt,&nbsp;#immed_8r<br />MSR{cond}&nbsp;&ltpsr&gt_&ltfields&gt,&nbsp;Rm<br />where:<br />cond&nbsp;is&nbsp;an&nbsp;optional&nbsp;condition&nbsp;code&nbsp;(see&nbsp;Conditional&nbsp;execution&nbsp;on&nbsp;page&nbsp;4-4).<br />&ltpsr&gt<br />is&nbsp;either&nbsp;CPSR&nbsp;or&nbsp;SPSR.<br />&ltfields&gt<br />specifies&nbsp;the&nbsp;field&nbsp;or&nbsp;fields&nbsp;to&nbsp;be&nbsp;moved.&nbsp;&ltfields&gt&nbsp;can&nbsp;be&nbsp;one&nbsp;or&nbsp;more&nbsp;of:<br />c&nbsp;control&nbsp;field&nbsp;mask&nbsp;byte&nbsp;(PSR[7:0])<br />x&nbsp;extension&nbsp;field&nbsp;mask&nbsp;byte&nbsp;(PSR[15:8])<br />s&nbsp;status&nbsp;field&nbsp;mask&nbsp;byte&nbsp;(PSR[23:16)<br />f&nbsp;flags&nbsp;field&nbsp;mask&nbsp;byte&nbsp;(PSR][31:24]).<br />immed_8r&nbsp;is&nbsp;an&nbsp;expression&nbsp;evaluating&nbsp;to&nbsp;a&nbsp;numeric&nbsp;constant.&nbsp;The&nbsp;constant&nbsp;must<br />correspond&nbsp;to&nbsp;an&nbsp;8-bit&nbsp;pattern&nbsp;rotated&nbsp;by&nbsp;an&nbsp;even&nbsp;number&nbsp;of&nbsp;bits&nbsp;within&nbsp;a<br />32-bit&nbsp;word.<br />Rm&nbsp;is&nbsp;the&nbsp;source&nbsp;register.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

xjc

15

主题

84

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部