2012-03-22 55 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'。