2009-12-17 10 views
1

Je suivi par un programme avec un débogueur ASM ollydbg et je viens dans cet extrait de code, qui est un segment de boucle:Les effets secondaires de l'opérateur x86 droit-shift 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 

Je peux suivre et obtenir ce que les autres opérateurs font et il est logique quand Je trace à travers. Mais le SHR EBX, CL n'a pas de sens pour moi.

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

Mais ce que je vois au lieu lorsque le traçage est que si l'itération de la boucle est impair, défaussez la Pf et déplacer le MSB dans sa place. Si c'est encore, ebx est inchangé. Chaque itération de la boucle, les changements de registre de CEx comme suit:

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

Ce que je me attendais à voir était après la 2e ou 3e boucle, était que EBX serait toujours zero'ed parce 0x20 votre décalage déjà 32 bits.

Je suis un peu confus, quelqu'un peut-il nous éclairer là-dessus?

Merci

Répondre

4

Voici ce que je lis de la description de l'instruction:

Dans les deux cas, les changements compte de plus alors 31 sont effectués modulo 32.

répondre à votre question ?

+0

Merci, je pense que cela explique la différence de comportement que je vois. Le Mod 32 fera osciller l'instruction SHR entre un décalage de 0x00 et 0x10. – greatwolf