Побочные эффекты сборки x86 оператора правого смещения SHR? - PullRequest
1 голос
/ 18 декабря 2009

Я прослеживаю программу с отладчиком ASM ollydbg и сталкиваюсь с этим фрагментом кода, который представляет собой сегмент цикла:

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

То, что я ожидал увидеть, было после 2-го или 3-го цикла, это то, что ebx всегда будет обнуляться, потому что 0x20 ваши 32-битные смещения уже.

Я немного растерялся, может кто-нибудь пролить свет на это?

Спасибо

1 Ответ

4 голосов
/ 18 декабря 2009

Вот что я прочитал из описания инструкции:

В любом случае число смен более 31 выполняется по модулю 32.

Ответьте на свой вопрос?

...