【发布时间】:2019-02-05 13:13:49
【问题描述】:
在汇编语言级别在 RISC-V 中处理大端值的最简单方法是什么?也就是说,如何将内存中的大端值加载到寄存器中,使用本地端(小端)中的寄存器值,然后将其以大端方式存储回内存中。 16、32 和 64 位值用于许多网络协议和文件格式。
我找不到字节交换指令(相当于 x86 上的 BSWAP 或 ARM 上的 REV)in the manual,也找不到任何关于大端加载和存储的信息。
【问题讨论】:
-
您是否尝试过检查文档?这确实是一个可以通过快速阅读相关document来回答的问题。
-
是的,多个来源。字节交换是如此常见的操作,我想我一定错过了什么,这就是我在这里问的原因。
-
我尝试检查编译器在您请求字节交换时会执行哪些操作,但 Godbolt 的 clang risc-v 安装已损坏,并尝试将 x86 内联 asm 用于
endian.hbe32toh()。 godbolt.org/z/6MzVWa。也许编写编译器可以识别为字节交换的纯 C 语言会起作用,但不能证明指令不存在。 -
这可以通过带有 XBitmanip 扩展的单个指令来完成,这不是核心,甚至不是最终的扩展。无论如何,这在这个问题的范围内吗?
-
我正在调查这个,调查代码质量......请参阅 gcc.godbolt.org/z/dwMH9S,其中显示了处理 64 位存储的几种方法的生成代码。
标签: assembly endianness riscv