我有一个汇编程序要写。我需要检查 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
您提供的代码始终返回 -1。尝试这个:
CMP AX, 0
JG GREATER
JL LESS
MOV BX, 0
JMP END
GREATER:
MOV BX, 1
JMP END
LESS:
MOV BX, -1
END:
试试这个,它只需要一个条件分支并且没有无条件跳转:
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)