一文搞懂 ARM 64 系列: ADD(立即数版)

汇编中,加法指令很重要,因为它是执行其他很多指令的基础。

同时,加法指令也会影响NZCV标志。有关NZCV的介绍,可以参看《一文搞懂 ARM 64 系列: ADC》。

ARM64汇编中,ADD指令有3种形式,这里介绍第一种形式,也就是与立即数相加。

1 指令语法

cpp 复制代码
ADD <Xd|SP>, <Xn|Sp>, #imm{, shift}

{}里的内容表示是可选的。

shift表示LSL(逻辑左移)的位数,有2个取值,一个是0,一个是12。0是其默认值。

所谓LSL(逻辑左移),是指将数值整体向左移动,低位补0。如果高位被移出去,直接丢弃。

2 指令语义

整个指令就是将源寄存器<Xn|SP>,与立即数imm(如果有必要,需要进行LSL)相加,将结果写入目的寄存器<Xd|SP>。

注意 ,这条指令不影响NZCV标志。

cpp 复制代码
(<Xd|SP>, _) = <Xn|Sp> + imm << shift

3 NZCV 如何受影响

虽然这条指令最终不影响NZCV标志,但是搞清楚NZCV如何受影响,还是很有必要的。

1 将源寄存器的值<Xn|SP>和imm << shift都当成无符号整型数,两数相加,得到一个无符号整型数的结果,记作u_result。此时计算时不考虑溢出:

cpp 复制代码
<Xn|SP> = 0xffffffffffffffff // 64 bit 全 1
(imm << shift) = 1
u_result = 0xffffffffffffffff + 1 = 0x10000000000000000 // 2^64,而不是 0

2将源寄存器的值<Xn|SP>和imm << shift都当成有符号整型数,两数相加,得到一个有符号整型数的结果,记作s_result。此时计算时不考虑溢出:

复制代码
<Xn|SP> = 0xffffffffffffffff // 64 bit 全 1,此时当成 -1 看待
(imm << shift) = 0x8000000000000000 // 64 bit 最小负整数 -9223372036854775808
s_result = -1 + (-9223372036854775808) = -9223372036854775809 // 而不是 0x7fffffffffffffff

3 从u_result中取(63~0)共64bit,记作result;

4 如果result的最高位是1,那么N = 1;

5 如果result = 0,那么Z = 1;

6 如果把result当成无符号整型数,它的值等于u_result,那么C = 0;如果不等于,那么C = 1,也就是在进行加法运算时,发生了进位。

7 如果把result当成有符号整型数,它的值等于s_result,那么V = 0;如果不等于,那么V = 1,也就是说在进行加法运算,发生了溢出。

相关推荐
金士顿19 天前
ASP.NET Core Native AOT + systemd 实战:把 Linux ARM64 程序变成可靠的设备服务
linux·嵌入式·asp.net core·arm64
金士顿20 天前
System.Text.Json Source Generator 深度解析:为什么 Native AOT 不喜欢反射
linux·asp.net core·arm64·net·native aot
芝麻糊7621 天前
Ubuntu 26.04 ARM64 下 AIC8800 USB Wi-Fi 6 网卡驱动安装实战:从 make 缺失到驱动编译成功
网卡·arm64·aarch64·长城电脑
liferecords22 天前
第 5 讲 · 内存模型:复现一个“x86 能跑、ARM 挂掉“的 bug 并修好它
arm64·鲲鹏·内存模型·内存屏障·原子操作
金士顿23 天前
ASP.NET Core BackgroundService 深度解析:设备后台任务到底应该怎么设计
linux·嵌入式·asp.net core·arm64
咕咚.萌西4 个月前
ARMv8-A 体系架构
系统架构·arm64
底层开发智库4 个月前
获取编译并运行ARM64可信系统软件栈(TF-A+OP-TEE+UEFI+Linux)
linux·optee·arm64·可信软件
菠萝蚊鸭9 个月前
openEuler-24.03 ARM64 源码编译 RedisInsight
openeuler·arm64·redisinsight
鱼月半10 个月前
ARM64(华为S9006C,飞腾)银河麒麟离线安装docker及jitsi-meet方案
docker·arm64·银河麒麟·jitsi-meet
Better Bench10 个月前
Ubuntu aarch64 (arm64)架构开发板的Linux系统安装拼音输入法
linux·ubuntu·arm64·aarch64·拼音输入法