键入安全和NEG指令

时间:2015-06-12 11:54:39

标签: c++ binary opcode

我需要移植此汇编指令:

[42] pry(main)> class Parent
[42] pry(main)*   @@foo = "Parent"
[42] pry(main)*  end

[43] pry(main)>  class Thing1 < Parent
[43] pry(main)*    @@foo = "Thing1"
[43] pry(main)*  end

[44] pry(main)>  class Thing2 < Parent
[44] pry(main)*    @@foo = "Thing2"
[44] pry(main)*  end

[45] pry(main)> Thing1.class_eval("@@foo")
=> "Thing2"
[46] pry(main)> Parent.class_eval("@@foo")
=> "Thing2"
[47] pry(main)> Class.class_eval("@@foo")
=> "Thing2"

所以我做了以下事情:

NEG eax

因为uint32_t a = 0x1234568; a = reinterpret_cast<uint32_t>(-a); 符合我的要求,这意味着直接解释字节而不需要任何类型的转换/转换。

  • 为此我需要reinterpret_cast吗?
  • 这是否违反严格别名?
  • 如果我做错了,实施它的最佳方法是什么?

我问这个问题是因为虽然代码显然在gcc下运行,但它在Visual Studio(reinterpret_castcannot convert from uint32_t to uint32_t)下无法运行。错误是有道理的,但我不知道如何以不同的方式做到这一点,除了使用比特黑客计算2的补充。

2 个答案:

答案 0 :(得分:3)

  • 您在这里不需要reinterpret_caststatic_cast就足够了。
  • 您的代码不能使用指针,因此没有别名问题。
  • 结论:这种方法没有错。

顺便说一句:你的代码真的编译成了&#34; neg&#34;指令,至少在英特尔平台上。 ; - )

更新

C ++语言规范说:

一元运算符的操作数应具有算术或枚举类型,结果是其操作数的否定。对整数或枚举操作数执行整体提升。通过从2 n 中减去其值来计算无符号量的负数,其中 n 是提升的操作数中的位数。结果的类型是提升的操作数的类型。

由于无符号类型被提升为自己,因此一元减号可以应用于无符号类型,并且不会更改它们。

所以写它是正确的,例如:

uint32_t convert( uint32_t x ) {
    return -x;
}

可以在那里使用static_cast,但不需要它。 reinterpret_cast不能用于转换整数。

答案 1 :(得分:0)

我会使用a = 0 - a;。或者你可以a = -a;,但它可能会给出编译警告。警告不是错误,但应该避免。

您也可以尝试内联汇编。

mov eax, a
neg eax
mov a, eax