如何在ARM的二进制补码中找到整数的绝对值
Posted
技术标签:
【中文标题】如何在ARM的二进制补码中找到整数的绝对值【英文标题】:How to find the absolute value of an integer in Two's complement in ARM 【发布时间】:2018-11-15 01:59:20 【问题描述】:如果我有 -2 (1111111111111111111111111111110),是否有一个简洁的 ARM 指令或一系列这样的指令可以使它成为 (00000000000000000000000000000010)。自从我失去第 30 位以来,OR 或 XOR 将无法正常工作。
谢谢
【问题讨论】:
ARM 的求反指令是rsb dst, src, #0
(反向减法)。你可以tst
/谓词-rsb
。我认为这就是 C++ 编译器在内联/优化 std::abs
时会做的事情,但您应该尝试编译启用优化的 abs
函数。
哪个arm指令集?你看过NEG吗?您确实需要检查答案中所示的比较...
【参考方案1】:
要找到整数的绝对值,请使用比较和减法。
@ input in r0
cmp r0, #0 @ is r0 < 0?
rsbmi r0, r0 #0 @ if yes, r0 = 0 - r0
【讨论】:
mvn
按位非,反码反码而不是二进制补码。 infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/…。就像我评论的那样,你可以使用rsbmi r0, #0
@PeterCordes 显然你是对的。我认为mvn
代表“移动否定”。也就是说,你收到我的电子邮件了吗?
我知道了,谢谢提醒。我今天应该有时间看看。
@PeterCordes 我期待着你们的 cmets!
值得注意的是,如果您使用的是 ARMv7 或 ARMv8 设备,您将使用不包括条件执行非分支指令的 Thumb-2 指令集。在rsbmi
之前,您需要一个it mi
。许多汇编程序会为您插入此内容,尽管有些汇编程序会发出警告,因为您收到了未明确请求的指令。见community.arm.com/processors/b/blog/posts/…以上是关于如何在ARM的二进制补码中找到整数的绝对值的主要内容,如果未能解决你的问题,请参考以下文章