我正在使用ASM调试器ollydbg跟踪程序,我遇到了这个代码片段,这是一个循环段:
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;
但是我在跟踪时看到的是,如果循环迭代是奇数,则丢弃LSB并将MSB移动到它的位置。如果它甚至那么ebx没有变化。每次循环迭代,ecx寄存器改变如下:
**ecx**
0x0000 -- loop 0
0x0010 -- loop 1
0x0020 -- loop 2
..
0x00A0 -- loop 10
我期待看到的是在第二个或第三个循环之后,ebx总是被清零,因为0x20你已经移位了32位。
我有点困惑,有人可以对此有所了解吗?
由于
答案 0 :(得分:4)
以下是我从指令说明中读到的内容:
在任何一种情况下,移位数大于31都是以模32执行。
回答你的问题?