1

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 番目のループの後で、0x20 が既に 32 ビットをシフトしているため、ebx が常にゼロになるということでした。

私はちょっと混乱しています、誰かがこれに光を当てることができますか?

ありがとう

4

1 に答える 1

4

命令の説明から私が読んだものは次のとおりです。

いずれの場合も、31 を超えるシフト カウントは modulo 32 で実行されます。

あなたの質問に答えますか?

于 2009-12-17T22:11:28.443 に答える