衝擊年薪50w,助你高階python工程師》
1、在win32下,有cdecl/stdcall/fastcall等多種呼叫方式。在win64下,已經統一了。
2、win64下,函式呼叫時,前四個引數總是通過暫存器傳遞,剩餘的壓入堆疊。前四個引數雖然不壓入堆疊,但仍然會在堆疊上保留空間,叫shadow space。(linux下前6個由暫存器儲存,用rsi,rdi,rcx,rdx,r8,r9,好像也沒有shadow space)
3、前四個存入暫存器的引數,按照整數還是浮點數,有所不同,整數用rcx,rdx,r8,r9,浮點數用xmm0,xmm1,xmm2,xmm3。當引數既有整數又有浮點時,按位置,如第二個引數,如果是整型,就放入rdx,如果是浮點就放入xmm1。(對比:linux x64下用rdi, rsi, rdx, rcx, r8, r9 and xmm0-xmm7 傳送引數,前6個引數存入暫存器,當引數既有整數又有浮點時,第乙個出現的整數放入rdi,無論它出現的位置在哪,即使前面已經有5個浮點數了。)
4、win64函式分為內部會呼叫其它函式的幀函式和內部不呼叫其它函式的頁函式。頁函式可以沒有幀指標(frame pointer)。幀函式分為靜態分配棧空間與動態分配棧空間兩種,對於前一種由於棧指標是固定的,可以沒有幀指標,對於後一種,則有幀指標。
5、棧回溯在棧上找函式返回位址,確定父函式時,可能是需要借助pdb中的除錯資訊。
關於win32與win64的相容性問題
源 作業系統作業 printf nmemory attached at x n int shm shm是個char 位址 gcc編譯出現警告 lcy lcy lenovo r720 15ikbn gcc o shmread shmread.c shmread.c in function main s...
函式的呼叫方式分析
閒來無事,研究了一下vc中的三種函式呼叫方式 cdcel stdcall fastcall 現將結 布如下 1 cdcel呼叫方式,呼叫之前的引數壓棧是由呼叫函式完成,函式呼叫結束之後,由呼叫函式彈出堆疊中的引數。但是cdcel的esp指標確是需要由呼叫函式來完成恢復的。2 stdcall 呼叫之前...
Win32下的彙編呼叫C標準庫函式
在win32環境下彙編,自然難免或必然要用到c標準函式,以下是彙編呼叫c標準函式的方法。c標準函式包含在msvcrt.lib檔案中,此檔案在vc中可以找到。把它複製到彙編的庫目錄下,然後包含進去。然後還需宣告你將要時用到的函式的原型,用如下語句 c printf dword 第一句宣告了printf...