gpt4 book ai didi

assembly - 在 RISC-V 上在大端和小端之间转换

转载 作者:行者123 更新时间:2023-12-02 20:01:55 25 4
gpt4 key购买 nike

在汇编语言级别处理 RISC-V 中的大端值的最简单方法是什么?也就是说,如何将内存中的大端值加载到寄存器中,以 native 端(小端)方式处理寄存器值,然后以大端方式将其存储回内存中。 16、32 和 64 位值用于许多网络协议(protocol)和文件格式。

我找不到字节交换指令(相当于 x86 上的 BSWAP 或 ARM 上的 REV)in the manual ,也没有任何关于大端加载和存储的内容。

最佳答案

最新的RISC-V User-Level ISA Manual中没有提到字节交换指令。 (2.1 版)。但是,该手册有一个占位符“B”位操作标准扩展。该扩展工作组的一些草稿 Material 为 collected on GitHub 。特别是draft specification谈论可以进行 16 位、32 位和 64 位字节交换的 grev 指令(广义逆向):

This instruction provides a single hardware instruction that can implement all of byte-order swap, bitwise reversal, short-order-swap, word-order-swap (RV64), nibble-order swap, bitwise reversal in a byte, etc, all from a single hardware instruction. It takes in a single register value and an immediate that controls which function occurs, through controlling the levels in the recursive tree at which reversals occur.

扩展 B 工作组在最终确定规范之前“因官僚原因于 2017 年 11 月解散”。

2020 年,工作组再次活跃,在链接的 GitHub 存储库中发布他们的工作。

因此,目前似乎没有什么比通常的转换面具或舞蹈更简单的了。我在 GCC 或 clang riscv 端口中找不到任何汇编语言 bswap 内在函数。例如,下面是由 riscv64-linux-gnu-gcc 编译器版本 8.1 发出的 bswapsi2 函数(对 32 位值进行字节交换)的反汇编。 0-12:

000000000000068a <__bswapsi2>:
68a: 0185169b slliw a3,a0,0x18
68e: 0185579b srliw a5,a0,0x18
692: 8fd5 or a5,a5,a3
694: 66c1 lui a3,0x10
696: 4085571b sraiw a4,a0,0x8
69a: f0068693 addi a3,a3,-256 # ff00 <__global_pointer$+0xd6a8>
69e: 8f75 and a4,a4,a3
6a0: 8fd9 or a5,a5,a4
6a2: 0085151b slliw a0,a0,0x8
6a6: 00ff0737 lui a4,0xff0
6aa: 8d79 and a0,a0,a4
6ac: 8d5d or a0,a0,a5
6ae: 2501 sext.w a0,a0
6b0: 8082 ret

关于assembly - 在 RISC-V 上在大端和小端之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52099612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com