2009-12-17 4 views
1

나는 ASM 디버거 올리 디버그와 프로그램을 통해 추적 그리고 난 루프 세그먼트이 코드, 건너 :x86 어셈블리 오른쪽 시프트 연산자 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 

내가 따라 할 수 있고, 다른 사업자가 무엇을 얻을 그것이 의미하는 경우가 있습니다 나는 그것을 추적한다. 그러나 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; 

는하지만 추적 할 때 내가 대신보고하고하면 루프 반복이 홀수 인 경우는 장소에, MSB를 폐기 LSB 및 이동한다는 것입니다. 그것이 그렇다면 ebx는 변하지 않습니다. 각 루프 반복, 같은 ECX 레지스터 변경은 다음과 같습니다

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

이 무엇을보고 기대 한 것은 제 2 또는 제 3 루프 후했다, 당신은 이미 32 비트를 이동 0x20에 있기 때문에 EBX는 항상 밖으로 zero'ed 것이라고했다.

저는 혼란 스럽습니다. 여기에 내가 명령의 설명을 읽고 무엇

감사

답변

4

:

어느 경우는 모듈을 수행하는 더 큰 다음 31의 수를 이동시킨다 (32)

귀하의 질문에 답변 ?

+0

고맙습니다. 저도 그 행동의 차이점을 설명한다고 생각합니다. Mod 32는 SHR 명령어가 0x00과 0x10 사이에서 진동하도록합니다. – greatwolf