當前位置:首頁 » 編程軟體 » 編譯器對接指令集

編譯器對接指令集

發布時間: 2022-08-23 13:43:35

1. c語言編譯與處理器的指令集有關嗎一定要CISC嗎RISC可不可以

C語言只是用於描述問題和演算法的一種語言,而在實際機器上真實運行的卻是各處理器自己的機器指令。編譯器的工作就是將C語言翻譯為機器指令。對你的問題答復如下:1. C語言與指令系統沒有關系,但是編譯器翻譯的指令與指令系統有關系;2.無論CISC還是RISC,編譯器都可以將C語言翻譯為對應的機器指令。

2. 如何使用SSE指令集編寫應用程序

1、編譯器的自動矢量化

-mfpmath=sse

僅建議在P4和K8以上級別的處理器上使用該選項。

-mmmx

-msse
-msse2
-msse3
-m3dnow
-mssse3(gcc-4.3新增)
-msse4.1(gcc-4.3新增)
-msse4.2(gcc-4.3新增)
-msse4(含4.1和4.2,gcc-4.3新增)
是否使用相應的擴展指令集以及內置函數,需要按照自己的cpu做選擇。

2、使用C/C++類庫

目前,GNU
GCC等大多數編譯器都提供了對SSE指令集的變成支持,允許用戶在C++代碼中不用編寫匯編代碼,就可以直接通過調用庫函數而直接使用SSE指令。

3、使用編譯器的內嵌原語(Intrinsics)

SSE的intrinsics的規則

_mm_<opcode>_<suffix>

其中,<opcode>是指令的類別,像add、sub等等,<suffix>是指令的種類。在SSE浮點運算指令中,只有兩種:ps和ss。

ps:Packed
Single-precision,指對寄存器中的四個單精度浮點同時進行運算。

ss:Scaler
Single-precision,指對寄存器中的DATA0進行運算。

編程時需要包含下表所示的頭文件:

mmintrin.h

MMX

xmmintrin.h

SSE

emmintrin.h

SSE2

pmmintrin.h

SSE3

tmmintrin.h

SSSE3

intrin.h

SSE4A

smmintrin.h

SSE4.1

nmmintrin.h

SSE4.2

mm3dnow.h

3DNOW

說明:如果導入一個高版本的指令集頭文件,那麼一般就不需要在導入低版本的指令了。

4、使用內嵌匯編

指令語法特徵

如:PADDUSW(無符號飽和模式的字組相加)

前綴:P代表成組數據類型

操作指令:如ADD、SUB等

後綴:US為無符號飽和處理

S為有符號飽和處理

B、W、D、Q分別為位元組組、字組、雙字組、四字。

GCC的asm結構

用匯編編寫的程序運行速度快,但開發速度非常慢,效率也很低。如果只是想對關鍵代碼段進行優化,更好的辦法是將匯編指令嵌入到C語言程序中,充分利用高級語言和匯編語言各自的優點。一般來講,在C代碼中嵌入匯編語句要比「純粹」的匯編語言代碼復雜的多,因為需要解決如何分配寄存器,以及如何與C代碼中的變數相結合等問題。內聯匯編能夠靈活操作,而且可以使其輸出通過C變數顯示出來。因為它具有這種能力,所以asm可以用作匯編指令和C程序之間的介面。使用__asm__關鍵字,如果超過一行的指令,每行要加上雙引號,並且後面加上\n\t。如果希望確保編譯器不會在「asm」內部優化指令,可以在「__asm__」後面使用關鍵字「volatile」。

內聯匯編的基本要素

具體語法結構,請看我的一篇博文:《GCC內嵌匯編》文章連接:

http://blog.chinaunix.net/u3/119372/showart_2417924.html

基本要素說明:

限定符

意義

「m」 「v」 「o」

內存單元

「r」

任意寄存器

「q」

寄存器eax,ebx,ecx,edx之一

「i」 「h」

直接操作數

「E」 「F」

浮點數

「g」

任意

「a」 」b」 」c」 」d」

分別表示寄存器eax,ebx,ecx,edx

「S」 」D」

寄存器esi,edi

「I」

常數(0至31)

5、SSE編程注意事項

數據對齊

