我想在python腳本中執行彙編代碼。那可能嗎?用python執行彙編代碼
在C語言程序會是這樣
static inline getesp(){
__asm__("mov %esp, %eax");
}
但如何做到這一點與Python?可能嗎?
我想在python腳本中執行彙編代碼。那可能嗎?用python執行彙編代碼
在C語言程序會是這樣
static inline getesp(){
__asm__("mov %esp, %eax");
}
但如何做到這一點與Python?可能嗎?
Python不支持這種低級別的硬件交互。
嗯......不幸的是...... – 2011-05-18 06:58:29
你必須走出正規的Python *代碼*之外,但是Python可以通過ctypes和/或C擴展與低級硬件進行接口。 – 2011-05-18 10:33:13
我想我從語言的角度看待這個問題,而不是像Cython這樣的實現 – 2011-05-18 10:36:09
你可以看看使用CorePy
包,可用here。要使用它,例如一個AMD64,每個文檔:
# Load the x86_64 instructions and environment
>>> import corepy.arch.x86_64.isa as x86
>>> import corepy.arch.x86_64.platform as x86_env
Platform: linux.spre_linux_x86_64_64
# Create a simple synthetic program
>>> code = x86_env.InstructionStream()
>>> code.add(x86.mov(code.gp_return, rsp))
# Execute the synthetic program
>>> proc = x86_env.Processor()
>>> result = proc.execute(code, mode='int')
>>> print result
<rsp value will be here>
我已經看到它。但是,我想編寫像C編程內部程序集 – 2011-05-18 10:54:39
然後,也許你會有更多的運氣看看CorePy本身如何實現這一點。 – 2011-05-18 11:04:28
對不起necroposting,但我認爲你可以使用ASM編寫自己的DLL,並調用它的功能從內部的Python。
嗯,好主意的人。謝謝。 – 2013-01-24 11:27:48
我現在在學習ASM,並在思考如何使用可愛的Python和超級可愛的彙編器時想到了它。你有沒有找到這個想法的必要解決方案?也許你可以分享他們作爲你自己的問題的答案?並感謝你的重要問題:) – 2013-01-25 19:40:43
可以裝配直接在Python程序中嵌入:
這些工作由編譯組件,並將其加載到可執行內存在運行時。前三個項目使用Python實現x86-64或x86彙編程序,而最後一個項目調用外部編譯器。
我很可能在python中製作了一個小型彙編程序,我使用的一些庫可能支持Ctypes,但我使用的是純Python,大多數語言實際上都是在低級別接口,我們只是使用HLL語言功能並沒有給予適當的關注,如何處理代碼,我也寫了一個小的POC圖像編輯應用程序在Visual Basic中使用ASM x86代碼 我不確定如何將其編輯成我想說的內容。除了可能會讀取asm代碼並從腳本內部工作的函數。我相信我的想法被指出是錯誤的。 ASM代碼可以通過使用腳本函數來讀取代碼並編譯它們。就好像它是一個內置的動態彙編程序。儘管我試圖幫助不是那麼好的演講者(或者是這種情況下的編寫者,因爲它可能),但這裏的這個頁面可能能夠更好地解釋我想說的內容 http://code.activestate.com/recipes/579037-how-to-execute-x86-64-bit-assembly-code-directly-f/
OP想運行在python程序內的asm中指定的機器代碼,而不是編寫一個python程序將asm源碼彙編到機器代碼中。 – 2016-09-07 00:55:16
轉到codewars.com查找__TomFoolery__這就是我,並查看我在Python中編寫的彙編程序。你必須有權訪問低級別的功能來寫一個設想我的好先生,所以我求求不同:) – TomFoolery 2016-12-08 19:47:47
要點。您可以。但你必須編寫這些函數,有點無意義,但可以做 – TomFoolery 2016-12-08 19:48:46
用你的例子,你只會得到棧解釋器的指針,這在你的程序中是沒有意義的。所以你想做的事情無論如何都不會起作用。 – hirschhornsalz 2011-05-18 08:00:50
沒有那只是在另一種語言內執行的小例子。我並不是真的想要獲取堆棧指針地址... – 2011-05-18 08:04:33
該函數不能用作內聯函數。你其實需要'__attribute __((noinline))'。否則,只會將'mov%esp,%eax'插入到內聯的任何位置,編譯器可能會將EAX用於其他內容。你應該使用'asm(「mov%esp,%0」:「= rm」(retval));'。另外,您在聲明中依賴C89隱式返回類型('int')。另外,獲得ESP是一個非常糟糕的例子,從python使用的東西。也許使用像'pext'這樣的BMI2指令顯示? – 2016-09-07 00:50:27