天天看點

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和彙編混合程式設計----實作浮點數的加減乘除

除法

在C和·彙編混合程式設計中将fadd 換成fdiv

結果:

C和彙編混合程式設計----實作浮點數的加減乘除

乘法:

将fadd換成fmul

C和彙編混合程式設計----實作浮點數的加減乘除

相減:

将fadd換成fsub

C和彙編混合程式設計----實作浮點數的加減乘除

用eax這樣的寄存器試了沒成功,如果哪位大佬做出來了發我一份,感謝

C和彙編混合程式設計----實作浮點數的加減乘除