ARM64体系结构编程与实践:算术与移位指令

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

本章思考题

1.请简述NZCV这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个条件标志位,即NZCV,如表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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值