Assembly 如何测试数字的奇偶性(浮点ARM)?

Assembly 如何测试数字的奇偶性(浮点ARM)?,assembly,arm,Assembly,Arm,我在做一个代码,我想检查一个数字的奇偶性,当这个数字是奇数时改变信号为负数,当这个数字是偶数时改变信号为正数 我尝试使用VTST.F32 S0,#1.0,因为当我使用Rn寄存器时,我使用的是浮点,就像我使用TST R0,#1 p.ex一样。 这也是FP的指令,还是我必须使用另一个指令 FP-Fatorial.s(111):错误:A1854E:未知操作码“VTST.F32”,可能是错误的目标CPU 这是重建代码时出现的错误 如何测试数字(浮点…)的奇偶性 您的问题与特定的CPU类型或编程语言无关,

我在做一个代码,我想检查一个数字的奇偶性,当这个数字是奇数时改变信号为负数,当这个数字是偶数时改变信号为正数

我尝试使用VTST.F32 S0,#1.0,因为当我使用Rn寄存器时,我使用的是浮点,就像我使用TST R0,#1 p.ex一样。 这也是FP的指令,还是我必须使用另一个指令

FP-Fatorial.s(111):错误:A1854E:未知操作码“VTST.F32”,可能是错误的目标CPU

这是重建代码时出现的错误

如何测试数字(浮点…)的奇偶性

您的问题与特定的CPU类型或编程语言无关,但它是一个更一般的问题:

正如Peter Cordes和Nate Eldredge在他们的评论中所写的那样,您希望检查一个浮点数是否有只为整数定义的属性

如果浮点值表示某个整数值(如
25.0
),则数字的奇偶校验定义良好。但是如果浮点值是
25.6
,该怎么办

  • 您现在可以说,可以保证浮点数在小数点后不会有任何数字,因此程序不需要能够处理此类情况

  • 但是,您也可以说程序应该舍入到最接近的整数,然后执行以下操作:

    25.6 -> 26.0 -> 26 -> even
    
  • 或者您总是希望向下取整(朝向负无穷大)

  • 或者你总是想接近零
当然,所有这些情况都需要不同的代码

您可以将浮点数转换为整数,然后测试整数中的最低位

但是,简单地将浮点数转换为整数并不总是有效:

您可以在32位浮点变量中存储远大于最大可能64位整数值的数字

我不知道ARM CPU在这种情况下会如何工作;但是,它们可能返回
0x7FFFFFFF
,这是一个奇数,尽管如此大的浮点值只能是2的倍数,因此只能是偶数整数值

因此,您可以做以下几点:

  • 检查浮点值是否在可转换为整数的范围内

  • 如果是,将数字转换为整数并执行测试
  • 如果否,它必须是2的倍数,因此它是偶数
错误:A1854E:未知操作码
'VTST.F32'
,可能是错误的目标CPU

“按位测试”操作是按位操作。按位运算的数学规则仅为整数值(可能是定点)定义

您需要对具有相同重要性的位执行逐位浮点操作,而不是在位模式中的相同位置;这意味着C语言表达式
((float)i)和((float)j)
将产生与
(float)(i&j)
相同的结果

从理论上讲,以这种方式在软件中执行
(和
测试
)、
异或
是可能的(
是不可能的),但我怀疑是否有任何现有的CPU在硬件中对此提供支持

当然,您可以对表示浮点数的位模式执行逐位操作。然而,这不会产生任何有用的结果

我可以进行转换并将结果放入
Rn
结果中吗,我尝试过这样做

->
VCVT.S32.F32 R0,S2

不幸的是,我以前没有使用带有FPU的ARM CPU


然而,据我所知,
VCVT
只能将32位整数值放入浮点寄存器中,您必须使用
VMOV
指令将其复制到
Rn
寄存器中。

请显示您的完整代码。VTST.F32 S2,S11;带1的TST与带1的TST一样,将除最右边的一个VMOV.F32 S3#1.0之外的所有位置零;VPUSH{S0-S1}VMOV.F32 S0、S3 VMRS APSR_nzcv、FPSCR;单数;未设置零标志-表示它是奇数,并返回-1以注册S3 VMOV。F32 S3,S0 VPOP{S0-S1}此外,请参阅指令集参考。这将显示VTST。F32不存在<代码>VTST.32
确实存在,但它不接受浮点常量作为操作数。无论如何,你的逻辑是错误的。您不知道在浮点中测试哪个位。如果您要添加新信息,请使用。如果已知您的浮点值包含一个适合32位的整数,请将其转换并像往常一样检查LSB。否则,要么这个数字太大,所以你丢失了LSB,要么它不是一个整数,所以你不知道它应该是偶数还是奇数。@PeterCordes:“偶数或奇数”是数学()中“奇偶”一词最基本的解释,它在维基百科消歧页面上。虽然我同意,在计算环境中,它可能是模糊的,应该加以澄清。它生成0/-1矢量元素,而不是整数条件代码标志。但是x86有一个基于位和的整数标志。当然,这些测试的是FP位模式,而不是浮点表示的数字。也许你应该更明确地说明你所说的CPU不提供的“操作”是什么。“如果是,将数字转换为整数并执行测试”,我是否可以进行转换并将结果放入Rn结果中,我尝试过,->VCVT.S32.F32 R0,S2,#S32,但我得到了一个错误->FP-Fatorial.s(113):错误:A1696E:预期为32位,64位或128位寄存器表达式。@彼得为了检查数字的奇偶校验,运算需要对具有相同“物理”含义的位执行“逐位”操作。示例:
0x43000000=32.0
0x44000000=512.0