首頁
社區(qū)
課程
招聘
匯編語言64位調(diào)用規(guī)范。什么是32字節(jié)的影子空間什么作用

x64調(diào)用規(guī)范
第3行
調(diào)用者的責(zé)任,還包括在運(yùn)行時(shí)堆棧分配至少32字節(jié)的影子空間,這樣被調(diào)用的過程就可以選擇將計(jì)算器參數(shù)保存在這個(gè)區(qū)域中。
問題這里的影子空間32字節(jié),我咋沒看出來是啥意思以及它們的作用。 %20%20%20

收藏
2條回答
加油吧 2021-7-26

我自己答吧 終于明白了、、預(yù)留32字節(jié)的影子空間 其實(shí)是在調(diào)用系統(tǒng)外部鏈接庫和 和 其他外部庫時(shí) 用的 而一般自定義的調(diào)用過程 不用如此。因?yàn)?在自定義的過程里其實(shí)是沒必要的 因?yàn)?可以在過程里直接 PUSH XXX然后結(jié)束時(shí)在POPXXX 堆棧就復(fù)原了(在過程運(yùn)行完時(shí)一般必須如此)例如
we proc
push rax
push rbx
.... ....
pop rbx
pop rax
ret
we endp

 

而調(diào)用外部鏈接庫過程時(shí)。因?yàn)闊o法改動(dòng)外部庫的過程中的內(nèi)容。所以在調(diào)用庫過程之前無法保證PUSH 使用之后調(diào)用外部庫過程返回后 PUSH指令的 堆棧順序還能對上之前的 PUSH和POP成對使用。 因?yàn)闊o法保證在外部過程中PUSH和POP的成對使用。。而臨時(shí)保存寄存器內(nèi)容在不適用全局變量的情況下 對RSP指針的所在堆棧內(nèi)存地址進(jìn)行手動(dòng)地址下移 預(yù)留出空間 然后使用 直接尋址方式 來訪問預(yù)留的堆棧空間是最好的且不出意外的方式而且 調(diào)用外部過程是有規(guī)范的。。(只使用4個(gè)寄存器往外部庫過程傳遞參數(shù)更多的使用堆棧而堆棧等下可以手動(dòng)恢復(fù)指針地址廢掉數(shù)據(jù)還原RSP地址到之前的正確位置)所以只需要使用4個(gè)64位寄存器 4乘以8字節(jié)等于32字節(jié)。。所以預(yù)留32字節(jié)的影子空間使用直接尋址方式訪問 在恢復(fù) 4個(gè)傳遞參數(shù)的寄存器之后 就可以手動(dòng) 使用命令 ADD rsp ,xxx 之類的命令 恢復(fù)堆棧RSP指針 使其復(fù)原

回復(fù)
加油吧 2021-7-26 2021-7-26編輯

其實(shí)就是主調(diào)程序 為被調(diào)用程序預(yù)留的 4個(gè) 64位存儲(chǔ)空間 可通過_直接尋址方式**_訪問。。這是WINDOWSAPI 64 的規(guī)范。具體用不用如何使用是 WINDOWS API 的事情(外部調(diào)用過程 無法自己修改)一般來說是用來暫存 傳遞參數(shù)的寄存器的值得 騰出來寄存器 以便 外部庫過程使用。且外部庫過程使用堆棧結(jié)束后需清除所有參數(shù)使用的堆棧空間和影子空間 需把堆棧指針復(fù)原到RSP指針未因?yàn)橥獠繋爝^程而被修改之前的地址。

回復(fù)