首页
社区
课程
招聘
下面的语句是做什么用的?除法不像除法!
发表于: 2013-4-27 07:01 5003

下面的语句是做什么用的?除法不像除法!

2013-4-27 07:01
5003
00401139  |.  B8 5917B7D1   MOV EAX,D1B71759
0040113E  |.  C1C1 0F       ROL ECX,0F
00401141  |.  F7E1          MUL ECX
00401143  |.  C1EA 0D       SHR EDX,0D
00401146  |.  69D2 10270000 IMUL EDX,EDX,2710
0040114C  |.  2BCA          SUB ECX,EDX

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 373
活跃值: (496)
能力值: ( 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
2013-4-27 09:11
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上的 如果上面asm语句的用c语言怎么写?SHR EDX,0D  这句不知道怎么写.
不过上面的语句与除法好像 有魔数 有sar指令。
2013-4-27 09:19
0
雪    币: 1392
活跃值: (4867)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
edx=EDX>>0XD

或者
_asm
{
      shr edx,0xd
}
2013-4-27 09:24
0
雪    币: 102
活跃值: (10)
能力值: ( 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;
2013-4-27 09:28
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
SHR表明了无符号数, 这是个混合运算, 并且使用乘法优化除法,如果以上代码为全部,整个计算过程应该是无符号数
类似如下表达式:
(_ecx ROL 15) - ((_ecx ROL 15) / 1111) * 10000;
2013-4-27 09:36
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼上的 似乎不正确 结果差的很远
您把
00401139  |.  B8 5917B7D1   MOV EAX,D1B71759
00401141  |.  F7E1          MUL ECX
00401143  |.  C1EA 0D       SHR EDX,0D

这三条指令 看成一个除法指令 应该有问题吧?
2013-4-27 09:55
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
8
抱谦少数了一位, 看看这个:
(_ecx ROL 15) - ((_ecx ROL 15) / 10000) * 10000;
2013-4-27 10:05
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
更晕了啊 您上面的数 不就等于0啊?
我试试看
还是不对,您上面先除10000再乘以100000 ,是打错了吗?
2013-4-27 10:15
0
雪    币: 196
活跃值: (135)
能力值: ( 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
2013-4-27 10:46
0
雪    币: 102
活跃值: (10)
能力值: ( 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
2013-4-27 11:10
0
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
12
1: _ecx 用无符号数.
2: 对于/10000会有不同优化
3: _ecx不是浮点型,所以_ecx - (_ecx / 10000) * 10000;并不一定等于0, 所以这个过程可以看成%
2013-4-27 11:37
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
谢谢 请问您是怎么看出是除以10000的呢?
2013-4-27 11:53
0
雪    币: 211
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
16进制2710
2013-4-27 13:30
0
游客
登录 | 注册 方可回帖
返回
//