【发布时间】:2021-02-03 23:28:24
【问题描述】:
问题是在RISC-V中将字符串转换为int
如果存在非0~9的字符,立即返回-1
但我想知道是否有任何方法可以通过使用最少指令来检查它
我的方法是将 48 和 57(对应 ASCII 中的 0~9)放入临时寄存器中,
并使用2个分支,首先检查=48
但它使用的指令太多,需要额外的临时寄存器来存储48和57。还有其他有效的方法吗?
【问题讨论】:
-
是的,因为无论如何你都必须减去
'0',这样做然后无符号比较c <= 9或c < 10。有关范围检查技巧,请参阅 What is the idea behind ^= 32, that converts lowercase letters to upper and vice versa?。 NASM Assembly convert input to integer? 是使用该想法的循环的 x86 asm 实现。它应该很好地转化为 RISC-V;尝试用 C 语言编写它并使用编译器。 -
我很好奇我可以让 GCC / clang 为 C 版本发出什么;结果不如我手写的 x86 asm 好,所以我写了一个答案。看起来也错过了 RISC-V 版本的一些优化。顺便说一句,gcc/clang 知道我提到的范围检查技巧;您通常不需要手动实现它。但是在这里将它与
-= '0'结合起来转换为整数是很有用的。
标签: assembly digits micro-optimization riscv atoi