从 ARM 指令机器码解释一些问题
为什么 MOV R0, #0x12345678 这条指令无法编译,而 MOV R0, #0x678 却可以编译通
过?
为什么芯片会有立即数寻址,寄存器寻址,间接寻址等多种寻址方式?一种寻址方式
不可以么。
为什么 B 跳转指令只能跳转到±32MBytes 的范围内?
下面,我们一起来看看 ARM7 的指令格式,从指令格式中找出这些问题的答案。
以 下 内 容 参 考了 “ 底 层 工 作 者 手 册 之 嵌 入 式 操 作 系 统 内 核 ” 一 书 , 详 情 请 登 录
www.ifreecoding.com 下载相关资料。
ARM7 内核采用的是 RISC 精简指令集,所有的 ARM 指令都是 32bits 的,在这 32bits
里既包含了指令的指令码,也包含了指令需要运算的数据,以 MOV 指令为例,通过 MOV
指令的 32bits 可以识别出这是一个 MOV 指令,又可以在这 32bits 里找到源寄存器和目的寄
存器。我们来看一下 MOV 指令的机器码格式:
图 1 MOV 指令的机器码格式
28~31bits(cond)是条件码,就是表明这条语句里是否有大于、等于、非零等的条件
判断,这 4bits 共有 16 种状态,分别为:
二进制码 指令符号 含义 二进制码 指令符号 含义
0000 EQ
相等
0001 NE
不等
0010 CS/HS
进位/无符号数
大于等于
0011 CC/LO
清进位/无符
号数小于
0100 MI
减/负数
0101 PL
加/正数或 0
0110 VS
溢出
0111 VC
没溢出
1000 HI
无符号数大于
1001 LS
无符号数小
于等于
1010 GE
有符号数大于
等于
1011 LT
有符号数小
于
1100 GT
有符号数大于
1101 LE
有符号数小
于等于
1110 AL
任何条件
1111 -
未定义