2012-03-22 57 views

回答

0

它不; scr(带进位移动)。然而,测试可能意味着(并且确实)在shr执行之前测试进位位的设置。

+1

你确定吗?我的书给出了下一个例子: 换班前:AL = 10101110 ; shr AL,1 ; 换班后:01011100,CF = 1 ; 这是错误吗? – 2012-03-22 14:33:40

+1

资料来源:http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate另外,如果确实如此,scr会有什么意义呢? – 2012-03-22 14:55:21

+3

没有'scr'。 'shr'和'shl'移入进位位。资料来源:http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-2b-manual.pdf – ughoavgfhw 2012-03-22 15:08:48

9

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中的位全部向左移动了一个位置,进位标志已设置为移出左端的位。

0

补充一些说明:

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

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

如果AL先前是像0b101(5)那样的奇数值,则它将变为0b10(2)并将1置于标志寄存器中。因此,如果除以2,则进位标志将像余数一样起作用。

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