汇编 - shr指令打开进位标志?

时间:2012-03-22 14:13:21

标签: assembly x86

我看到了下一个代码:

shr AL, 1
   jnc bit_0

由于shr instrucrion,我不明白进位标志何时开启?

由于

2 个答案:

答案 0 :(得分:10)

shr AL, 1AL中的所有位移到一个位置。

原始最右边的位从AL寄存器移出到进位标志(并且新的最左边的位设置为0)。例如:

 +------------------------+               +------------------------+
 | 1  0  0  1  0  1  0  1 |               | 0  1  1  0  0  1  0  0 |
 +------------------------+               +------------------------+
    \  \  \  \  \  \  \  \       or          \  \  \  \  \  \  \  \
     \  \  \  \  \  \  \  \                   \  \  \  \  \  \  \  \
 +------------------------+ CF            +------------------------+ CF
 |(0) 1  0  0  1  0  1  0 | 1             |(0) 0  1  1  0  0  1  0 | 0
 +------------------------+               +------------------------+

在你对另一个答案的评论中:

  

我的书给出了下一个例子:轮班前:AL = 10101110; shr AL,1;班次后:01011100,CF = 1;这是错误吗?

如果这就是它所说的,那么是的。这是左移(shl AL, 1),而不是右移:AL中的位全部向左移动了一个位置,并且进位标志已设置为移出的位左手边。

答案 1 :(得分:0)

添加一些说明:

shr AL,1;它将(SH)ift(R)ight(1)x包含在AL寄存器中的值,即AX寄存器的低8位。因此,它将AL中包含的值除以2。

如果AL之前甚至像0b100(4)那么它将变为0b10(2)并在进位标志中输入0。 进位标志位于标志寄存器https://en.wikipedia.org/wiki/FLAGS_register

中的位0

如果AL之前是奇数值,如0b101(5),那么它将变为0b10(2)并将1放入标志寄存器。因此,如果除以2,则进位标志将表示为余数。

jnc bit_0;它将(J)ump标记' bit_0'如果设置了(N)o(C)arry标志,即如果该值在转换之前是偶数(如上例中的0b100)。