2011-11-04 33 views
4

我在互聯網上搜索了二進制編程,人們似乎願意給出的唯一答案是:「爲什麼要在二進制中編程?」 「這很愚蠢,使用組裝。」 「沒有什麼可以擺脫的,學習沒有意義。」二進制編程的資源

如果你是這些人之一,我感謝你的意見,但它不回答我的問題。

雖然我不上實際上是試圖以二進制的計劃我的理由知道打算是:

  1. 我在明知裝配命令後面的二進制指令的興趣。

  2. 我正在設計一個隨機二進制指令生成的實驗。我希望它們是有效的二進制命令,我希望能夠解釋這些命令在運行時會做什麼。

這樣說,有沒有人知道任何資源可以學習二進制編程?

回答

6

通常情況下,彙編指令和機器代碼(你稱之爲二進制)之間有一對一的映射關係。您可以在指令集體系結構文檔中找到這些映射,瞭解您所關心的任何機器。流行的例子:

  1. Intel Software Developer Manuals,特別是卷2A和2B。
  2. ARM Architecture Reference Manual
  3. THe MIPS Instruction Set
  4. 8051 Instruction Set Manual

你就可以找到任何一個建築,你要使用一個類似的文件。您可以使用這些手冊中的信息來解碼給定程序的機器指令,並確定它們是如何從彙編源生成的,或者可以根據需要手動組裝自己的程序。

+0

謝謝你的信息,這絕對有價值! – Thallios

+0

@Thallios,祝你好運! –

2

這裏就是我所做的學習二進制: 1.打開命令提示符,輸入「調試「作爲命令。

  1. 在' - '之後鍵入「a」。
  2. 在彙編中開始編程(確保您使用的命令非常通用,例如移動寄存器,只執行一個命令。)
  3. 不輸入任何內容,完成後按回車。
  4. 鍵入'd'查看二進制文件是什麼,並交叉引用幾個程序。

請注意,要編程實際的二進制文件,你需要一個十六進制編輯器。下面是我使用的一個:

http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm

另一個想法,我做學習更復雜的語言(如C++)是一樣做組裝,但在十六進制編輯器打開它。

+0

我感謝您的幫助。這絕對有用。 – Thallios

+0

謝謝,這是我知道要學習的最快的方式,也是學習需要學習的命令的最準確,最具體的方法,儘管您可能需要保留一個筆記本或文件記錄您學習的內容,並不是所有的命令都會第一次清除。(在這種情況下,更改命令的參數,然後再試一次)並且學習以原始二進制數學方式進行數學可能是一個好主意。 – JAW1025

1

好吧,作爲一個老黑客,因爲二進制:-)的日子誰一直在做這個

讓我儘量讓這個有點更具可讀性。

您描述的二進制文件就是所謂的機器碼。

藉此更進一步,CPU的是硬編碼到特定的指令作出反應,作爲一個例子(一個請注意我沒有任何引用此刻手)

值A9在6502機代碼意味着LDA(在其他體系結構上,這可能意味着不同)

因此,如果您在6502 CPU上工作,那麼序列A920將意味着以十六進制值0f 0x20加載累​​加器。

根據所討論的CPU以及指令集是如何編碼的,數字中的不同位將導致CPU(它是純粹的邏輯核心)執行不同的操作。

而且,根據製造商的規格,不同的位位置指定每個操作是什麼。

例如,在arm處理器中,位分支說明符,其中在6502中它們是零頁存儲器指示符。

實質上,二進制指令是特定於所討論的CPU,並且通常不能移植到另一個CPU(或者任何其他智能硅器件),因此移植和編寫軟件通常是非常困難的任務,除非您有對你的編程芯片非常深入的瞭解。

除非你在像intel這樣的公司工作,或者芯片生產商那麼現在真的不需要知道這些東西。然而,如果你喜歡打擊金屬並擠壓每一次性能的速度迷,那麼你仍然可以使用這些工具來做這種編程。

1

重要的答案。我只是想爲使用linux的人添加一個簡單的腳本,它顯示任何指令的二進制表示。你需要NASM的副本(但是,以便它使用煤氣或任何其他彙編,你可以很容易地編輯)和objdump的:

echo "$1" > testProgram.asm 
nasm testProgram.asm -o testProgram.out -f elf -g 
chmod 744 testProgram.out 
objdump ./testProgram.out -d -M intel | grep ' 0:' 
rm testProgram.out testProgram.asm 

下面是一些例子:

[email protected]:~$ ./viewOpcode.sh "add ecx, 5" 
    0: 81 c1 05 00 00 00  add ecx,0x5 
[email protected]:~$ ./viewOpcode.sh "int 0x80" 
    0: cd 80     int 0x80 
[email protected]:~$ ./viewOpcode.sh "fmul st0, st1" 
    0: d8 c9     fmul st,st(1) 
[email protected]:~$ ./viewOpcode.sh "andps xmm0, xmm1" 
    0: 0f 54 c1    andps xmm0,xmm1 
[email protected]:~$ ./viewOpcode.sh "movntq [edi], mm0" 
    0: 0f e7 07    movntq QWORD PTR [edi],mm0 
[email protected]:~$