[英]C++/Assembly pushing arguments onto the stack for function call
我有一個特殊情況,我需要一次將 arguments 壓入堆棧,然后調用一個 function,它將一個可調用對象作為參數,並將那些被壓入堆棧的 arguments 傳遞給可調用對象/函數。 為了解決這個問題,我在匯編中創建了一些函數以將 arguments 壓入堆棧並調用 function 傳遞那些 arguments。但是它接縫工作但是每當我調用傳遞給 CallFunction 的可調用對象中的其他函數時,我的代碼開始在奇怪的地方中斷.
我需要這個 function 來接受任何調用。 任何幫助將非常感激。
請注意,std::bind 和其他類似功能不是一個選項。 每個參數都需要使用 function 調用一次一個地壓入堆棧,我需要能夠在調用 PushArg 和 CallFunction 之間調用函數應該返回它執行的 function 的返回值。
我試過什么:
在調用開始時保存堆棧指針並在我返回之前恢復它(當前狀態)
在 memory 中創建我自己的堆棧以存儲 arguments(太復雜和凌亂,效率不如僅使用寄存器和現有堆棧。如果可能,希望避免)
代碼:
.data
FunctionPointer QWORD 0
ReturnPointer QWORD 0
StackPointer QWORD 0
.code
ALIGN 16
FT_StartCall PROC
mov [StackPointer],rsp
ret
FT_StartCall ENDP
FT_PushIntPointer PROC
pop ReturnPointer
push rcx
push ReturnPointer
ret
FT_PushIntPointer ENDP
FT_CallFunction PROC
;save return address in Memory
pop ReturnPointer
mov FunctionPointer,rcx
pop rcx
pop rdx
pop r8
pop r9
push r9
push r8
push rdx
push rcx
call FunctionPointer
mov rcx,0
mov rdx,0
mov r8,0
mov r9,0
mov rsp, [StackPointer]
push ReturnPointer
ret
FT_CallFunction ENDP
END
C++:
extern "C" void* __fastcall FT_CallFunction(void* Function);
extern "C" void __fastcall FT_PushIntPointer(void* ArgOrPointer);
extern "C" void __fastcall FT_StartCall();
int ADD(int first,int second){
return first+second;
}
int main(){
FT_StartCall();
FT_PushIntPointer(3);
FT_PushIntPointer(2);
int res = FT_CallFunction(ADD);
return res;
}
Output:
5
正如每個人都同意的那樣,您正在使用這段代碼深入研究 UB 領域,但我猜它確實具有一些實驗價值。
您應該考慮分配自己的私有堆棧以獲得更強大的功能。
這段代碼:
pop rcx
pop rdx
pop r8
pop r9
push r9
push r8
push rdx
push rcx
除了加擾 rcd、rdx、r8 和 r9 之外什么都不做。 你應該刪除它。
這段代碼也是如此:
mov rcx,0
mov rdx,0
mov r8,0
mov r9,0
你試過這樣的事情嗎?
FT_CallFunction PROC
; save return address in Memory
pop [ReturnPointer]
; call and replace with our own return point.
call [rcx]
mov rsp,[StackPointer]
; return to caller
push [ReturnPointer]
ret
FT_CallFunction ENDP
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.