2011-02-11 117 views
34

標題真的說了一切。我的一個朋友告訴我他知道一個可以用二進制編程的人。我從來沒有聽說過用二進制編程的人,幾次Google搜索沒有返回任何有用的東西。所以我想我會轉向SO社區。有沒有人有任何關於二進制編程的信息,如果可能的話可能是一個快速的Hello World示例。提前致謝。是否可以用二進制編程?

+4

是的,當然。請朋友的這位朋友出示這個例子。 ;-) – Keith 2011-02-11 02:15:13

+2

與[我可以直接用二進制寫程序嗎?我怎樣才能讓電腦執行它? (http://stackoverflow.com/questions/4197055/can-i-write-a-program-in-binary-directly-how-can-i-get-the-computer-to-execute)。 – 2011-02-11 02:22:01

+1

$ ad xx yy $ 20 $ ff $ d2或者它已經有一段時間了 – time4tea 2011-02-11 02:24:28

回答

40

當然。它通常被稱爲machine code。這基本上是assembly language沒有助記符設備。懂得彙編的人可以用機器代碼進行額外的編程,根據需要參考操作碼列表(例如x86)。

我會這麼做嗎?不可以。即使是在極少數情況下,組裝也是有用的,除了證明你的技能之外,沒有理由拒絕assembler的幫助。

既然您問過關於hello world,那麼您應該查看this article。他展示了他如何編寫,然後優化了一個x86 ELF程序來輸出它。它最初是在nasm中編寫的,然後在十六進制編輯器中進行了修改。

5

沒有太多的要求,但已完成。有一段時間,代碼可以從前端控制檯以二進制形式輸入到系統中。這是容易出錯的。

我曾經有一個非常短的uudecoe程序,用ASCII編碼,可以加上UUEncoded文件的前綴。生成的文件將自解壓並可通過電子郵件發送。我希望機器代碼是手工完成的。我找不到它,即使可以,也沒有用處。

6

當然,您可以編寫機器代碼的二進制文件,然後通過您的十六進制鍵盤輸入機器代碼到您的計算機中。我已經將基於TMS1100的計算機放在一起。

一個簡單的程序在十六進制LED上顯示5將是0001000 0000101 0000001寫成二進制轉換爲機器碼將是8 5 1。然後該程序將運行並在LED上顯示5。

對於使用TMS1100的更復雜的程序,我可以按照這個程序進行操作,我猜想用二進制編程。

其實,如果你對數學和編程感興趣,我認爲這是非常令人滿意和有益的。

6

對於勇敢的心臟:您可以嘗試獲取MikeOS軟盤映像並運行monitor.bin程序。它允許您手動輸入十六進制操作碼並執行它們。例如(如文檔所述),輸入以下指令: BE0790 E8FD6F C3 4D00$將在屏幕上產生一個單一的MHexadecimal code

-3

有一些深奧的編程語言。它們被用作實驗,而且不切實際,但是一個名爲BrainF ** k(是的,它實際上是一個真實的東西)使用八個不同的字符來修改字節值。這些類型的語言儘可能地接近你所能得到的。

7

非常有可能記住機器代碼相當於彙編指令。實際上,在用匯編語言編寫代碼時,通常會看到通過machine code monitor s,disassembler s,assembly listings等等的十六進制代碼。因此,隨着時間的推移,一些指令可以以十六進制格式存儲,而不需要額外的努力。

Apple II 6502 ROM Monitor

  • 在畫面中的6502 ROM監控所看到的,其中十六進制代碼和組裝助記符並排顯示。

你需要的第二項技能是將十六進制代碼轉換爲二進制頭腦,這很簡單,我會稍微解釋一下。但是,記住所有十六進制數字的二進制等價物非常容易,其中有16個數字,畢竟(不是很多,不是嗎?)。

讓我們假設它是在1988年,我們花了近十年的移植8位視頻遊戲不同的平臺爲生,因此記住以下6502十六進制代碼說明對應的彙編指令:

OPCODE  HEX 
LDA #$44  0xA9 0x44 
STA $44  0x85 0x44 
STA ($44),Y 0x91 0x44 
LDY #$44  0xA0 0x44 

(或在另一個生活,pretend it is 1974, our name is Paul Allen, we are on a plane to Boston, and we have to write a bootloader for Altair 8800 with pen and paper

通過以上的操作碼僅存儲,我們可以僅使用筆和紙寫入以下機器碼

0xA9 0x00 0x85 0x01 0xA9 0x02 0x85 0x02 0xA0 0x00 0xA9 0x01 0x91 0x01 

實際上上面是在助記符形式下面彙編代碼

LDA #00 
STA $01 
LDA #02 
STA $02 
LDY #00 
LDA #01 
STA ($01), Y 
  • 上面的代碼中6502asm.com彙編把一個白色像素在屏幕的左上角/仿真器的,繼續嘗試吧!

如果您已經記住了每個十六進制數字的二進制形式,那麼您可以將整個代碼寫成二進制。

但是,如果你沒有記住他們,或不肯定的二進制形式是什麼,很容易將它們與下面的技巧轉換:

1 1 1 1    
| | | |    
v v v v    
8 + 4 + 2 + 1 
| | | +---> 2^0 * 1 Ex: 13 is 8 + 4 + 0 + 1 
| | +-------> 2^1 * 1    1 1 0 1 -> 1101 (0xD) 
| +-----------> 2^2 * 1 Ex: 7 is 0 + 4 + 2 + 1 
+---------------> 2^3 * 1    0 1 1 1 -> 0111 (0x7) 

其中上飛幫助一個二進制代碼寫入:

LDA #00  -> 0xA9 0x00 -> 10101001 00000000 
STA $01  -> 0x85 0x01 -> 10000101 00000001 
LDA #02  -> 0xA9 0x02 -> 10101001 00000010 
STA $02  -> 0x85 0x02 -> 10000101 00000010 
LDY #00  -> 0xA0 0x00 -> 10100000 00000000 
LDA #01  -> 0xA9 0x01 -> 10101001 00000001 
STA ($01),Y -> 0x91 0x01 -> 10010001 00000001 

有了一些復古的計算精神和動機有樂趣,我們實際上可以寫成二進制整個代碼不寫下來的中間步驟。

相關問題