應該怎樣把值傳給一段被編譯後的機器碼

時間 2021-06-03 15:14:27

1樓:RednaxelaFX

請問題主的意思是類似這樣的場景麼?

#include

#include

#include

typedef

int(

*binary_func_t

)(int

,int

);int

main();

char

*code_buf

=mmap

(NULL

,sizeof

(code

),PROT_READ

|PROT_WRITE

,MAP_PRIVATE

|MAP_ANON,-

1,0);

memcpy

(code_buf

,code

,sizeof

(code

));mprotect

(code_buf

,sizeof

(code

),PROT_READ

|PROT_EXEC

);binary_func_t

max=

(binary_func_t

)code_buf

;intn=

max(3,

42);

printf

("max(3, 42) = %d\n"

,n);munmap

(code_buf

,sizeof

(code

));return0;

}// Use MAP_ANON instead of MAP_ANONYMOUS on Mac OS X

這是我在Mac OS X / x86-64上寫的個小測試。對應Windows上的話 mmap -> VirtualAlloc,mprotect -> VirtualProtect。

如果是這樣的場景的話,題主想問的是在我的例子中 max(3, 42) 那裡引數是如何傳遞過去的麼?其實沒啥特別的,就是按照給定的calling convention來啊。

我的例子裡就是用預設的System V ABI的calling convention,兩個引數分別從RDI、RSI傳遞,返回值從RAX傳遞。

題主在Windows上實驗的話,那麼就參考您的程式設計環境裡的預設calling convention來搞就好了。

如果題主沒留意過的話,其實函式指標型別上是可以宣告calling convention修飾符的,不寫就是用預設的calling convention。例如說:

typedef

int(

__stdcall

*binary_func_t

)(int

,int

);typedef

int(

__cdecl

*binary_func_t

)(int

,int

);typedef

int(

__fastcall

*binary_func_t

)(int

,int

);等等。這樣就可以根據目標函式的實現狀況來在caller一側選擇合適的calling convention與之匹配了。

感覺談了一段被父母否定的戀愛後,我變了,感覺家很陌生,以前快樂很簡單,現在時常有抑鬱傾向怎麼辦?

陽明瓦拉 無條件的信任父母,依賴對方的愛,當然是簡單而快樂的生活。就好像乙隻上帝的寵物,要什麼有什麼,你需要做的只是聽話就好了。什麼遠慮近憂 什麼存在的意義,那不是你的需要。這種時候你的生活除了簡單快樂還能有什麼呢?直到有一天,因為愛情,你不聽話了。你反叛了。到這時候,你才發現原來父母不像你以為的那...

怎樣從一段不應該開始的感情中走出來?

我覺得你選擇男人的眼光很差,而且不自愛。明知道是錯的還這樣做,出軌就是出軌,背叛就是背叛,再怎麼找理由也是於事無補。你和你老公鬧分手他氣不過找了個新歡來氣你?這都什麼亂七八糟的,我都看蒙了。對待感情婚姻一點也不成熟,還要孩子.自己先活明白吧。 山野草民 我很疑惑,兩個對待婚姻 對待男女關係是如此草率...

在經歷一段愛到死去活來的戀愛後,怎樣從失戀的陰影中走出來?

礎潤而雨 萬事皆可爭取,除了感情。建議,多放開視野,拓展興趣愛好。如果沒有,就專注工作,事業,好歹能賺點錢。再沒有,就學一技之長,來完善自己。總之不能讓自己閒著,越忙越好。 如初 我也不知道這個問題的標準答案是什麼,我的親身經歷我只能說在時間裡慢慢熬,時間長一些感受淡一些,距離失戀目前已經九個月多,...