我正在阅读“了解Linux内核”一书,我遇到了这段代码:
cmpl $1,(%eax)
js SomeLabel
我对Sign Flag的使用感到困惑。设置时和未设置时。
如果eax
包含值1
并执行上面的代码,那么符号位的值是什么?
答案 0 :(得分:0)
JS
中的SIGN
位为1,则 EFLAGS
会跳转。
根据英特尔手册:
符号标志 - 设置等于结果的最高有效位,即有符号整数的符号位。 (0表示正值,1表示负值。)
因此,回答您的问题,如果cmpl $1, (%eax)
为否定,eax - 1
会设置符号位。 IE:如果EAX为0或更低(但不是INT_MIN
,因为它会下溢)。
如果eax包含1,则1 - 1为0,因此SIGN BIT将为0。
答案 1 :(得分:0)
x86(以及许多其他架构)中的比较只是一个仅影响标志的减法。
减法/比较后的符号标志只是结果的符号位(在比较后它本身不会出现)。
在这种情况下,它从eax
中包含的内存地址的值中减去1(括号表示间接),如果这导致负值,则将设置符号标志。
换句话说,如果eax
的值为0或更小但不是0x80000000,它将跳转。
答案 2 :(得分:0)
并非所有指令都会影响符号位。在许多地方在线的x86处理器文档中描述了哪些影响该位。有关符号位(标志)的一些详细信息,请参见:http://en.wikipedia.org/wiki/Sign_flag。
在示例的情况下,cmpl
会影响符号位。它将比较操作数(从第二个内部减去第一个参数),并根据比较结果,如果比较为负,则将符号位设置为1
,否则设置为0
。
如果设置了符号位(js
),1
表示跳转。所以在例子的情况下:
cmpl $1,(%eax)
js SomeLabel
处理器内部将采用%eax
中地址存储的值,从中减去1
,如果结果为负,则设置符号位(即,地址%eax
的值小于1
)。如果符号位置位,js
将跳转,如果符号位清零则不会跳转。换句话说,如果%eax
中地址的值小于1
,则会跳转。