2009-12-17 42 views
1

我通過與ASM調試器OllyDbg的程序跟蹤和我碰到過這樣的代碼段,這是一個環區段:x86集合右移運算符SHR的副作用?

CPU Disasm 
Address Hex dump   Command         Comments 
007D05EC |. 33C9   XOR ECX,ECX 
007D05EE |. 8BFF   MOV EDI,EDI 
007D05F0 |> 8B54B4 10  /MOV EDX,DWORD PTR SS:[ESI*4+ESP+10] 
007D05F4 |. 8BFA   |MOV EDI,EDX 
007D05F6 |. 0FAFFE  |IMUL EDI,ESI 
007D05F9 |. 8BDA   |MOV EBX,EDX 
007D05FB |. D3EB   |SHR EBX,CL 
007D05FD |. 03F8   |ADD EDI,EAX 
007D05FF |. 83C1 10  |ADD ECX,10 
007D0602 |. 83C6 01  |ADD ESI,1 
007D0605 |. 03DF   |ADD EBX,EDI 
007D0607 |. 33DA   |XOR EBX,EDX 
007D0609 |. 81F9 B0000000 |CMP ECX,0B0 
007D060F |. 8BC3   |MOV EAX,EBX 
007D0611 |.^ 7C DD   \JL SHORT 007D05F0 

我可以遵循,並得到什麼其他運營商做的,這是有道理的,當我追蹤它。但SHR EBX,CL對我沒有意義。

//Shouldn't in asm 
SHR EBX, CL 
//be the same as doing this in c/c++? 
//that's how it read when I checked the asm reference anyway 
ebx >>= CL; 

但我所看到的,而不是跟蹤時,如果循環迭代是奇數,則丟棄LSB倒騰MSB到它的位置。如果甚至ebx不變。每次循環,ECX寄存器變化如下:

**ecx** 
0x0000 -- loop 0 
0x0010 -- loop 1 
0x0020 -- loop 2 
.. 
0x00A0 -- loop 10 

我期待看到是第二或第三循環之後,是EBX將總是zero'ed,因爲0x20的你已經轉向32位。

我有點困惑,有人可以對此有所瞭解嗎?

感謝

回答

4

這就是我從指令的說明寫着:

在這兩種情況下,轉移大於31的計數進行模數爲32

回答你的問題?

+0

謝謝,我認爲這解釋了我所看到的行爲差異。 Mod 32將使SHR指令在0x00和0x10的移位之間振盪。 – greatwolf 2009-12-17 22:25:54