C和汇编混合编程----实现浮点数的加减乘除

加法

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.0
		mov  dword ptr [esp-8],0x4015C28F		;2.34
		fld  dword ptr [esp-4]
		fadd dword ptr [esp-8]
		fst  dword ptr [esp-0ch]
		sub esp,8
		fstp qword ptr [esp]
		mov eax,str
		push eax

		call printf
		add esp,0ch
		}
					return 0;
}

在这里插入图片描述

除法

在C和·汇编混合编程中将fadd 换成fdiv
结果:
在这里插入图片描述
乘法:
将fadd换成fmul
在这里插入图片描述
相减:
将fadd换成fsub
在这里插入图片描述
用eax这样的寄存器试了没成功,如果哪位大佬做出来了发我一份,感谢
在这里插入图片描述

发布了168 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41683305/article/details/104256350