Frage

Ich verfolge ein Programm mit einem ASM -Debugger Ollydbg und stoße auf diesen Code -Snippet, das ein Schleifensegment ist:

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

Ich kann folgen und bekommen, was die anderen Operatoren tun, und es macht Sinn, wenn ich es durchnehme. Aber der SHR EBX, CL macht für mich keinen Sinn.

//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;

Aber ich sehe stattdessen bei der Verfolgung, dass, wenn die Schleifen -Iteration seltsam ist, den LSB wegwerfen und den MSB in ihren Ort verschieben. Wenn es sogar ist, ist EBX unverändert. Jede Schleifen -Iteration, das ECX -Register, ändert sich wie folgt:

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

Was ich erwartet hatte zu sehen, war nach der 2. oder 3. Schleife, dass EBX immer null war, weil 0x20 bereits 32 Bit verändert.

Ich bin irgendwie verwirrt, kann jemand etwas Licht darauf werfen?

Vielen Dank

War es hilfreich?

Lösung

Hier ist, was ich aus der Beschreibung der Anweisung gelesen habe:

In beiden Fällen werden Verschiebungszahlen von größeren als 31 Modulo 32 durchgeführt.

Beantworte deine Frage?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top