ARM汇编 – (2) ARM程序状态寄存器
 2016.04.30    |      汇编    |     AilsonJack    |     暂无评论    |     4693 views
By: Ailson Jack
Date: 2016-04-14
个人博客: http://www.only2fire.com/
<p style="text-indent: 2em;">ARM的程序状态寄存器CPSR反映了当前处理器的状态,其中包含:<br/></p><p style="text-indent: 2em;">1)、4个条件代码标志(负(N)、零(Z)、进位(C)和溢出(V) );<br/></p><p style="text-indent: 2em;">2)、2个中断禁止位,分别控制一种类型的中断;<br/></p><p style="text-indent: 2em;">3)、1个用于指示当前执行指令(ARM还是Thumb)的位;<br/></p><p style="text-indent: 2em;">4)、5个对当前处理器模式进行编码的位。<br/></p><p style="text-indent: 2em;">CPSR的寄存器格式如下图:</p><p style="text-align:center"><img src="/uploads/AilsonJack/2018.08.26/1535280839873086.png" onclick="preview_image(&#39;/uploads/AilsonJack/2018.08.26/1535280839873086.png&#39;)"/></p><p class="artical_littlestyle1">1、条件代码标志</p><p style="text-indent: 2em;"><span style="color: rgb(255, 0, 0);">在ARM状态下,绝大多数的指令都是有条件执行的;在Thumb状态下,仅有分支指令(B、BL、BX)是条件执行的。</span><br/><span style="color: rgb(118, 146, 60);">N:负数标志</span><br/></p><p style="text-indent: 2em;">N=1表示运算结果为负数(符号位为1);N=0表示运算结果为正数或者0(符号位为0)。<br/></p><p style="text-indent: 2em;">举例如下:<br/></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">MOVS R1, #0x3 ;N=0 ,符号位为0,表示正数<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">MOVS R2, 0x80000000 ;N=1 ,符号位为1,表示负数<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">SUBS R0, R1, #0x1 ;N=0 ,R0=R1-0x1<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">SUBS R0, R1, #0x3 ;N=0 ,R0=R1-0x3<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">SUBS R0, R1, #0x4 ;N=1 ,R0=R1-0x4</span><br/><span style="color: rgb(118, 146, 60);">Z:零标志</span><br/></p><p style="text-indent: 2em;">Z=1表示运算结果为零;Z=0表示运算结果非零。<br/></p><p style="text-indent: 2em;">举例如下,依然是上面的例子:<br/></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">MOVS R1, #0x3 ;N=0 Z=0 ,符号位为0,表示正数<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">MOVS R2, 0x80000000 ;N=1 Z=0 ,符号位为1,表示负数<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">SUBS R0, R1, #0x1 ;N=0 Z=0 ,R0=R1-0x1<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">SUBS R0, R1, #0x3 ;N=0 Z=1 ,R0=R1-0x3<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">SUBS R0, R1, #0x4 ;N=1 Z=0 ,R0=R1-0x4</span><br/></p><p style="text-indent: 0em;"><span style="color: rgb(118, 146, 60);">C:进位标志</span><br/>可以有4种方法来设置C位的值:<br/><span style="background-color: rgb(118, 146, 60);">1)、</span>加法运算(包括比较指令CMN):当运算结果产生了进位时(无符号数溢出),C=1,否则C=0。<br/></p><p style="text-indent: 2em;">举例如下:<br/></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">MOV R1, #0xfffffffd<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">ADDS R0, R1, #0x1 ;N=1 Z=0 C=0 ,R0=R1+0x1=0xfffffffe<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">ADDS R0, R1, #0x2 ;N=1 Z=0 C=0 ,R0=R1+0x2=0xffffffff<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">ADDS R0, R1, #0x3 ;N=0 Z=1 C=1 ,R0=R1+0x3=0x0 计算结果溢出<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">ADDS R0, R1, #0x4 ;N=0 Z=0 C=1 ,R0=R1+0x4=0x1 计算结果溢出</span><br/><span style="background-color: rgb(118, 146, 60);">2)、</span>减法运算(包括比较指令CMP):当运算时产生了借位C=0,否则C=1。<br/></p><p style="text-indent: 2em;">举例如下,依然是上面的例子:<br/></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">MOVS R1, #0x3 ;N=0 Z=0 C=0,符号位为0,表示正数,没有产生进位<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">MOVS R2, 0x80000000 ;N=1 Z=0 C=1,符号位为1,表示负数,没有产生借位<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">SUBS R0, R1, #0x1 ;N=0 Z=0 C=1,R0=R1-0x1,没有产生借位<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">SUBS R0, R1, #0x3 ;N=0 Z=1 C=1,R0=R1-0x3,没有产生借位<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">SUBS R0, R1, #0x4 ;N=1 Z=0 C=0,R0=R1-0x4,产生了借位</span><br/><span style="background-color: rgb(118, 146, 60);">3)、</span>对于包含移位操作的非加/减法指令,C为移出值的最后一位。<br/></p><p style="text-indent: 2em;">举例如下:<br/></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">MOVS R1, 0x80000000 ;N=1 Z=0 C=1 ,符号位为1,表示负数,没有产生借位<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">LSRS R2, R1, #1 ;N=0 Z=0 C=0 ,逻辑右移1位,移出的值为0,那么C=0,R2=0x40000000<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">LSLS R3, R2, #2 ;N=0 Z=1 C=1 ,逻辑左移2位,移出值的最后一位为1,那么C=1,R2=0x00000000</span><br/><span style="background-color: rgb(118, 146, 60);">4)、</span>对于其他的非加/减法运算指令,C的值通常不变。<br/></p><p style="text-indent: 2em;">简单总结下C值改变的情况:加法产生进位,减法没产生借位时C位置1;对于移位操作,C位为移出值的最后一位。</p><p style="text-indent: 0em;"><span style="color: rgb(118, 146, 60);">V:溢出标志</span><br/>可以有2种方法设置V的值:<br/><span style="background-color: rgb(118, 146, 60);">1)、</span>对于加/减运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。<br/><span style="background-color: rgb(118, 146, 60);">2)、</span>对于其他的非加/减运算指令,V的值通常不变。<br/></p><p style="text-indent: 2em;">处理器内部以补码的方式表示有符号数,假设该处理器为8位的,那么表达的整数范围为:-128~+127,如果计算的结果超出了-128~+127,那么溢出标志V置位。<br/></p><p style="text-indent: 2em;">溢出标志V和进位标志C是两个意义不同的标志。进位标志表示无符号数运算结果是否超出范围;溢出标志表示有符号数运算结果是否超出范围。<br/></p><p style="text-indent: 2em;">举例如下:<br/></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">MOV R1, #0x7fffffff ;32位正数的最大值<br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">ADDS R0, R1 , #1 ;N=1 Z=0 C=0 V=1 ,R0=0x80000000</span><br/></p><p style="text-indent: 2em;">ARM指令的基本格式如下:<br/></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">&lt;opcode&gt; {&lt;cond&gt;} {S} &lt;Rd&gt; ,&lt;Rn&gt;{,&lt;operand2&gt;}</span><br/></p><p style="text-indent: 2em;">使用条件码“cond”可以实现高效的逻辑操作(节省跳转和条件语句),提高代码效率(关于ARM指令更详细的说明将在下一篇文章中进行说明)。<br/></p><p style="text-indent: 2em;">指令条件码表:<br/></p><p style="text-align:center"><img src="/uploads/AilsonJack/2018.08.26/1535280839327448.png" onclick="preview_image(&#39;/uploads/AilsonJack/2018.08.26/1535280839327448.png&#39;)"/></p><p style="text-align:center"><img src="/uploads/AilsonJack/2018.08.26/1535280839526031.png" onclick="preview_image(&#39;/uploads/AilsonJack/2018.08.26/1535280839526031.png&#39;)"/></p><p class="artical_littlestyle2">2、控制位</p><p style="text-indent: 0em;"><span style="color: rgb(118, 146, 60);">I:中断禁止位</span><br/></p><p style="text-indent: 2em;">I=1表示禁止IRQ中断;I=0表示使能IRQ中断。<br/><span style="color: rgb(118, 146, 60);">F:中断禁止位</span><br/></p><p style="text-indent: 2em;">F=1表示禁止FIQ中断;F=0表示使能FIQ中断。<br/><span style="color: rgb(118, 146, 60);">T:状态位</span><br/></p><p style="text-indent: 2em;">T=1表示程序运行于Thumb状态;T=0表示程序运行于ARM状态。<br/><span style="color: rgb(118, 146, 60);">M4~M0:模式位</span><br/></p><p style="text-indent: 2em;">这几位是模式位,这些位决定了处理器的运行模式,具体含义如下图:<br/></p><p style="text-align: center;"><img src="/uploads/AilsonJack/2018.08.26/1535280839828166.png" onclick="preview_image(&#39;/uploads/AilsonJack/2018.08.26/1535280839828166.png&#39;)"/></p>
欢迎关注博主的公众号呀,精彩内容随时掌握:
热情邀请仔细浏览下博客中的广告,万一有对自己有用或感兴趣的呢。◕ᴗ◕。。
如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^,当然了能够赞赏博主,那就非常感谢啦!
注: 转载请注明出处,谢谢!^_^
转载请注明来源: 本文链接:  By: AilsonJack
ARM汇编 – (2) ARM程序状态寄存器  |  说好一起走
暂无评论,要不要来个沙发
发表评论

 
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号