2011-05-18 1385 views
12

我想在python腳本中執行彙編代碼。那可能嗎?用python執行彙編代碼

在C語言程序會是這樣

static inline getesp(){ 
     __asm__("mov %esp, %eax"); 
} 

但如何做到這一點與Python?可能嗎?

+1

用你的例子,你只會得到棧解釋器的指針,這在你的程序中是沒有意義的。所以你想做的事情無論如何都不會起作用。 – hirschhornsalz 2011-05-18 08:00:50

+2

沒有那只是在另一種語言內執行的小例子。我並不是真的想要獲取堆棧指針地址... – 2011-05-18 08:04:33

+0

該函數不能用作內聯函數。你其實需要'__attribute __((noinline))'。否則,只會將'mov%esp,%eax'插入到內聯的任何位置,編譯器可能會將EAX用於其他內容。你應該使用'asm(「mov%esp,%0」:「= rm」(retval));'。另外,您在聲明中依賴C89隱式返回類型('int')。另外,獲得ESP是一個非常糟糕的例子,從python使用的東西。也許使用像'pext'這樣的BMI2指令顯示? – 2016-09-07 00:50:27

回答

11

你可以這樣做的一種方法是爲Python編寫一個(C)擴展。你可以看看this文檔,瞭解如何做到這一點的完整細節。

開發基於C的Python擴展的另一種方法是使用ctypes模塊直接與外部庫進行接口。

在任何情況下,您都需要將一些C代碼編譯到庫或擴展中,以及從Python調用它的方式。很明顯,對於你想達到的目標來說,這可能不是最優的,但實際上它沒有多少工作來揭示一些功能。

+5

需要指出的是,由於Python支持C擴展,所以你可以在純彙編器中編寫你的who; e擴展,只要你編碼爲遵循C的調用約定參數傳遞,返回值,註冊使用等。 – martineau 2011-05-18 09:59:27

-2

Python不支持這種低級別的硬件交互。

+0

嗯......不幸的是...... – 2011-05-18 06:58:29

+1

你必須走出正規的Python *代碼*之外,但是Python可以通過ctypes和/或C擴展與低級硬件進行接口。 – 2011-05-18 10:33:13

+1

我想我從語言的角度看待這個問題,而不是像Cython這樣的實現 – 2011-05-18 10:36:09

0

從理論上講,你可以:

  1. 寫一個簡單的函數使用C調用組件
  2. 使用CythonPyrex調用該函數在Python

我不得不承認,我沒有使用Pyrex或Cython,但他們可能能夠做到你所需要的,而不必去編寫一個完整的C擴展。

15

你可以看看使用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> 
+0

我已經看到它。但是,我想編寫像C編程內部程序集 – 2011-05-18 10:54:39

+3

然後,也許你會有更多的運氣看看CorePy本身如何實現這一點。 – 2011-05-18 11:04:28

3

對不起necroposting,但我認爲你可以使用ASM編寫自己的DLL,並調用它的功能從內部的Python。

+0

嗯,好主意的人。謝謝。 – 2013-01-24 11:27:48

+0

我現在在學習ASM,並在思考如何使用可愛的Python和超級可愛的彙編器時想到了它。你有沒有找到這個想法的必要解決方案?也許你可以分享他們作爲你自己的問題的答案?並感謝你的重要問題:) – 2013-01-25 19:40:43

0

我很可能在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/

+1

OP想運行在python程序內的asm中指定的機器代碼,而不是編寫一個python程序將asm源碼彙編到機器代碼中。 – 2016-09-07 00:55:16

+0

轉到codewars.com查找__TomFoolery__這就是我,並查看我在Python中編寫的彙編程序。你必須有權訪問低級別的功能來寫一個設想我的好先生,所以我求求不同:) – TomFoolery 2016-12-08 19:47:47

+0

要點。您可以。但你必須編寫這些函數,有點無意義,但可以做 – TomFoolery 2016-12-08 19:48:46