通常win32下三種不同的呼叫模式,不同版本的編譯器,對彙編出來的程式碼都會代理一些差別。__cdecl是預設的方式,採用外平棧。__stdcall,採用內平棧。__fastcall,因為採用2個暫存器傳參,所以多於2個引數後也會用外平棧的方式。
傳入的第一個引數位置在ebp+8,後面依次加4個位元組,即第n個引數的位置是ebp+8+(n-1)*4=ebp+4n+4。 函式內部的區域性變數用開闢出來的棧幀的位置,無內部變數時會開闢0C0h大的棧幀空間,多一個變數多開闢0Ch。
n個變數會開闢0C0h+0Ch*n=(10h+n)*0Ch大小的空間。第一個區域性變數位置是ebp-8,後面依次減0Ch個位元組,第n個區域性變數 的位置是ebp-8-0Ch*n。 對於引數或區域性變數是浮點數的會用到xmm0和xmm1。
7: test(1, 2, 3, 4, 5, 6, 7, 8, 9);
00261811 push 9
00261813 push 8
00261815 push 7
00261817 push 6
00261819 push 5
0026181B push 4
0026181D push 3
0026181F push 2
00261821 sub esp,8
00261824 movsd xmm0,mmword ptr [__real@3ff0000000000000 (0267BD0h)]
0026182C movsd mmword ptr [esp],xmm0
00261831 call test (02613A2h)
00261836 add esp,28h
![](https://img2024.cnblogs.com/blog/1157565/202405/1157565-20240513233612892-879226468.png) 單精度浮點數怎麼計算、儲存? 單精度浮點數的計算方法可以參考下面這個公式:。其中,表示單精度浮點數,是符號位,佔用1位,正數為0,負數為1。是指數位,佔用8位,是尾數位,佔用23位。 單精度浮點數在儲存時佔用32個二進位制(bit)。具體儲存方式為:最高位為符號位(Sigh),其中0代表正數,1為負數;第63-52位為偏移的指數位(Exponent),用於表示以2為底的指數,表示範圍為(-1023,1024); 剩下的23位為尾數位(Mantissa)。 雙精度浮點數的計算方式與單精度浮點數類似,都是採用科學計數法進行計算,即把一個數表示成的形式,其中是尾數(mantissa),是指數(exponent)。在雙精度浮點數中,佔用64位,佔用11位,其中的正負各佔5位,具體的儲存格式如下: 符號位(Sign):1位,用於表示數字的正負。 指數位(Exponent):11位,用於表示中的。 尾數位(Fraction/Mantissa):52位,表示。