1

我有一个汇编程序要写。我需要检查 AX 寄存器,如果 AX 寄存器大于 0,则在 BX 中移动 +1,如果 AX 寄存器的值小于 0,则在 BX 中移动 -1,否则如果 AX = 0,则在 BX 中移动 0。我有以下代码可以做到这一点,但我正在寻找替代解决方案。请帮忙。谢谢

CMP AX, 0
JG GREATER
JL LESS
MOV BX, 0
GREATER:
MOV BX, 1
LESS:
MOV BX, -1
4

2 回答 2

3

您提供的代码始终返回 -1。尝试这个:

CMP AX, 0
JG GREATER
JL LESS
MOV BX, 0
JMP END
GREATER:
MOV BX, 1
JMP END
LESS:
MOV BX, -1
END:
于 2012-05-01T15:37:55.797 回答
1

试试这个,它只需要一个条件分支并且没有无条件跳转:

    mov     bx, ax      // copy ax to bx
    sarw    bx, 15      // arithmetic shift - any -ve => -1, 0 or +ve => 0
    cmp     ax, 0       // compare original number to zero
    jle     end         // if it's <=, we're done
    mov     bx, 1       // else bx = 1
end:

注意- 我的 x86 代码非常生锈。此外,该版本sar不在 8086 中,而是在 286 及更高版本中,并且直到 80386 才变得特别快。

编辑我想我找到了一个更好的 386+ 版本,没有任何分支:

    mov     bx, ax     // copy ax to bx      
    sarw    bx, 15     // arithmetic shift - any -ve => -1, 0 or +ve => 0
    cmp     ax, 0      // compare original to zero
    setg    bl         // if it was greater, bl = 1 (bh already == 0 from above)
于 2012-05-01T16:04:26.440 回答