【问题标题】:How to check if a signed integer is neg or pos?如何检查有符号整数是负数还是正数?
【发布时间】:2011-04-30 08:47:50
【问题描述】:

我是 x86 汇编语言的新手,我有一个有符号整数保存在寄存器 eax 中,我想检查该数字是负数还是正数。为此,我使用bt 指令检查第一位。

这是我所做的:

bt eax,0
jnc isNegative

bt 携带第一个位来携带标志,我使用jnc 来检查携带标志是 0 还是 1。 如果是 1,它应该是一个负数,并且做负指令...... 但是,输出是不可预测的,有时我有一个正数,它会将其识别为负数。我做错了吗?

编辑:我刚刚意识到它可能与字节序有关。它实际上是检查最后一位而不是第一位。让我试试bt, 7

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    如果设置了 MSB,则值为负。可以用

    检查
    test eax, 0x80000000
    jne is_signed
    

    或者,更简单:

    test eax, eax
    js signed
    

    或字节大小写:

    test al, al
    js is_signed
    ; or
    test eax, 80h
    jne is_signed
    

    【讨论】:

      【解决方案2】:

      您可以使用jgecmp 指令:

      cmp eax, 0
      jl isNegative
      

      【讨论】:

      • 太好了,解决了问题,简单!虽然,它应该是 cmp eax,0
      • 取决于您使用的汇编程序,但对于英特尔,是的。我想这就是反对票的来源。
      • cmp 比 test 长,所以通常首选 test stackoverflow.com/a/147183/995714
      【解决方案3】:

      您当前的解决方案检查数字是偶数还是奇数,而是测试第 31 位:

      bt eax, 31
      jc number_is_negative
      

      或者你可以将数字与零进行比较,并测试它是否大于或等于它。

      main:
          ...
          cmp eax, 0 ; Compare the number to zero
          jge .number_is_positive ; If it's positive jump to .number_is_positive
          ; And only arrive here if a number is negative
          ...
      .number_is_positive:
          ; Yay! number is positive
          ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-26
        • 2023-03-18
        • 2022-01-10
        相关资源
        最近更新 更多