簡體   English   中英

C++/Assembly 將 arguments 推入堆棧以進行 function 調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM