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