【问题标题】:Most compact way to test for a negative number in x86 assembly?在 x86 程序集中测试负数的最紧凑方法?
【发布时间】:2013-03-16 19:32:19
【问题描述】:

目前我这样做是为了测试 x86 程序集 (r/m32,imm8) 中的负数:

83F800 CMP EAX, 0

这可以跟JL。这是 3 个字节,据说时钟为“1/2”。我可以使用 TEST EAX 或 CMP EAX,imm32(编码 3D),两者的时钟均为“1”,但占用 5 个字节。一般来说,如果我试图最小化代码大小,我这样做的方式是否正确?再一次,这是为了测试一个数字是否小于零。

【问题讨论】:

  • 微架构的时间安排是什么?
  • 如果你使用JS(“jump if sign”),在很多情况下你可能会跳过CMP。符号标志应该已经被最后一个算术或移动指令正确设置,如果设置了符号标志,则结果是否定的。尽管可能存在一些奇怪的特殊情况,但由于某些不明原因,这将不起作用。
  • @Damon 的动作不会改变标志

标签: assembly x86


【解决方案1】:

add eax, eax 只有两个字节(01 C003 C0),但具有破坏性。 (之后检查是否携带)

test eax, eax 也只有两个字节 (85 C0)。 (之后检查签名)

【讨论】:

  • 好的,所以如果我使用测试,那么 JL 会起作用吗?根据我的书,如果 SFOF,JL 就会去,并且既然测试清除了 OF,那么我应该没问题。
  • @TylerDurden 是的,但只是偶然,可以这么说,因为它清除了 OF,正如你所说。还不如使用JS 并使其显而易见,对吗?
  • 我正在使用一个mini-assembler,目前没有JS。
  • 好吧,那么JL,没关系
  • "test eax, eax" 是我的首选答案,因为它是非破坏性的,而且很明显它会根据寄存器符号位设置 CC 符号位。
【解决方案2】:

你可以使用:

or      eax, eax

它是一个字节短(只有两个字节的操作码)指令!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多