導航:首頁 > 源碼編譯 > 自定義指令集編譯器

自定義指令集編譯器

發布時間:2022-11-26 00:53:36

A. 編譯器與指令集

1.tc是16位的編譯器,它用於64位的程序開發。自然沒有對新的64位指令集支持。

2.樓主的理解有一些偏差:如同樓上所說,C語言是本地編譯和鏈接的,此次編譯鏈接成的可執行文件時針對本地機。其跨平台是在可用一個源文件在多平台編譯鏈接,但是其產生的目標文件和本地不同。
TC已經過時N久了,推薦樓主使用微軟的VS2008。

B. 每個編譯器都不一樣么 c語言一般用什麼編譯器 每次一種編譯器不能編譯 另一種卻能編譯出

編譯器就是c語言編譯成二進制的東西,
不同的編譯器是不同的, 比如16位系統和32位系統的編譯器就不同,因為16位的認為int是2位元組,32位的則認為是4個位元組。 另外 linux上的編譯器跟windows下的編譯器也不同,linux上的認為內核空間佔1G,而windows下則認為佔2G, 此外兩個系統對環境變數以及其他的設置也不同所以編譯器更不能用。
而且不同的CPU的指令集時不同的,所以同樣int a =1 最後被編譯成的二進制代碼也是不同的。

