加法
C程序:
#include "stdio.h"int main()
{float a=1.0;float b=2.34;float c;c=a+b;printf("c=%f",c);return 0;
}
反汇编之后,实现加法的关键程序
5: float a=1.0;
00401028 C7 45 FC 00 00 80 3F mov dword ptr [ebp-4],3F800000h
6: float b=2.34;
0040102F C7 45 F8 8F C2 15 40 mov dword ptr [ebp-8],4015C28Fh
7:
8: float c;
9: c=a+b;
00401036 D9 45 FC fld dword ptr [ebp-4]
00401039 D8 45 F8 fadd dword ptr [ebp-8]
0040103C D9 55 F4 fst dword ptr [ebp-0Ch]
14: printf("c=%f\n",c);
00401046 83 EC 08 sub esp,8
00401049 DD 1C 24 fstp qword ptr [esp]
0040104C 68 1C 60 42 00 push offset string "c=%f" (0042601c)
00401051 E8 2A 00 00 00 call printf (00401080)
00401056 83 C4 0C add esp,0Ch
- 我们定义的浮点数1.0转成了3F800000h,转化过程是什么呢?这是个IEEE 754定义的标准,网上有很多现成帮我们转,其实我们可以不必理解这些东西,毕竟人生苦短,学的东西还很多,能直接用就可以了。(http://www.styb.cn/cms/ieee_754.php#)到这里可以直接转
- fld:将浮点数压入到ST(0)出
- fadd:将浮点数和ST(0)出的浮点数相加,结果保存到ST(0)中
- fstp:将ST(0)出数据出栈,影响FPU栈内数据,TOP会减一,将数据保存到dword ptr [ebp-0Ch]中
- fst:将ST(0)取出,不影响FPU栈内数据
改成混合编程为:
#include "stdio.h"int main()
{char * str="c=%f\n";__asm{mov dword ptr [esp-4],0x3F800000 ;1.0mov dword ptr [esp-8],0x4015C28F ;2.34fld dword ptr [esp-4]fadd dword ptr [esp-8]fst dword ptr [esp-0ch]sub esp,8fstp qword ptr [esp]mov eax,strpush eaxcall printfadd esp,0ch}return 0;
}
除法
在C和·汇编混合编程中将fadd 换成fdiv
结果:
乘法:
将fadd换成fmul
相减:
将fadd换成fsub
用eax这样的寄存器试了没成功,如果哪位大佬做出来了发我一份,感谢