C++反汇编->乘法分析


贴一段乘法的VC6.0的源码:

	std::cout<<"Hello World"<<std::endl;//便于定位
	int a,b,c,d,e,f;
	
	a=12;

	b=23;

	c=a*b;

    d=a*64;

    e=b*13;

	f=13*128;
	std::cout<<c<<std::endl;
	std::cout<<d<<std::endl;
	std::cout<<e<<std::endl;
	std::cout<<f<<std::endl;
	system("pause");//也可以看做一个定位字符


DEBUG版乘法运算反汇编分析

/*
0040158D   .  68 24004700   PUSH OFFSET test1.??_C@_0M@FEIK@Hello?5World?$AA@          ;  hello world
00401592   .  68 A0DE4700   PUSH OFFSET test1.std::cout
00401597   .  E8 E9FCFFFF   CALL test1.00401285
0040159C   .  83C4 08       ADD ESP,8
0040159F   .  8BC8          MOV ECX,EAX
004015A1   .  E8 3AFCFFFF   CALL test1.004011E0
004015A6   .  C745 FC 0C000>MOV DWORD PTR SS:[EBP-4],0C                                ;  a赋值为12
004015AD   .  C745 F8 17000>MOV DWORD PTR SS:[EBP-8],17                                ;  b赋值为23
004015B4   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]                               ;  将a值传到EAX中
004015B7   .  0FAF45 F8     IMUL EAX,DWORD PTR SS:[EBP-8]                              ;  将a值传到EAX中,并与b执行乘法运算
004015BB   .  8945 F4       MOV DWORD PTR SS:[EBP-C],EAX                               ;  将EAX传到c中
004015BE   .  8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]                               ;  将a值传到ECX
004015C1   .  C1E1 06       SHL ECX,6                                                  ;  执行乘法操作,64是2的6次方
004015C4   .  894D F0       MOV DWORD PTR SS:[EBP-10],ECX                              ;  将ECX传到d中
004015C7   .  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]                               ;  将b值传到EDX中
004015CA   .  6BD2 0D       IMUL EDX,EDX,0D                                            ;  执行乘法运算  e=b*13
004015CD   .  8955 EC       MOV DWORD PTR SS:[EBP-14],EDX
004015D0   .  C745 E8 80060>MOV DWORD PTR SS:[EBP-18],680                              ;  将12*128所得结果传到 f中
004015D7   .  68 C8104000   PUSH test1.004010C8
004015DC   .  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]
004015DF   .  50            PUSH EAX                                                   ;  输出c
004015E0 > .  B9 A0DE4700   MOV ECX,OFFSET test1.std::cout
004015E5   .  E8 15FBFFFF   CALL test1.004010FF
004015EA   .  8BC8          MOV ECX,EAX
004015EC   .  E8 EFFBFFFF   CALL test1.004011E0
004015F1   .  68 C8104000   PUSH test1.004010C8
004015F6   .  8B4D F0       MOV ECX,DWORD PTR SS:[EBP-10]
004015F9   .  51            PUSH ECX                                                   ;  输出d
004015FA   .  B9 A0DE4700   MOV ECX,OFFSET test1.std::cout
004015FF   .  E8 FBFAFFFF   CALL test1.004010FF
00401604   .  8BC8          MOV ECX,EAX
00401606   .  E8 D5FBFFFF   CALL test1.004011E0
0040160B   .  68 C8104000   PUSH test1.004010C8
00401610   .  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]
00401613   .  52            PUSH EDX                                                   ;  输出e
00401614   .  B9 A0DE4700   MOV ECX,OFFSET test1.std::cout
00401619   .  E8 E1FAFFFF   CALL test1.004010FF
0040161E   .  8BC8          MOV ECX,EAX
00401620 > .  E8 BBFBFFFF   CALL test1.004011E0
00401625   .  68 C8104000   PUSH test1.004010C8
0040162A   .  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]
0040162D   .  50            PUSH EAX                                                   ;  输出f
0040162E   .  B9 A0DE4700   MOV ECX,OFFSET test1.std::cout
00401633   .  E8 C7FAFFFF   CALL test1.004010FF
00401638   .  8BC8          MOV ECX,EAX
0040163A   .  E8 A1FBFFFF   CALL test1.004011E0
0040163F      68            DB 68                                                      ;  pause
00401640 > .  1C004700      DD OFFSET test1.??_C@_05PBCN@pause?$AA@                    ;  ASCII "pause"
00401644   .  E8 A7F30100   CALL test1.system                                          ; \system

*/
小结:

1  对于 为2的次幂的乘法,调用SHL指令
2  非2次幂的乘法 调用IMUL指令


Release版分析分开分析:


C++反汇编->乘法分析,布布扣,bubuko.com

C++反汇编->乘法分析

上一篇:用Python实现排序算法——冒泡排序


下一篇:Linux 线程挂起与唤醒功能 实例