之前的笔记搬运
ARM指令格式
1 | 图中圈出的为三地址指令格式; |
常数表达式表示立即数的方式:
12 0
当前值(4bit) * 2 = 后面常量移位的次数 | 记录一个8bit的常量(8bit) |
---|---|
1 | 所以, 常量表达式中的立即数是通过8位的常数通过循环右移偶数位得到,而不是一个任意数。 |
1 | 通过以上可以得出, 常量表达式中的立即数的有效二进制不能超过8位, 而且必须是2的n次方, 否则编译器编译不予通过; |
cond条件码
1 | 因为ARM的CPU也采用了流水线的工作方式, 所以一旦遇到跳转也会面临断流水线的情况, 大大影响执行效率, 所以ARM在每条指令的首部留下了4位用作于条件判断, 被称为条件码, 当取指令时会判断标志位是符合条件, 当不符合条件时, 就会忽略该条指令, 从而解决了断流水线的问题; |
条件码 | 助记符后缀 | 标 志 | 含 义 |
---|---|---|---|
0000 | EQ | Z 置位 = 1 | 相等 |
0001 | NE | Z 清零 = 0 | 不相等 |
0010 | CS | C 置位 = 1 | 无符号数大于或等于 |
0011 | CC | C 清零 = 0 | 无符号数小于 |
0100 | MI | N 置位 = 1 | 负数 |
0101 | PL | N 清零 = 0 | 正数或零 |
0110 | VS | V 置位 = 1 | 溢出 |
0111 | VC | V 清零 = 0 | 未溢出 |
1000 | HI | C 置位 = 1 Z 清零 = 0 | 无符号数大于 |
1001 | LS | C 清零 = 0 Z 置位 = 1 | 无符号数小于或等于 |
1010 | GE | N 等于 V | 带符号数大于或等于 |
1011 | LT | N 不等于 V | 带符号数小于 |
1100 | GT | Z 清零且( N 等于 V) | 带符号数大于 |
1101 | LE | Z 置位或( N 不等于 V) | 带符号数小于或等于 |
1110 | AL | 忽略 | 无条件执行 |
1111 | NV | 忽略 | 绝对不执行 |
1 | 条件 GT、GE、LT、LE 被成为有符号比较,而 HS、HI、LS、LO 被称为无符号比较。 |
寻址方式
1 | @1.寄存器寻址 |
零散笔记
1 | 在函数属性加: .thumb_func, 那么这个函数是thumb2指令集, 那么执行规则就是4bit和2bit混合指令; |