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