x64調(diào)用規(guī)范第3行調(diào)用者的責(zé)任,,還包括在運行時堆棧分配至少32字節(jié)的影子空間,,這樣被調(diào)用的過程就可以選擇將計算器參數(shù)保存在這個區(qū)域中,。問題這里的影子空間32字節(jié),,我咋沒看出來是啥意思以及它們的作用,。 %20%20%20
我自己答吧 終于明白了,、,、預(yù)留32字節(jié)的影子空間 其實是在調(diào)用系統(tǒng)外部鏈接庫和 和 其他外部庫時 用的 而一般自定義的調(diào)用過程 不用如此。因為 在自定義的過程里其實是沒必要的 因為 可以在過程里直接 PUSH XXX然后結(jié)束時在POPXXX 堆棧就復(fù)原了(在過程運行完時一般必須如此)例如we procpush raxpush rbx.... ....pop rbxpop raxretwe endp
而調(diào)用外部鏈接庫過程時,。因為無法改動外部庫的過程中的內(nèi)容,。所以在調(diào)用庫過程之前無法保證PUSH 使用之后調(diào)用外部庫過程返回后 PUSH指令的 堆棧順序還能對上之前的 PUSH和POP成對使用。 因為無法保證在外部過程中PUSH和POP的成對使用,。,。而臨時保存寄存器內(nèi)容在不適用全局變量的情況下 對RSP指針的所在堆棧內(nèi)存地址進(jìn)行手動地址下移 預(yù)留出空間 然后使用 直接尋址方式 來訪問預(yù)留的堆棧空間是最好的且不出意外的方式而且 調(diào)用外部過程是有規(guī)范的,。,。(只使用4個寄存器往外部庫過程傳遞參數(shù)更多的使用堆棧而堆棧等下可以手動恢復(fù)指針地址廢掉數(shù)據(jù)還原RSP地址到之前的正確位置)所以只需要使用4個64位寄存器 4乘以8字節(jié)等于32字節(jié)。,。所以預(yù)留32字節(jié)的影子空間使用直接尋址方式訪問 在恢復(fù) 4個傳遞參數(shù)的寄存器之后 就可以手動 使用命令 ADD rsp ,xxx 之類的命令 恢復(fù)堆棧RSP指針 使其復(fù)原
其實就是主調(diào)程序 為被調(diào)用程序預(yù)留的 4個 64位存儲空間 可通過_直接尋址方式**_訪問,。。這是WINDOWSAPI 64 的規(guī)范,。具體用不用如何使用是 WINDOWS API 的事情(外部調(diào)用過程 無法自己修改)一般來說是用來暫存 傳遞參數(shù)的寄存器的值得 騰出來寄存器 以便 外部庫過程使用,。且外部庫過程使用堆棧結(jié)束后需清除所有參數(shù)使用的堆棧空間和影子空間 需把堆棧指針復(fù)原到RSP指針未因為外部庫過程而被修改之前的地址,。