如何检查有符号整数是否为负或位?

Yon*_*onk 10 x86 assembly

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

这是我做的:

bt eax,0
jnc isNegative
Run Code Online (Sandbox Code Playgroud)

bt第一位携带标志,我用来jnc检查进位标志是0还是1.如果是1,它应该是负数,并做负指令...但是,输出是不可预测的,有时我有一个积极的,它认为它是一个负数.难道我做错了什么?

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

rus*_*lik 17

如果设置了MSB,则该值为负.它可以检查

test eax, 0x80000000
jne is_signed
Run Code Online (Sandbox Code Playgroud)

或者,更简单:

test eax, eax
js signed
Run Code Online (Sandbox Code Playgroud)

或者为字节情况:

test al, al
js is_signed
; or
test eax, 80h
jne is_signed
Run Code Online (Sandbox Code Playgroud)


nmi*_*els 5

您可以使用jgecmp说明:

cmp eax, 0
jl isNegative
Run Code Online (Sandbox Code Playgroud)

  • cmp 比 test 长,因此通常首选 test http://stackoverflow.com/a/147183/995714 (2认同)