在x86程序集中使用符号位

时间:2013-12-10 12:22:34

标签: assembly x86

我正在阅读“了解Linux内核”一书,我遇到了这段代码:

cmpl  $1,(%eax)
js    SomeLabel

我对Sign Flag的使用感到困惑。设置时和未设置时。 如果eax包含值1并执行上面的代码,那么符号位的值是什么?

3 个答案:

答案 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,则会跳转。