能力值:
( LV7,RANK:110 )
2 楼
00401139 |. B8 5917B7D1 MOV EAX,D1B71759
0040113E |. C1C1 0F ROL ECX,0F ;ECX 左移0xF位
00401141 |. F7E1 MUL ECX ;ECX * EAX 高位32位放到 EDX,低32位放到EAX
00401143 |. C1EA 0D SHR EDX,0D ;EDX 右移0xD位
00401146 |. 69D2 10270000 IMUL EDX,EDX,2710 ; EDX = EDX * 2710
0040114C |. 2BCA SUB ECX,EDX
能力值:
( LV2,RANK:10 )
3 楼
楼上的 如果上面asm语句的用c语言怎么写?SHR EDX,0D 这句不知道怎么写.
不过上面的语句与除法好像 有魔数 有sar指令。
能力值:
( LV13,RANK:240 )
4 楼
edx=EDX>>0XD
或者
_asm
{
shr edx,0xd
}
能力值:
( LV2,RANK:10 )
5 楼
楼上,似乎不是这么简单
我这样写不行的,你能看出我的问题在哪里吗?
直接在tt=_eax*c; 后面 用asm mov c,edx取edx的值,与 _asm MUL c;后取得的edx值不同,不知道为什么.
long tt=0;
int _eax=0xD1B71759;
tt=_eax*c;
int _edx=tt>>0x20;
_edx=_edx>>0xd; _asm MOV EAX,0xD1B71759;
_asm MUL c;
_asm SHR edx,0xd;
能力值:
( LV10,RANK:170 )
6 楼
SHR表明了无符号数, 这是个混合运算, 并且使用乘法优化除法,如果以上代码为全部,整个计算过程应该是无符号数
类似如下表达式:
(_ecx ROL 15) - ((_ecx ROL 15) / 1111) * 10000;
能力值:
( LV2,RANK:10 )
7 楼
楼上的 似乎不正确 结果差的很远
您把
00401139 |. B8 5917B7D1 MOV EAX,D1B71759
00401141 |. F7E1 MUL ECX
00401143 |. C1EA 0D SHR EDX,0D
这三条指令 看成一个除法指令 应该有问题吧?
能力值:
( LV10,RANK:170 )
8 楼
抱谦少数了一位, 看看这个:
(_ecx ROL 15) - ((_ecx ROL 15) / 10000) * 10000;
能力值:
( LV2,RANK:10 )
9 楼
更晕了啊 您上面的数 不就等于0啊?
我试试看
还是不对,您上面先除10000再乘以100000 ,是打错了吗?
能力值:
( LV10,RANK:170 )
10 楼
用VS2008生成的测试代码如下:
volatile unsigned int k = _ecx - (_ecx / 10000) * 10000;
004282E6 mov ecx,dword ptr [esp+4]
004282EA mov eax,0D1B71759h
004282EF mul eax,ecx
004282F1 mov eax,dword ptr [esp+4]
004282F5 shr edx,0Dh
004282F8 imul edx,edx,2710h
004282FE sub eax,edx
能力值:
( LV2,RANK:10 )
11 楼
int main(void)
{
int _ecx=0;
scanf("%d",&_ecx);
int k = _ecx - (_ecx / 10000) * 10000;
printf("%d",k);
}
vs2010生成的代码如下,与你的不同啊??????
00C51004 lea eax,[_ecx]
00C51007 push eax
00C51008 push offset string "%d" (0C520F4h)
00C5100D mov dword ptr [_ecx],0
00C51014 call dword ptr [__imp__scanf (0C520A4h)]
00C5101A mov ecx,dword ptr [_ecx]
00C5101D mov eax,68DB8BADh
00C51022 imul ecx
00C51024 sar edx,0Ch
00C51027 mov eax,edx
00C51029 shr eax,1Fh
00C5102C add eax,edx
00C5102E imul eax,eax,2710h
00C51034 sub ecx,eax
能力值:
( LV10,RANK:170 )
12 楼
1: _ecx 用无符号数.
2: 对于/10000会有不同优化
3: _ecx不是浮点型,所以_ecx - (_ecx / 10000) * 10000;并不一定等于0, 所以这个过程可以看成%
能力值:
( LV2,RANK:10 )
13 楼
谢谢 请问您是怎么看出是除以10000的呢?
能力值:
( LV2,RANK:10 )
14 楼
16进制2710