加法
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;
}
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyADO3ITN0EjMxEjMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
除法
在C和·彙編混合程式設計中将fadd 換成fdiv
結果:
乘法:
将fadd換成fmul
相減:
将fadd換成fsub
用eax這樣的寄存器試了沒成功,如果哪位大佬做出來了發我一份,感謝