建设局网站信息管理制度,wordpress 注册码授权,响应式网站网站建设,医疗机构 网站备案有些指令将字节、半字或字扩展到寄存器大小#xff0c;可以是 X 或 W。这些指令存在于有符号#xff08;SXTB、SXTH、SXTW#xff09;和无符号#xff08;UXTB、UXTH#xff09;变体中#xff0c;并且是适当的位域操作指令。
这些指令的有符号和无符号变体都将字节、半字…有些指令将字节、半字或字扩展到寄存器大小可以是 X 或 W。这些指令存在于有符号SXTB、SXTH、SXTW和无符号UXTB、UXTH变体中并且是适当的位域操作指令。
这些指令的有符号和无符号变体都将字节、半字或字尽管只有 SXTW 对字进行操作扩展到寄存器大小。源始终是 W 寄存器。目标寄存器是 X 或 W 寄存器但 SXTW 除外它必须是 X 寄存器。
例如SXTB X0, W1 —— 通过重复字节的最左边的位将寄存器 W1 的最低有效字节从 8 位符号扩展为 64 位。
位域指令类似于 ARMv7 中存在的指令包括位域插入 BFI 以及有符号和无符号位域提取 (S/U)BFX。还有额外的位域指令例如 BFXIL低位域提取和插入、UBFIZ无符号位域插入零和 SBFIZ有符号位域插入零。
还有 BFM、UBFM 和 SBFM 指令。 这些是 ARMv8 新增的位域移动指令。但是不需要明确使用这些指令因为为所有情况提供了别名。这些别名是已经描述的位域操作[SU]XT[BHWX]、ASR/LSL/LSR immediate、BFI、BFXIL、SBFIZ、SBFX、UBFIZ 和 UBFX。
CLZ —— 计数寄存器中的前导零位。
RBIT —— 反转所有位。
REV —— 反转寄存器的字节顺序。
REV16 —— 反转寄存器中每个半字的字节顺序。
REV32 —— 反转寄存器中每个字的字节顺序。
REV、REV16、可以在字32 位或双字64 位大小的寄存器上执行REV32 仅适用于 64 位寄存器。
1. SXTB
SXTBSigned Extend Byte指令从寄存器中提取一个 8 位值将其符号扩展到寄存器的大小并将结果写入目标寄存器。该指令是 SBFM 指令的别名。 32-bit (sf 0 N 0)
SXTB Wd, Wn
等价指令
SBFM Wd, Wn, #0, #7
64-bit (sf 1 N 1)
SXTB Xd, Wn
等价指令
SBFM Xd, Xn, #0, #7
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
下面是使用 SXTB 指令的例子。 long long int x 0;int y 0x7080;asm volatile(SXTB %x[x], %w[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 SXTB %x[x], %w[y] 将 %w[y] 的最低 8 位符号扩展为 64 位也就是 0x7080 中的 0x800b1000 0000符号位为 1扩展到 64 位即 0xFFFF FFFF FFFF FF80十进制为 -128这也是最终 x 的值。
2. SXTH
SXTHSign Extend Halfword —— 符号扩展半字指令提取一个 16 位值将其符号扩展到寄存器的大小并将结果写入目标寄存器。该指令是 SBFM 指令的别名。 32-bit (sf 0 N 0)
SXTH Wd, Wn
等价指令
SBFM Wd, Wn, #0, #15
64-bit (sf 1 N 1)
SXTH Xd, Wn
等价指令
SBFM Xd, Xn, #0, #15
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
下面是使用 SXTH 指令的例子。 long long int x 0;int y 0x7080;asm volatile(SXTH %x[x], %w[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 SXTH %x[x], %w[y] 将 %w[y] 的最低 16 位符号扩展为 64 位也就是 0x7080 中的 0x70800b0111 0000 1000 0000符号位为 0扩展到 64 位还是 0x7080十进制为 28800这也是最终 x 的值。
3. SXTW
SXTWSign Extend Word —— 符号扩展字指令将一个字符号扩展到寄存器的大小并将结果写入目标寄存器。该指令是 SBFM 指令的别名。 64-bit
SXTW Xd, Wn
等价指令
SBFM Xd, Xn, #0, #31
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
下面是使用 SXTW 指令的例子。 long long int x 0;int y 0x7080;asm volatile(SXTW %x[x], %w[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 SXTW %x[x], %w[y] 将 %w[y] 符号扩展为 64 位也就是 0x7080 中的 0x70800b0000 0000 0000 0000 0111 0000 1000 0000符号位为 0扩展到 64 位还是 0x7080十进制为 28800这也是最终 x 的值。
4. UXTB
UXTBUnsigned Extend Byte —— 无符号扩展字节 从寄存器中提取一个 8 位值将其零扩展到寄存器的大小并将结果写入目标寄存器。该指令是 UBFM 指令的别名。 32-bit
UXTB Wd, Wn
等价指令
UBFM Wd, Wn, #0, #7
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
下面是使用 UXTB 指令的例子。 int x 0;int y 0x7080;asm volatile(UXTB %w[x], %w[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 UXTB %w[x], %w[y] 将 %w[y] 扩展为 32 位也就是 0x7080 中的 0x800b1000 0000扩展到 32 位以零填充扩展位最终还为 0x80这也是最终 x 的值。
5. UXTH
UXTHUnsigned Extend Halfword —— 无符号扩展半字 从寄存器中提取一个 16 位值将其零扩展到寄存器的大小并将结果写入目标寄存器。该指令是 UBFM 指令的别名。 32-bit
UXTH Wd, Wn
等价指令
UBFM Wd, Wn, #0, #15
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
下面是使用 UXTH 指令的例子。 int x 0;int y 0x77777080;asm volatile(UXTH %w[x], %w[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 UXTH %w[x], %w[y] 将 %w[y] 扩展为 32 位也就是 0x77777080 的低 16 位即 0x70800b0111 0000 1000 0000扩展到 32 位以零填充扩展位最终还为 0x7080这也是最终 x 的值。
6. BFI
BFIBitfield Insert —— 位域插入指令将 width 位的位域从源寄存器的最低有效位复制到目标寄存器的位位置 lsb而其他目标位保持不变。该指令是 BFM 指令的别名。 32-bit (sf 0 N 0)
BFI Wd, Wn, #lsb, #width
等价指令
BFM Wd, Wn, #(-lsb MOD 32), #(width-1)
64-bit (sf 1 N 1)
BFI Xd, Xn, #lsb, #width
等价指令
BFM Xd, Xn, #(-lsb MOD 64), #(width-1)
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
lsb 对于 32 位变体是目标位域的 lsb 的位数范围为 0 到 31。对于 64 位变体是目标位域的 lsb 的位数范围为 0 到 63。
width 对于 32 位变体是位域的宽度范围为 1 到 32-lsb。对于 64 位变体是位域的宽度范围为 1 到 64-lsb。
下图是 BFI W0, W0, #9, #6 指令操作示意图 下面是使用 BFI 指令的例子。 long long int x -1;long long int y 0x77777080;asm volatile(BFI %x[x], %x[y], #16, #16\n:[x] r(x),[y] r(y):: cc, memory);执行 BFI %x[x], %x[y], #16, #16 将 %x[y] 最低 16 位复制到 %x[x] 的 16 ~ 31 位也就是 0x77777080 的低 16 位即 0x70800b0111 0000 1000 0000复制到 %x[x] 的 16 ~ 31 位最终的结果就是 0xFFFF FFFF 7080 FFFF这也是最终 x 的值。
7. BFC
BFCBitfield Clear —— 位域清零 将目标寄存器的位位置 lsb 处的 width 位的位域设置为零而其他目标位保持不变。该指令是 BFM 指令的别名。 32-bit (sf 0 N 0)
BFC Wd, #lsb, #width
等价指令
BFM Wd, WZR, #(-lsb MOD 32), #(width-1)
64-bit (sf 1 N 1)
BFC Xd, #lsb, #width
等价指令
BFM Xd, XZR, #(-lsb MOD 64), #(width-1)
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
lsb 对于 32 位变体是目标位域的 lsb 的位数范围为 0 到 31。对于 64 位变体是目标位域的 lsb 的位数范围为 0 到 63。
width 对于 32 位变体是位域的宽度范围为 1 到 32-lsb。对于 64 位变体是位域的宽度范围为 1 到 64-lsb。
下图是 BFC W1, #3, #4 指令操作示意图 下面是使用 BFC 指令的例子。 long long int x -1;asm volatile(BFC %x[x], #8, #8\n:[x] r(x):: cc, memory);执行 BFC %x[x], #8, #8 将 %x[x] 寄存器的 8 ~ 15 位宽度为 8清零即 0xFFFF FFFF FFFF 00FF这也是最终 x 的值。
8. SBFX
SBFXSigned Bitfield Extract —— 有符号位域提取 指令复制一个 width 位的位域从源寄存器中的位位置 lsb 开始到目标寄存器的最低有效位并将位域前面的目标位设置为位域最高有效位的副本。该指令是 SBFM 指令的别名。 32-bit (sf 0 N 0)
SBFX Wd, Wn, #lsb, #width
等价指令
SBFM Wd, Wn, #lsb, #(lsbwidth-1)
64-bit (sf 1 N 1)
SBFX Xd, Xn, #lsb, #width
等价指令
SBFM Xd, Xn, #lsb, #(lsbwidth-1)
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
lsb 对于 32 位变体是源位域的 lsb 的位数范围为 0 到 31。对于 64 位变体是源位域的 lsb 的位数范围为 0 到 63。
width 对于 32 位变体是位域的宽度范围为 1 到 32-lsb。对于 64 位变体是位域的宽度范围为 1 到 64-lsb。
下面是使用 SBFX 指令的例子。 long long int x 0;long long int y 0x87;asm volatile(SBFX %x[x], %x[y], #4, #4\n:[x] r(x),[y] r(y):: cc, memory);执行 SBFX %x[x], %x[y], #4, #4首先将 %x[y] 寄存器内的 0x87 的 4 ~ 7 位复制到 %x[x] 寄存器的 0 ~ 3 位又因为 0x87 的第七位为 1所以使用 1 扩展 %x[x] 的 4 ~ 63 位这里体现了符号位即 0xFFFF FFFF FFFF FF80这也是最终 x 的值。
9. UBFX
UBFXUnsigned Bitfield Extract —— 无符号位域提取指令复制一个 width 位的位域从源寄存器中的位位置 lsb 开始到目标寄存器的最低有效位并将位域前面的目标位设置为零。该指令是 UBFM 指令的别名。 32-bit (sf 0 N 0)
UBFX Wd, Wn, #lsb, #width
等价指令
UBFM Wd, Wn, #lsb, #(lsbwidth-1)
64-bit (sf 1 N 1)
UBFX Xd, Xn, #lsb, #width
等价指令
UBFM Xd, Xn, #lsb, #(lsbwidth-1)
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
lsb 对于 32 位变体是源位域的 lsb 的位数范围为 0 到 31。对于 64 位变体是源位域的 lsb 的位数范围为 0 到 63。
width 对于 32 位变体是位域的宽度范围为 1 到 32-lsb。对于 64 位变体是位域的宽度范围为 1 到 64-lsb。
下图是 UBFX W1, W0, #18, #7 指令操作示意图 下面是使用 UBFX 指令的例子。 long long int x 0;long long int y 0x87;asm volatile(UBFX %x[x], %x[y], #4, #4\n:[x] r(x),[y] r(y):: cc, memory);执行 UBFX %x[x], %x[y], #4, #4首先将 %x[y] 寄存器内的 0x87 的 4 ~ 7 位复制到 %x[x] 寄存器的 0 ~ 3 位接着使用 0 扩展 %x[x] 的 4 ~ 63 位即 0x8这也是最终 x 的值。
10. BFXIL
位域提取并在低端插入其他位不变。该指令是 BFM 指令的别名。 32-bit (sf 0 N 0)
BFXIL Wd, Wn, #lsb, #width
等价指令
BFM Wd, Wn, #lsb, #(lsbwidth-1)
64-bit (sf 1 N 1)
BFXIL Xd, Xn, #lsb, #width
等价指令
BFM Xd, Xn, #lsb, #(lsbwidth-1)
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
lsb 是源位域的“lsb”的位数。对于 32 位变体范围为 0 到 31对于 64 位变体范围为 0 到 63。
width 是位域的宽度。对于 32 位变体范围为 1 到 32-lsb对于 64 位变体范围为 1 到 64-lsb。
下面是使用 BFXIL 指令的例子。 long long int x 0x4444;long long int y 0x87;asm volatile(BFXIL %x[x], %x[y], #4, #4\n:[x] r(x),[y] r(y):: cc, memory);执行 BFXIL %x[x], %x[y], #4, #4首先将 %x[y] 寄存器内的 0x87 的 4 ~ 7 位复制到 %x[x] 寄存器的 0 ~ 3 位其它位保持不变所以最终 %x[x] 的值为 0x4448。
11. UBFIZ
无符号位域插入零左右为零。该指令是 UBFM 指令的别名。 32-bit (sf 0 N 0)
UBFIZ Wd, Wn, #lsb, #width
等价指令
UBFM Wd, Wn, #(-lsb MOD 32), #(width-1)
64-bit (sf 1 N 1)
UBFIZ Xd, Xn, #lsb, #width
等价指令
UBFM Xd, Xn, #(-lsb MOD 64), #(width-1)
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
lsb 是源位域的“lsb”的位数。对于 32 位变体范围为 0 到 31对于 64 位变体范围为 0 到 63。
width 是位域的宽度。对于 32 位变体范围为 1 到 32-lsb对于 64 位变体范围为 1 到 64-lsb。
下面是使用 UBFIZ 指令的例子。 long long int x 0x444444;long long int y 0x89;asm volatile(UBFIZ %x[x], %x[y], #8, #8\n:[x] r(x),[y] r(y):: cc, memory);执行 UBFIZ %x[x], %x[y], #8, #8首先将 %x[y] 寄存器内的 0x89 低 8 位复制到 %x[x] 寄存器的 8 ~ 15 位其它位全部清零所以最终 %x[x] 的值为 0x8900。
12. SBFIZ
带符号的位域插入零符号复制到左边零复制到右边。该指令是 SBFM 指令的别名。 32-bit (sf 0 N 0)
SBFIZ Wd, Wn, #lsb, #width
等价指令
SBFM Wd, Wn, #(-lsb MOD 32), #(width-1)
64-bit (sf 1 N 1)
SBFIZ Xd, Xn, #lsb, #width
等价指令
SBFM Xd, Xn, #(-lsb MOD 64), #(width-1)
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
lsb 是源位域的“lsb”的位数。对于 32 位变体范围为 0 到 31对于 64 位变体范围为 0 到 63。
width 是位域的宽度。对于 32 位变体范围为 1 到 32-lsb对于 64 位变体范围为 1 到 64-lsb。
下面是使用 SBFIZ 指令的例子。 long long int x 0x444444;long long int y 0x89;asm volatile(SBFIZ %x[x], %x[y], #8, #8\n:[x] r(x),[y] r(y):: cc, memory);执行 SBFIZ %x[x], %x[y], #8, #8首先将 %x[y] 寄存器内的 0x89 低 8 位复制到 %x[x] 寄存器的 8 ~ 15 位接着由于 0x89 符号位为 1所以 16 ~ 63 位全部复制为 1 0 ~ 7 位则清零所以最终 %x[x] 的值为 0xFFFF FFFF FFFF 8900。
13. BFM
BFMBitfield move —— 位域移动位域移动其他位不变。该指令由别名 BFC、BFI 和 BFXIL 使用。 如果 imms 大于或等于 immr则将从源寄存器中的位位置 immr 开始的imms - immr 1位的位域复制到目标寄存器的最低有效位。 如果 imms 小于immr则将源寄存器的最低有效位中的imms 1位的位域复制到目标寄存器的位位置regsize - immr其中 regsize 是 32 或 64 位的目标寄存器大小。
在这两种情况下目的寄存器的其他位保持不变。 32-bit (sf 0 N 0)
BFM Wd, Wn, #immr, #imms
64-bit (sf 1 N 1)
BFM Xd, Xn, #immr, #imms
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
immr 是循环右移量在“immr”字段中编码。对于 32 位变体在 0 到 31 的范围内对于 64 位变体是在 0 到 63 范围内。
imms 是要从源移动的最左边的位数the leftmost bit number to be moved from the source编码在“imms”字段中。对于 32 位变体在 0 到 31 的范围内对于 64 位变体范围从 0 到 63。
下面是使用 BFM 指令的例子。 long long int x 0x444444;long long int y 0x79;asm volatile(BFM %x[x], %x[y], #8, #4\n:[x] r(x),[y] r(y):: cc, memory);执行 BFM %x[x], %x[y], #8, #4将 0x790b01111001 中的 0 ~ 4 位4 1 5 共 5 位0b11001移动到目标寄存器 %x[x]也就是将 0x19 移动到 %x[x] 的最左边从 64 - 8 56 位开始复制其它位保持不变最终为 0x1900 0000 0044 4444。
14. UBFM
UBFMUnsigned Bitfield Move —— 无符号位域移动指令通常通过其别名之一进行访问该别名始终是反汇编的首选。 如果 imms 大于或等于 immr则将从源寄存器中的位位置 immr 开始的imms - immr 1位的位域复制到目标寄存器的最低有效位。 如果 imms 小于immr则将源寄存器的最低有效位中的imms 1位的位域复制到目标寄存器的位位置regsize - immr其中 regsize 是 32 或 64 位的目标寄存器大小。
在这两种情况下位域前面和后面的目标位都设置为零。
该指令由别名 LSL立即数、LSR立即数、UBFIZ、UBFX、UXTB 和 UXTH 使用。 32-bit (sf 0 N 0)
UBFM Wd, Wn, #immr, #imms
64-bit (sf 1 N 1)
UBFM Xd, Xn, #immr, #imms
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
immr 是循环右移量在“immr”字段中编码。对于 32 位变体在 0 到 31 的范围内对于 64 位变体是在 0 到 63 范围内。
imms 是要从源移动的最左边的位数the leftmost bit number to be moved from the source编码在“imms”字段中。对于 32 位变体在 0 到 31 的范围内对于 64 位变体范围从 0 到 63。
下面是使用 UBFM 指令的例子。 long long int x 0x444444;long long int y 0x79;asm volatile(UBFM %x[x], %x[y], #8, #4\n:[x] r(x),[y] r(y):: cc, memory);执行 UBFM %x[x], %x[y], #8, #4将 0x790b01111001 中的 0 ~ 4 位4 1 5 共 5 位0b11001移动到目标寄存器 %x[x]也就是将 0x19 移动到 %x[x] 的最左边从 64 - 8 56 位开始复制其它位清零最终为 0x1900 0000 0000 0000。
15. SBFM
SBFMSigned Bitfield Move —— 有符号位域移动指令通常通过其别名之一访问该别名始终是反汇编的首选。 如果 imms 大于或等于 immr则将从源寄存器中的位位置 immr 开始的imms - immr 1位的位域复制到目标寄存器的最低有效位。 如果 imms 小于immr则将源寄存器的最低有效位中的imms 1位的位域复制到目标寄存器的位位置regsize - immr其中 regsize 是 32 或 64 位的目标寄存器大小。
在这两种情况下位域后面的目的位被设置为零位域前面的位被设置到位域的最高有效位的拷贝。
该指令由别名 ASR立即数、SBFIZ、SBFX、SXTB、SXTH 和 SXTW 使用。 32-bit (sf 0 N 0)
SBFM Wd, Wn, #immr, #imms
64-bit (sf 1 N 1)
SBFM Xd, Xn, #immr, #imms
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
immr 是循环右移量在“immr”字段中编码。对于 32 位变体在 0 到 31 的范围内对于 64 位变体是在 0 到 63 范围内。
imms 是要从源移动的最左边的位数the leftmost bit number to be moved from the source编码在“imms”字段中。对于 32 位变体在 0 到 31 的范围内对于 64 位变体范围从 0 到 63。
下面是使用 SBFM 指令的例子。 long long int x 0x444444;long long int y 0x79;asm volatile(SBFM %x[x], %x[y], #8, #4\n:[x] r(x),[y] r(y):: cc, memory);执行 SBFM %x[x], %x[y], #8, #4将 0x790b01111001 中的 0 ~ 4 位4 1 5 共 5 位0b11001移动到目标寄存器 %x[x]也就是将 0x19 移动到 %x[x] 的最左边从 64 - 8 56 位开始复制它的后面的位清零前面的位由于符号位为 1因此全部复制为 1最终为 0xF900 0000 0000 0000。
16. CLZ
计算前导零位数Rd CLZ(Rn)。 32-bit (sf 0)
CLZ Wd, Wn
64-bit (sf 1)
CLZ Xd, Xn
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
下面是使用 CLZ 指令的例子。 long long int x 0;long long int y 0x79;asm volatile(CLZ %x[x], %x[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 CLZ %x[x], %x[y]计算 %x[y] 前导零的位数即 0x790b01111001中前导零的位数也就是 64 - 7 57最终将 57 写入 %x[x]。
17. RBIT
RBIT 指令反转所有位反转位序。 32-bit (sf 0)
RBIT Wd, Wn
64-bit (sf 1)
RBIT Xd, Xn
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
下面是使用 RBIT 指令的例子。 long long int x 0;long long int y 0x79;asm volatile(RBIT %x[x], %x[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 RBIT %x[x], %x[y]反转 %x[y] 中的所有位反转位序即 0x790b01111001反转为 0x9E00 0000 0000 0000最终将 0x9E00 0000 0000 0000 写入 %x[x]。
18. REV
REV 指令反转所有字节。 32-bit (sf 0)
REV Wd, Wn
64-bit (sf 1)
REV Xd, Xn
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。
下面是使用 REV 指令的例子。 long long int x 0;long long int y 0x12436579;asm volatile(REV %x[x], %x[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 REV %x[x], %x[y]反转 %x[y] 中的所有字节即 0x12436579 反转为 0x7965 4312 0000 0000最终将 0x7965 4312 0000 0000 写入 %x[x]。
19. REV16
REV16 指令反转 16 位半字中的字节。 32-bit (sf 0)
REV16 Wd, Wn
64-bit (sf 1)
REV16 Xd, Xn
Wd 是通用目标寄存器的 32 位名称在“Rd”字段中编码。
Wn 是通用源寄存器的 32 位名称在“Rn”字段中编码。
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。 下面是使用 REV16 指令的例子。 long long int x 0;long long int y 0x12436579;asm volatile(REV16 %x[x], %x[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 REV16 %x[x], %x[y]反转 %x[y] 中 16 位半字中的字节即 0x12436579 反转为 0x43127965最终将 0x43127965 写入 %x[x]。
20. REV32
REV32 指令反转 32 位字中的字节。 64-bit
REV32 Xd, Xn
Xd 是通用目标寄存器的 64 位名称在“Rd”字段中编码。
Xn 是通用源寄存器的 64 位名称在“Rn”字段中编码。 下面是使用 REV32 指令的例子。 long long int x 0;long long int y 0x12436579;asm volatile(REV32 %x[x], %x[y]\n:[x] r(x),[y] r(y):: cc, memory);执行 REV32 %x[x], %x[y]反转 %x[y] 中 32 位字中的字节即 0x12436579 反转为 0x79654312最终将 0x79654312 写入 %x[x]。
参考资料
1.《ARMv8-A-Programmer-Guide》 2.《Arm® A64 Instruction Set Architecture Armv8, for Armv8-A architecture profile》