x86装配右移操作员SHR的副作用?

时间:2009-12-17 22:06:36

标签: assembly x86 bit-shift

我正在使用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位。

我有点困惑,有人可以对此有所了解吗?

由于

1 个答案:

答案 0 :(得分:4)

以下是我从指令说明中读到的内容:

  

在任何一种情况下,移位数大于31都是以模32执行。

回答你的问题?