从arm汇编指令机器码解释一些问题

从arm汇编指令机器码解释一些问题

ID:15449311

大小:177.41 KB

页数:4页

时间:2018-08-03

从arm汇编指令机器码解释一些问题_第1页
从arm汇编指令机器码解释一些问题_第2页
从arm汇编指令机器码解释一些问题_第3页
从arm汇编指令机器码解释一些问题_第4页
资源描述:

《从arm汇编指令机器码解释一些问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、以下内容节选自“底层工作者手册之嵌入式操作系统内核”,更多内容请访问blog.sina.com.cn/ifreecoding为什么MOVR0,#0x12345678这条指令无法编译,而MOVR0,#0x678却可以编译通过?为什么芯片会有立即数寻址,寄存器寻址,间接寻址等多种寻址方式?一种寻址方式不可以么?为什么B跳转指令只能跳转到±32MBytes的范围内?ARM7内核采用的是RISC精简指令集,所有的ARM指令都是32bits的,在这32bits里既包含了指令的指令码,也包含了指令需要运算的数

2、据,以MOV指令为例,通过MOV指令的32bits可以识别出这是一个MOV指令,又可以在这32bits里找到源寄存器和目的寄存器。我们来看一下MOV指令的机器码格式:28~31bits(cond)是条件码,就是表明这条语句里是否有大于、等于、非零等的条件判断,这4bits共有16种状态,分别为:二进制码指令符号含义二进制码指令符号含义0000EQ相等0001NE不等0010CS/HS进位/无符号数0011CC/LO清进位/无符大于等于号数小于0100MI减/负数0101PL加/正数或00110VS

3、溢出0111VC没溢出1000HI无符号数大于1001LS无符号数小于等于1010GE有符号数大于1011LT有符号数小等于于1100GT有符号数大于1101LE有符号数小于等于1110AL任何条件1111-未定义表1汇编语言条件码指令与条件码可以有多种组合,比如MOV指令可以有MOV、MOVEQ、MOVLT等多种形式。前面我们说过状态寄存器里有NZCV的状态标志,当执行一条指令时,芯片就会将这条指令的条件码与状态寄存器中的状态标志做比较,如果状态寄存器中的状态标志满足这条指令的条件码时,则执行这

4、条语句,如果不满足则不执行这条指令。状态寄存器中的状态标志是受某些指令影响的,因此在使用有条件码的指令进行判断前,必然会有其它指令配合使用,先修改状态寄存器中的状态标志,例如:CMPR1,#0BEQGETNEXTTASKSP第一条指令“CMP”是一个“比较”指令,如果R1等于0,那么它就将状态寄存器中的Z置为1,表示结果为真,否则,将状态寄存器中的Z置为0,表示结果为假。第二条指令其实是一条“B”指令,是“跳转”指令,B之后的“EQ”就是条件码,从表1中可以知道,条件是“相等”时才执行。当R1等于

5、0时,CMP指令就将Z置为1,执行BEQ时满足条件,就执行了跳转。如果R1不等于0,CMP指令就将Z置为0,执行BEQ时不满足条件,就不执行跳转。同理,只有当状态寄存器中的标志为相等时,MOVEQ指令才会执行,这时其功能与MOV指令相同。而MOVLT指令则是当状态寄存器中的标志为有符号数,并且处于小于状态时才会执行的MOV指令。MOV指令的条件码是AL,因此MOV指令可以不管任何条件都去执行。其它指令也可以与条件码组合使用,具体情况请查阅参“ARMArchitectureReferenceManu

6、al”文档。25bit(I)是用来区别shifer_operand域是采用立即数寻址方式还是寄存器寻址方式,该bit为0表示寄存器寻址方式,为1表示立即数寻址方式,这就涉及到了指令的寻址方式。寻址方式的出现不是为了使指令能有多种写法,而是受指令长度限制被迫产生的产物。以MOV指令为例,如果采用立即数寻址,立即数的长度不可能超过shifer_operand域的长度(MOV指令可以采用移位的方式装下部分更长的立即数,这些不在讨论之内),因此我们就不可能使用MOVR0,#0x12345678这条指令。立

7、即数#0x12345678是32bits数据,已经超过了shifer_operand域所能装下的最长12bits数据,如果把0x12345678全部被存到指令中,那么该指令中将无法存储条件码等其它指令信息,因此,这条指令在编译时就会报错。为了解决这个问题,芯片设计人员就设计了寄存器寻址方式,在ARM7中每种模式有16个通用寄存器,2的4次方等于16,因此只需要用4bits就可以为每个寄存器分配一个编号,R0~R15寄存器分别对应0~15的编号。4bits的寄存器编号完全可以存入shifer_ope

8、rand域。采用寄存器寻址时,指令先查到寄存器的编号,然后再从寄存器中取出使用的数据,这样就解决了MOV指令受指令长度的限制而无法操作长立即数的问题。从上述描述的过程来看采用寄存器寻址方式必须先将数据放入一个寄存器中,然后才能使用MOV指令采用寄存器寻址。对比立即数寻址方式,它增加了指令的执行时间,也增加了代码,还多用了一个寄存器,但它的优点是可以操作长的数据。除了上面这两种寻址方式外,ARM7还有多种其它寻址方式,每种寻址方式都有其自身的特点,适用不同的场景,这里不介绍了。21~

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。