将AX寄存器与零进行比较

时间:2012-05-01 15:35:47

标签: x86-16 assembly

我有一个汇编程序要写。我需要检查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

2 个答案:

答案 0 :(得分: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:

答案 1 :(得分: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:

NB - 我的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)