首页
社区
课程
招聘
[求助]求余问题
发表于: 2011-3-14 15:16 4733

[求助]求余问题

2011-3-14 15:16
4733
有空的朋友帮忙看一下,对一个求余的反汇编代码不是很理解。
C代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a, b, c;
    scanf("%d %d", &a, &b);
    c = a;
    c += b;
    c %= 10;
    printf("Hello World %d\n", c);
 
    return 0;
}

用VS2008编译一下,把Release下的程序用OD反汇编了一下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
00401000  /$  83EC 08       SUB ESP,8
00401003  |.  8D0424        LEA EAX,DWORD PTR SS:[ESP]
00401006  |.  50            PUSH EAX
00401007  |.  8D4C24 08     LEA ECX,DWORD PTR SS:[ESP+8]
0040100B  |.  51            PUSH ECX
0040100C  |.  68 F4204000   PUSH cppppppp.004020F4                   ; /%d %d
00401011  |.  FF15 A4204000 CALL DWORD PTR DS:[<&MSVCR90.scanf>]     ; \scanf
00401017  |.  8B5424 0C     MOV EDX,DWORD PTR SS:[ESP+C]
0040101B  |.  8B4424 10     MOV EAX,DWORD PTR SS:[ESP+10]
0040101F  |.  8D0C10        LEA ECX,DWORD PTR DS:[EAX+EDX]
00401022  |.  B8 67666666   MOV EAX,66666667
00401027  |.  F7E9          IMUL ECX
00401029  |.  C1FA 02       SAR EDX,2
0040102C  |.  8BC2          MOV EAX,EDX
0040102E  |.  C1E8 1F       SHR EAX,1F
00401031  |.  03C2          ADD EAX,EDX
00401033  |.  8D1480        LEA EDX,DWORD PTR DS:[EAX+EAX*4]
00401036  |.  03D2          ADD EDX,EDX
00401038  |.  2BCA          SUB ECX,EDX
0040103A  |.  51            PUSH ECX                                 ; /<%d>
0040103B  |.  68 FC204000   PUSH cppppppp.004020FC                   ; |hello world %d\n
00401040  |.  FF15 9C204000 CALL DWORD PTR DS:[<&MSVCR90.printf>]    ; \printf
00401046  |.  33C0          XOR EAX,EAX
00401048  |.  83C4 1C       ADD ESP,1C
0040104B  \.  C3            RETN

怎么一个求余还要这么复杂,看不太懂,哪位朋友帮忙给小弟解释一下,感激不尽。

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费
支持
分享
最新回复 (5)
雪    币: 165
活跃值: (56)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
MS和编译器有关系吧,看看VC6编译的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
; int __cdecl main(int argc,const char **argv,const char *envp)
_main proc near
 
var_8= dword ptr -8
var_4= dword ptr -4
argc= dword ptr  4
argv= dword ptr  8
envp= dword ptr  0Ch
 
sub     esp, 8
lea     eax, [esp+8+var_8]
lea     ecx, [esp+8+var_4]
push    eax
push    ecx
push    offset s_DD     ; "%d %d"
call    _scanf
mov     edx, [esp+14h+var_8]
mov     eax, [esp+14h+var_4]
add     eax, edx
mov     ecx, 0Ah
cdq
idiv    ecx
push    edx
push    offset s_HelloWorldD ; "Hello World %d\n"
call    sub_403B5F
xor     eax, eax
add     esp, 1Ch
retn
_main endp
2011-3-14 16:46
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
3
谢谢 我再研究一下
2011-3-15 21:54
0
雪    币: 201
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
00401022  |.  B8 67666666   MOV EAX, 67666666   
00401027  |.  F7E9          IMUL ECX
00401029  |.  C1FA 02       SAR EDX,2
0040102C  |.  8BC2          MOV EAX,EDX
0040102E  |.  C1E8 1F       SHR EAX,1F
00401031  |.  03C2          ADD EAX,EDX
a%b = a-a/b*b

其中是有关除法指令优化的过程是a/b = a*(1/b) = (a*(2^(n+1))/b)>>n+1 在这里n=32(位) eax=a  67666666=2^(n+1))/b 这是编译器优化后得出的魔数 负数的话还要加1
2011-4-7 00:53
0
雪    币: 458
活跃值: (426)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
5
2011-4-7 09:40
0
雪    币: 270
活跃值: (97)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=blueapplez;945016]http://bbs.pediy.com/showthread.php?t=131956
希望对你有帮助[/QUOTE]

非常感谢你的帮助
2011-4-7 12:02
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册