本章思考题
1.请简述N、Z、C、V这4个条件标志位的作用。
2.下面两条ADD指令能否编译成功?
add x0, x1, #4096
add x0, x1, #1,LSL 1
3.下面的示例代码中,X0寄存器的值是多少?
mov x1, 0xffffffffffffffff
mov x2, #2
adc x0, x1, x2
4.下面的示例代码中,SUBS指令对PSTATE寄存器有什么影响?
mov x1, 0x3
mov x2, 0x1
subs x0, x1, x2
5.在下面的示例代码中,X0寄存器的值是多少?
mov x1, #3
mov x2, #1
sbc x0, x1, x2
6.检查数组array[0, index −1]是否越界,需要判断两个条件:一是输入值是否大于或等于index,二是输入值是否小于0。如下两条指令可实现数组边界检查的功能,其中X0寄存器的值为数组的边界index,X1寄存器的值为输入值input。请解释这两条指令为什么能实现数组越界检查。
subs xzr,x1,x0
b.hs OutOfInex
7.在下面的示例代码中,W2和W3的值是多少?
ldr w1, =0x8000008a
asr w2, w1, 1
lsr w3, w1, 1
8.如果想在汇编代码中使某些特定的位翻转,该如何操作?
9.设置某个寄存器A的Bit[7, 4]为0x5。下面是C语言的伪代码,用变量val来表示寄存器A的值2,请使用BFI指令来实现。
val &=~ (0xf << 4)
val |= ((u64)0x5 << 4)
10.下面的示例代码中,X0和X1寄存器的值分别是多少?
mov x2, #0x8a
ubfx x0, x2, #4, #4
sbfx x1, x2, #4, #4
11.下面是用C语言来读取pmcr_el0寄存器Bit[15:11]的值,请使用汇编代码来实现。
val = read_sysreg(pmcr_el0)
val = val >> 11;
val &= 0x1f;
本章主要介绍A64指令集中的算术运算和移位指令。
4.1 条件操作码
A64指令集沿用了A32指令集中的条件操作,在PSTATE寄存器中有4个条件标志位,即N、Z、C、V,如表4.1所示。
表4.1 条件标志位
| 条件标志位 |
描 述 |
| N |
负数标志(上一次运算结果为负值) |
| Z |
零结果标志(上一次运算结果为零) |
| C |
进位标志(上一次运算结果发生了无符号数溢出) |
| V |
溢出标志(上一次运算结果发生了有符号数溢出) |
常见的条件操作后缀如表4.2所示。
表4.2 常见的条件操作后缀
| 后 缀 |
含义(整数运算) |
条件标志位 |
条 件 码 |
| EQ |
相等 |
Z=1 |
0b0000 |
| NE |
不相等 |
Z=0 |
0b0001 |
| CS/HS |
发生了无符号数溢出 |
C=1 |
0b0010 |
| CC/LO |
没有发生无符号数溢出 |
C=0 |
0b0011 |
| MI |
负数 |
N=1 |
0b0100 |
| PL |
正数或零 |
N=0 |
0b0101 |
| VS |
溢出 |
V=1 |
0b0110 |
| VC |
未溢出 |
V=0 |
0b0111 |
| HI |
无符号数大于 |
(C=1) && (Z=0) |
0b1000 |
| LS |
无符号数小于或等于 |
(C=0) || (Z=1) |
0b1001 |
| GE |
有符号数大于或等于 |
N == V |
0b1010 |

本文详细介绍了ARM64指令集中关于算术运算和移位操作的指令,包括ADD、SUB、ADDS、ADC、SUBS、SBC等,以及它们的使用示例和与PSTATE寄存器标志位的关系。此外,还讲解了CMP指令的使用及其与条件跳转指令的配合。内容深入浅出,适合嵌入式开发人员学习。
最低0.47元/天 解锁文章
443

被折叠的 条评论
为什么被折叠?



