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 것이라고했다.
저는 혼란 스럽습니다. 여기에 내가 명령의 설명을 읽고 무엇
감사
고맙습니다. 저도 그 행동의 차이점을 설명한다고 생각합니다. Mod 32는 SHR 명령어가 0x00과 0x10 사이에서 진동하도록합니다. – greatwolf