自己寫的COFF檔案格式和編譯器生成的 obj檔案一樣嗎?

時間 2021-06-01 07:55:46

1樓:韋易笑

如果你要實用化,那麼該用 llvm來生成高效能機器碼,自己去弄 coff, obj是髒活累活,弄出來也沒太大意義。想簡單點可以輸出彙編給 nasm,或者用 asmjit之類的在記憶體裡面生成機器碼。

如果你是自己弄著玩,還是自己做乙個虛擬機器比較好玩,仿照 RISC指令集定義乙個20個左右的指令集(不需要返照 intel的 cisc,太累了),RISC定址比較簡單,統一,比如只有 LDR/STR 兩條命令可以讀寫記憶體,加減乘除邏輯運算等,只能暫存器到暫存器。

然後再給你的 RISC虛擬機器做乙個簡單的指令碼,類似彙編,然後讓你的編譯器輸出成 RISC彙編,交給虛擬機器執行,多好玩,而且還可以加很多介面,讓你的指令碼系統直接呼叫 C實現的各種功能,例如,我剛讀大學時候做著玩的遊戲程式語言+虛擬機器:

提供遊戲功能的虛擬機器在跑編譯出來的虛擬機器彙編

指令碼編譯成虛擬機器彙編的效果。

流程相當於你要編譯兩次:

編譯器:指令碼 -> 虛擬機器彙編

虛擬機器:虛擬機器彙編 -> 指令位元組碼

最終執行是虛擬機器直接在記憶體裡面跑你定義出來的 20條指令集的位元組碼。

開始設計虛擬機器時,可以先在草稿紙上,把暫存器和 20條指令集(你可以仿照 arm, mips)推演清楚,然後設計位元組碼。設計完位元組碼以後,直接開始開發虛擬機器,用乙個陣列作為虛擬機器記憶體空間(指令+資料),然後徒手在陣列裡面寫一些指令給虛擬機器跑跑看,跑得通麼。

指令裡面你留出一條來,用於呼叫外部服務,比如叫做 syscall,或者類似 intel的軟體中斷命令 int,然後外面使用虛擬機器的使用者,可以用 C語言向虛擬機器註冊新的中斷服務,實現功能擴充(比如實現 puts在控制台給定長度列印虛擬機器暫存器所指向的字串,和 PC上 Int 10h輸出字串一樣)。

保證虛擬機器能夠正常工作後,再給它設計一套精簡的組合語言,以解析簡單為主,這部分實現可以直接放在虛擬機器的 loader裡面,由虛擬機器載入在記憶體中直接生成位元組碼。然後你可以用虛擬機器彙編編寫乙個 .vm的副檔名的檔案,你的虛擬機器可以直接載入 .

vm並解釋成位元組碼執行。

這時候回過頭去改你的編譯器輸出部分,讓編譯器輸出成 .vm檔案,然後就可以用虛擬機器跑了。哪天你又實現乙個新的指令碼語言,還可以用你之前做的虛擬機器來提供執行環境。

指令碼系統編譯出來的符號,可以直接轉成.vm檔案裡面的符號,比如指令碼裡面函式 abc,在.vm檔案裡面,叫做,_script_proc_abc,指令碼裡面整數 x,叫做,_script_int_x。

比如你從記憶體載入乙個整數到暫存器,在 .vm裡面直接寫成 LDR R1, X 就行了,跳轉位址也是一樣。虛擬機器的 loader載入 .

vm檔案的時候,可以把.vm和其依賴的其他.vm在記憶體中合併成乙個大的 .

vm檔案(生成位元組碼後再合併也可以),再把符號表重定位成虛擬機器記憶體空間裡面的指標位址。

最後,給你的指令碼語言裡面,提供一條 ASM語句,可以直接寫虛擬機器彙編。用指令碼語言和ASM語句封裝一下虛擬機器擴充出來的軟體中斷呼叫,成為指令碼語言裡面的乙個個基礎函式,作為你的標準庫。

你把虛擬機器指令集定義並實現出來後,感覺象自己發明了顆 CPU,比直接生成coff, obj好玩多了。

----

關於 obj, lib 檔案格式和程式連線的問題

憑凡 1.C 編譯器編譯後生成的東西是什麼,obj裡面是機器碼麼,如果不是,機器碼是什麼時候生成的 OBJ裡面包含機器碼,但是不是純粹機器碼,它有一定的檔案格式。方便鏈結器生成可執行程式。2.編譯器能確定全域性變數的位址麼,為什麼在obj裡面可以看到全域性變數的名字 編譯器不能確定全域性變數的位址,...

如何評價框架共用的模型檔案格式ONNX?

吳斌 目前,AMD ARM 華為 IBM 英特爾 高通都已宣布支援ONNX。注意,這裡的都是硬體和晶元公司。而神經網路真正在工業界廣泛使用的是影象和語音識別。這兩種應用,未來都將硬體化。隨著物聯網的不斷成熟,網路邊緣的硬體自己就可以識別影象和聲音,不需要把資料上傳到雲端去識別,這是未來的趨勢。而ON...

VScode怎樣隨開啟的檔案格式而改變編碼方式?

刀與劍 單擊右上角 檔案 首選項 設定 搜尋尋找 files.autoGuessEncoding 在前面打上勾 儲存就可以了 圓核桃 本人使用matlab的時候 預設編碼GB 2312 遇到過同樣編碼問題 vscode開啟 m檔案要麼亂碼 要麼由於安裝changEncode外掛程式強制改變編碼到ut...