C語言的編譯器有很多,windows下的編譯器也有很多,不同的編譯器可能會做一些不同的優化,linux下的gcc也可以添加選項讓他編譯windows下運行的程序。
main(int argc,char*argv[ 】 ) argc 是你的參數個數 argv是你的參數。
比如你最終程序叫 add 那麼 你在命令行執行add 1 2 那麼argc =3 第一個參數使你的add, 第二個第三個就是 1 2, 在函數內部你就可以獲取這倆參數進行相加然後列印

visual 是個IDE,集成開發環境,已經集成好了windows下使用的編譯器連接器 等, 編寫代碼完成後直接點擊編譯就行了。 IDE的默認編譯器是可以更改的,不同的IDE設置不同。

C. 編譯器如何將編程語言翻譯成目標CPU的特定指令集

編譯器如何將編程語言翻譯成目標CPU的特定指令集?
MSIL
MSIL是將.NET代碼轉化為機器語言的一個中間過程。它是一種介於高級語言和基於Intel的匯編語言的偽匯編語言。當用戶編譯一個.NET程序時,編譯器將源代碼翻譯成Microsoft 中間語言 (MSIL),它是一組可以有效地轉換為本機代碼且獨立於CPU的指令。當執行這些指令時,實時(JIT)編譯器將它們轉化為CPU特定的代碼。由於公共語言運行庫支持多種實時編譯器,因此同一段msil代碼可以被不同的編譯器實時編譯並運行在不同的結構上。從理論上來說,MSIL將消除多年以來業界中不同語言之間的紛爭。在.NET的世界中可能出現下面的情況一部分代碼可以用EFFIL實現,另一部分代碼使用C#或VB.NET完成的,但是最後這些代碼都將被轉換為中間語言。

D. 請問學x86匯編語言用什麼編譯器

編譯器自舉!搜索這個關鍵字
程序都是編譯器編譯的。這個是肯定的
至於第一款X語言編譯器是不是直接1010101010自己寫的那就不知道啦

一般開發編譯器的話。有兩條路選擇
1.利用yacc(或者其變種)&lex(詞法分析)-等工具自己生成語法模板
詞法語法都可以使用這些工具自己生成
然後自己編寫生成的中間碼和生成的機器碼就可以了
一般做編譯原理類似試驗都是如此的。許多編譯器也的確是這樣

2.自己寫詞法分析和語法分析。可以參考一些開源的編譯器
lcc-這個是ANSI C99標準的編譯器是開源的
或者nasm,watcom等編譯器到上不少開源的編譯器

總的來說。高級語言編譯器比較難寫
如果想快速寫出一個的話
可以採用第一種做法。利用工具生成語法詞法模板
先寫一個簡單的匯編編譯器比較簡單
開源的有nasm,jwasm(支持masm語法開源的編譯器)

fasm(這款編譯器是自舉的.就是自己可以編譯自己),

剩下的就是自己做好語言規則關鍵字map
引用高手的話。語言map做好了你的編譯器也做好一半了
剩下的都是機械性的工作了。
生成x86或者arm指令。

優化工作這個很難解釋.根據你所需要的做吧
畢竟可以做出一個無錯,又XX的編譯器已經很難得

你可以選擇使用現有的編譯器開發自己的編譯器
然後等到你的編譯器支持相當數量指令和成熟度的時候
使用自己的語法重新寫一遍編譯器.
這樣你就可以用自己的編譯器開發自己的編譯器了(是不是很邪惡?)

另外舉幾個例子
Delphi的編譯器是C++ Builder開發的。
而C++ Builder的IDE是Delphi開發的
C++ Builder的編譯器是C++ Builder開發的-這個就是編譯器自舉了。。Delphi和C++ Builder共享一個後端化優化器。
Delphi 早期的版本的編譯器是tasm直接編譯的。可見Anders的匯編功力多強悍(Anders也就是後來VJ++,C#,.NET工程的核心架構師.最關鍵的靈魂級人物)

VC++的編譯器是VC++開發的。很明顯這都說明了編譯器自舉
自己開發自己。如果一個編譯器可以做到自己編譯自己。那基本上就可以實現任何功能了。

關於編譯器開發的書籍可以看一下
龍書《編譯原理(第二版)》
虎書《現代編譯原理-C語言描述》
鯨書《高級編譯器設計與實現》
建議從鯨書看起。然後是龍書
再來是虎書--虎書裡面描述了許多現代編譯器(正如其名)技術
例如面向對象啦,優化,垃圾回收等等.
鯨書看完基本上就可以實現一個簡單的Tiny C編譯器了
然後在龍書鞏固,讀一下語言規范,自己看一些開源的匯編編譯器代碼
自己就可以嘗試做一個匯編語言編譯器了.等到技術提高了
在嘗試做一些高級語法識別,參考LCC代碼做一下ANSI C99的
C語言編譯器。再來就看你自己的興趣和領悟度拉
如果想支持C++的話就得要對編譯器做許多方便的研究

類似Java那種跨平台或者Ruby,Python等動態語言
虎書中也有描述。當然看自己功力了

E. 自定義區段 Win32匯編

下面的程序段是一個框架。

字串2

.386
.MODEL Flat, STDCALL
.DATA
<Your initialized data>
......
.DATA?
<Your uninitialized data>
......
.CONST
<Your constants>
......
.CODE
<label>
<Your code>
.....
end <label> 字串6

框架就這么簡單,好,我現在就給您解釋: 字串8

.386
這是一個匯編語言偽指令,他告訴編譯器我們的程序是使用80386指令集編寫的。您還可以使用 .486、.586, 但最安全的還是使用.386。對於每一種CPU有兩套幾乎功能相同偽指令: .386/.386P、 486/.486P、 586/.586P。 帶P的指令標明您的程序中可以用特權級指令。特權級指令是保留給操作系統的,如虛擬設備驅動程序。在大多數時間,您的程序都無須運行在RING0層,故用 不帶後綴P的偽指令已足夠了。

字串8

.MODEL FLAT,STDCALL
.MODEL 是用來指定內存模式的偽指令,在Win32下,只有一種內存模型,那就是FLAT。 STDCALL 告訴編譯器參數的傳遞約定。參數的傳遞約定是指參數傳達時的順序(從左到右或從右到左)和由誰恢復堆棧指針(調用者或被調用者)。在Win16下有兩種約 定:C 和 PASCAL。C 約定規定參數傳遞順序是從右到左,即最右邊的參數最先壓棧,由調用者恢復堆棧指針。

字串8

例如:為調用函數 foo ( int first_param, int second_param, int third_param ); 按C約定的匯編代碼應該是這樣的:

字串5

push [third_param]
push [second_param]
push [first_param]
call foo
add esp, 3 * 4 ;調用者自己恢復堆棧指針

字串6

PASCAL約定和C約定正好相反,它規定參數是從左向右傳遞,由被調用者恢復堆棧。Win16採用了PASCAL約定, 因為PASCAL約定產生的代碼量要小。當不知道參數的個數時,C約定特別有用。如在函數wsprintf () 中, wsprintf預先並不知道要傳遞幾個參數,所以它不知道如何恢復堆棧。STDCALL是C約定和PASCAL約定的混合體,它規定參數的傳遞是從右到 左,恢復堆棧的工作交由被調用者。Win32隻用STDCALL約定,但除了一個特例,即:wsprintf。

字串1

.DATA .DATA? .CONST .CODE
上面的四個偽指令是"分段"(SECTION)偽指令。我們上面剛講過Win32下沒有"段"(SEGMENT)的概念,但是您可以把您的程序分成不同的"分段", 一個"分段"的開始即是上一個"分段"的結束。WIN32中只有兩種性質的"分段":DATA和CODE。
其中DATA"分段"又分為三種:
.DATA 其中包括已初始化的數據。
.DATA? 其中包括未初始化的數據。比如有時您僅想預先分配一些內存但並不想指定初始值。使用未初始化的數據的優點是它不佔據可執行文件的大小,如:若您要在 .DATA? 段中分配10,000位元組的空間,您的可執行文件的大小無須增加10,000位元組,而僅僅是要告訴編譯器在裝載可執行文件時分配所需位元組。
.CONST 其中包括常量定義。這些常量在程序運行過程中是不能更改的。 應用程序並不需要以上所有的三個"分段", 可以根據需要進行定義。
.CODE 這是代碼"分段"。
< 譯者註:實際上,分段並不是象在 Dos 下一樣,為不同的段分別指出不同的段寄存器,因為 Windows 下只有一個 4GB 的段,Windows 程序中的分段表現在當程序裝載時,賦予不同的分段不同的屬性,比如說當你的程序載入時,對於 Ring3 程序來說,.code 段是不可寫的,而 .data 段是可寫的,如果你嘗試象在 Dos 下一樣寫自己的代碼部分,你會得到一個藍屏錯誤>

字串9

<label>
end <label>
是用來唯一標識您的代碼范圍的標簽, 兩個標簽必須相同,應用程序的所有可執行代碼必修在兩個標簽之間。

F. 指令集、編譯器、演算法、CPU

CPU就是用來計算的,CPU可以做不同的計算,每種計算是一個命令,你可以用命令通知CPU做這種計算,所有的命令構成了指令集。
你寫的代碼CPU是不懂的,需要翻譯成上面說的命令,這個翻譯者就是編譯器。
演算法跟他們的關系稍遠一些。如果把計算比作生產的話,那演算法就是配方和工藝,指導著從原材料到產品的生產過程。

希望能幫助到你。

G. 正常編寫的c語言程序編譯器會自動進行針對特定指令集用匯編語言優化嗎

這個要看你使用什麼編譯器了。查看編譯器的幫助文檔,它會告訴你它支持那些指令集,並且做哪些可能的優化。

不同的編譯器,是不一樣的。

補充:GCC 不太清楚,你連VC++的版本都不說。汗,VC6是不支持SSE的,需要安裝VC6SP5。
VS2005 和 VS2008 都支持 SSE。對 SSE/MMX 指令集優化得最好的,還是 Intel 的 c++ 編譯器。

對並行和高性能計算,Fortran 的優勢比較大。特別是 Fortran2003 的新特徵,為並行計算做了很多專門的設定。Intel 也有 Fortran 的編譯器。

H. 關於cpu指令集和編譯器的問題

這些軟體在編寫時也考慮到了這點,所以用兼容的方式是可以運行的,當然,在優化過的程序(與指令集最匹配)中肯定會獲得較好的運行效率。
個人觀點,不夠專業,僅供參考!

I. 程序是通過編譯器編譯才能執行的,那麼編譯器又是怎麼

一般來說,程序語言的編譯有兩個變數,一個是語言本身的語法體系,另外一個是目標機器的指令集體系結構。
對於前者,我們要發明一個新的編程語言的時候,一般是用已有的編程語言寫新語言的編譯器;
對於後者,要進行交叉編譯,即在A指令集的計算機上編譯B指令集計算機要用到的二進製程序。
本質上是一個雞生蛋蛋生雞的問題。
然而還是會繞到最終的問題:最最開始的第一隻雞(蛋(編譯器))哪裡來的?
當然是拿匯編語言寫的啦~
那第一個匯編語言的匯編器是怎麼寫的?當然是直接手寫二進制代碼啊。。。

J. 突破封鎖!國產晶元終於有了自己的指令集

在半導體晶元領域, 指令系統是一切軟硬體生態的起點

以大家最熟悉的ARM和X86為例,它們就分別隸屬於RISC精簡指令集和CISC復雜指令集。

隨著物聯網、5G、AI新興領域的興起,RISC-V和MIPS兩大精簡指令集架構也頻繁出現在我們的視野內。

所謂晶元,其實都是由半導體堆出來的硬體電路,晶體管越多往往代表性能和功能越強。但無論是超級計算機還是智能手環, 它們搭載的處理器都只能識別二進制數據

想讓這些晶元正常運行,處理復雜的應用場景,首先就要教會它們學會類似九九乘法表的「演算法口訣」和「數學公式」, 而這些演算法口訣/公式其實就是所謂的「指令集」

換句話說, 指令集的功能和效率(演算法口訣/公式的類型),在很大程度上就決定了各類晶元的成就和算力的上限

雖然海思麒麟、龍芯、兆芯、海光、紫光、澎湃等國產晶元都在各自領域取得了不俗的成績,但無論是它們,還是其他採用X86、ARM、MIPS、RISC-V、Alpha和Power,選擇封閉、授權還是開源的國產晶元項目,其底層的指令集根基都掌握在別人手裡。

因此, 只有從指令系統的根源上實現自主,才能打破軟體生態發展受制於人的枷鎖

好消息是,日前龍芯中科就正式發布了自主指令系統架構「Loongson Architecture」,簡稱為「龍芯架構」或者「LoongArch」。它包括基礎架構部分,以及向量擴展LSX、高級向量擴展LASX、虛擬化LVZ、二進制翻譯LBT等擴展部分,總共接近2000條指令。同時不包含龍芯此前使用的MIPS指令系統, 並具有完全自主、技術先進、兼容生態三個方面的特點

目前,採用LoongArch的龍芯3A5000處理器晶元已經流片成功,完整操作系統也已穩定運行,它能對多種國際主流指令系統的高效二進制翻譯鏈,並成功演示了運行基於其它主流指令系統的復雜應用程序。

LoongArch對MIPS指令的翻譯效率是100%性能,對ARM指令翻譯的效率是90%性能,對x86的翻譯效率是80%性能。

此外,龍芯中科還在聯合產業鏈夥伴在適當的時間建立開放指令系統聯盟,在聯盟成員內免費共享LoongArch及有關龍芯IP核。

所謂IP核,我們可以理解為ARM旗下的Cortex-A78和Cortex-A55等,後置都是基於ARMv8指令集打造的核心IP架構,並授權給了高通、三星、聯發科等晶元商開發SoC移動平台。

目前,ARM剛剛發布了ARMv9指令集,如果不出意外將在下半年發布的Cortex-A79和Cortex-X2架構就將採用這套指令集。

近10年來32位手機處理器都是基於ARMv7指令集打造,在A75之前的處理器則是基於ARMv8-A設計,隨後都是ARMv8.2-A一統江湖

ARM指令集可以細分為Cortex-A(ARMv-A)、Cortex-R(ARMv-R)和Cortex-M(ARMv-M),分別適用於不同類型的晶元

比如車載晶元使用的就是Cortex-R(ARMv-R)核心IP

總之, 設計出一個純國產的自主指令集只是萬里長征的第一步 ,關鍵是後續要做出懂這個指令集的CPU(已經有了龍芯3A5000),再往後還需要讓和人類交互的「翻譯家」——編譯器懂這個指令集。也就是需要不斷完善軟硬體生態,讓我們熟悉的系統、辦公、 娛樂 和 游戲 程序都能運行在這套指令集打造的晶元之上。如果做不到這一步,國產指令集和相關晶元也只是空中樓閣而已、

作為國人,我們真心希望LoongArch這種國產指令集可以取得成功,今後無論手機、電腦、車載還是其他半導體晶元都能以使用國產指令集為榮,並走向世界。

擴展小知識

那麼,指令集又是如何影響晶元執行效率的?

我們以RISC和CISC,讓它們分別執行「清潔地面」的命令為例,看看其背後的指令邏輯差異。

邏輯上,「清潔地面」的大概思路是先拿起掃帚,掃地;拿起簸箕,用掃帚把垃圾掃進簸箕;放下掃帚和簸箕,潤濕墩布;再用墩布擦地,直至清潔地面完成。

對CISC復雜指令集而言,很容易理解「清潔地面」這套邏輯,下達「清潔地面」命令後,就能按照規則和順序,一步步自動完成。

對於RISC精簡指令集而言,它一下子可理解不了如此復雜的邏輯,必須將復雜的邏輯順序拆分,然後按照一項項簡單的命令去完成復雜的操作。

比如,想讓RISC精簡指令集完成「清潔地面」命令,就必須依次下達「拿起掃帚」、「掃地」、「拿起簸箕」、「把垃圾掃進簸箕」、「放下掃帚和簸箕」、「潤濕墩布」、「墩地」……

看起來CISC復雜指令集方便又強大?沒錯,如果要同時清潔無數房間地面,你只要對著不同的房屋說「清潔地面」、「清潔地面」、「清潔地面」……即可。

而對RISC精簡指令集,你需要對著每個房間都重復一整套復雜的命令,如果下達指令的人嘴巴不夠快(帶寬不夠大),那清潔地面的效率自然受到影響,難以和CISC復雜指令集抗衡。

但是, 現實生活中,並非所有房間的地面都需要一整套的清潔流程,比如你只需要墩地一個步驟。

對RISC精簡指令集而言,你只需對著需要清潔的房間說「墩地」、「墩地」、「墩地」即可。而由於CISC復雜指令集沒有單獨的「墩地」動作,操作起來就要麻煩許多,完成相同的墩地操作會消耗更多資源,翻譯過來就是發熱更高更費電。

這就是RISC和CISC的本質區別。 說不上誰好誰壞,只能說它們所擅長的領域各不相同。

以ARM架構為代表的RISC精簡指令集,最適合針對常用的命令進行優化,賦予它更簡潔和高效的執行環境,對不常用的功能則通過各種精簡指令組合起來完成。

RISC是將復雜度交給了編譯器,犧牲了程序大小和指令帶寬,從而換取了簡單和低功耗的硬體實現。

對以X86架構為代表的CISC復雜指令集,則適合更加復雜的應用環境。

CISC是以增加處理器本身復雜度作為代價,以犧牲功耗為代價去換取更高的性能。不過,X86架構則可通過對新型指令集的支持(如SSE4.1、AVX-512等),在一定程度上提高指定任務的執行效率和降低功耗。

現在晶元領域是RISC攻,CISC守的格局。以蘋果M1為代表的ARM架構RISC指令集晶元正在染指傳統的X86 PC市場,而且大概率會取得成功。雖然以英特爾為代表的X86陣營曾多次試圖反擊Android生態(如早期的Atom晶元),但最終卻都以失敗告終。ARM最新發布的ARMv9指令集,就給了ARM晶元入侵X86 PC大本營更多彈葯,也許用不了多久Windows ARM版PC也將成為一個更加重要的PC品類。

閱讀全文

與自定義指令集編譯器相關的資料

熱點內容
蘋果騰訊管家如何恢復加密相冊 瀏覽:115
手機軟體反編譯教程 瀏覽:858
sqlserver編程語言 瀏覽:650
gpa國際標准演算法 瀏覽:238
伺服器編程語言排行 瀏覽:947
怎麼下載快跑app 瀏覽:966
小紅書app如何保存視頻 瀏覽:170
如何解開系統加密文件 瀏覽:809
linux切換root命令 瀏覽:283
c編譯之後界面一閃而過怎麼辦 瀏覽:880
怎麼看ic卡是否加密 瀏覽:725
lgplc編程講座 瀏覽:809
cnc手動編程銑圓 瀏覽:723
cad中幾種命令的意思 瀏覽:327
oraclelinux安裝目錄 瀏覽:134
安卓系統可以安裝編譯器嗎 瀏覽:571
javajson實體類 瀏覽:691
板加密鋼筋是否取代原鋼筋 瀏覽:67
學習編程的思路 瀏覽:231
app易語言post怎麼學 瀏覽:968