CPU內存單元以16Byte為邊界,如果數據在運算之前不進行對齊,會是指令運算產生大量延時。

GCC:

float
__attribute__((aligned(16))) a[4]={1.2f,3.5f,1.7f,2.8f};

VC:

__declspec(align(16)) float a[4]={1.2f,3.5f,1.7f,2.8f};

3. 指令集和匯編語言的聯系

1.現代操作系統絕大多數代碼都是用C語言寫的,只有少量直接和硬體打交道的代碼是用匯編語言寫的。把操作系統源代碼轉換成cpu對應的機器碼(指令)那是編譯器和匯編器的事。
2.至於你問「利用指令集嗎?」,我就不懂了。你不運行指令,怎麼操縱cpu呢?你運行的指令當然就是指令集里的指令了,否則cpu也不認識啊,是不是?
3.指令和匯編語言有什麼聯系那是匯編器的事情。匯編語言是一類編程語言,而cpu能執行的只有指令,匯編語言通過匯編器的編譯能生成指令(機器碼)。問這個問題和問「C語言和exe文件有聯系嗎」答案是一樣的。當然,不同的匯編器規定的匯編語言的格式不同。就拿intel80x86來說,
cmp dword ptr [ebp-8],0(microsoft格式)和cmpl $0,-8[%ebp](Gnu格式)
兩句就是按照不同的匯編器規定的格式寫的,但是他們在對應的匯編器上生成的機器碼(指令)是一樣的。也許哪一天我做了一個匯編器,就又有了一種別的格式的匯編語言呢。
4.操作系統的API是操作系統提供給用戶的編程介面,是操作系統的一部分,什麼叫「和指令集有聯系?」。我認為這個問題和2中所問的是同一個問題
以上是我的回答,不知有沒有說清楚……

4. 編譯器與指令集

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

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

5. 編程怎麼支持最新指令集,老的編譯器如TC對新的64位指令集支持嗎

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

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

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

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

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

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

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

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

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

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

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

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

這是因為你所說的這種程序是運行在操作系統上的,它不是直接和硬體通信,真正和硬體通信的是操作系統,或者說是驅動程序,這就是不同的硬體要裝不同驅動的原因,這中間還有一層bios,而windows把許多硬體的驅動都集成在系統里,所以即使你不安裝驅動,系統也可以匹配很多硬體。
而系統提供了統一的應用程序入口,常見的應用程序實際上是運行在一個層層封裝的統一平台上,所以同樣的系統對應用程序來說僅僅要求能運行的話,就基本不用考慮硬體差異了,當然這也不是絕對的。你要是搞嵌入式開發可就沒這么愜意了

10. 為什麼同一款軟體在不同指令集的CPU上運行相同的結果操作系統和編譯器在其中起到了什麼作用

軟體是較高的層次,它告訴cpu具體的運算內容,cpu指令集是更底層的,它接受指令運算並輸出結果,就像不同廠家的電視機,雖然內部電路不一樣,但輸出的圖像時一樣的,
當然由於指令集不同運行效率等細節上還是有差別但不影響結果!
操作系統就是管理各軟體的,及管理軟體運行所需要的軟硬體資源,編譯器是應用程序(軟體)和操作系統的橋梁,操作系統通過編譯器制定軟體要干什麼,才能調用相關資源使其運行起來!

熱點內容
matlab稀疏矩陣存儲 發布:2025-02-06 03:07:54 瀏覽:838
國際服2b2t伺服器地址 發布:2025-02-06 03:06:28 瀏覽:390
c語言輸出b 發布:2025-02-06 03:06:27 瀏覽:31
普通火車wifi密碼多少 發布:2025-02-06 03:04:20 瀏覽:436
可編程監控 發布:2025-02-06 03:03:33 瀏覽:645
c語言取隨機數 發布:2025-02-06 02:46:57 瀏覽:863
uc緩存的視頻卡住 發布:2025-02-06 02:17:05 瀏覽:144
解壓同學介紹 發布:2025-02-06 02:13:10 瀏覽:776
icsftp 發布:2025-02-06 02:12:59 瀏覽:325
ftp跨域上傳文件 發布:2025-02-06 02:09:22 瀏覽:822