新聞中心
在軟件的開(kāi)發(fā)過(guò)程中,性能測(cè)試是必不可少的一項(xiàng)工作。通過(guò)性能測(cè)試可以評(píng)估系統(tǒng)的各項(xiàng)性能指標(biāo),找出瓶頸并進(jìn)行優(yōu)化,提高軟件的可靠性和效率。在Linux系統(tǒng)中,有一種有效的性能測(cè)試工具——rdtsc函數(shù)。本文將介紹如何使用rdtsc函數(shù)進(jìn)行性能測(cè)試。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了向陽(yáng)免費(fèi)建站歡迎大家使用!
一、rdtsc函數(shù)概述
rdtsc是x86架構(gòu)中的一條指令,可以返回CPU自啟動(dòng)以來(lái)的時(shí)鐘周期數(shù)。它的全稱是ReaD Time-Stamp Counter。在Linux系統(tǒng)中,rdtsc函數(shù)可以通過(guò)內(nèi)聯(lián)匯編語(yǔ)言的方式進(jìn)行調(diào)用,如下所示:
“`
static inline uint64_t rdtsc(void)
{
unsigned int lo, hi;
__a__ __volatile__(“rdtsc” : “=a” (lo), “=d” (hi));
return ((uint64_t)hi
}
“`
這段代碼通過(guò)__a__ __volatile__(“rdtsc” : “=a” (lo), “=d” (hi))的方式調(diào)用rdtsc指令,將低32位存入lo中,高32位存入hi中,最后將兩者拼接成一個(gè)64位數(shù)并返回。
使用rdtsc函數(shù)可以獲取程序在CPU上執(zhí)行的時(shí)鐘周期數(shù),進(jìn)而通過(guò)計(jì)算來(lái)評(píng)估程序的性能表現(xiàn)。
二、性能測(cè)試案例
下面通過(guò)一個(gè)簡(jiǎn)單的案例來(lái)演示如何使用rdtsc函數(shù)進(jìn)行性能測(cè)試。假設(shè)我們需要比較兩個(gè)函數(shù)的執(zhí)行時(shí)間性能,這兩個(gè)函數(shù)的功能相同但實(shí)現(xiàn)不同。其中函數(shù)A使用for循環(huán)實(shí)現(xiàn),函數(shù)B使用遞歸實(shí)現(xiàn)。我們需要測(cè)試出這兩個(gè)函數(shù)執(zhí)行10000次所花費(fèi)的時(shí)間,并比較它們的運(yùn)行效率。
首先定義兩個(gè)函數(shù),如下所示:
“`
int functionA() {
int i, sum = 0;
for (i = 0; i
sum += i;
}
return sum;
}
int functionB(int n) {
if (n == 0) {
return 0;
}
return n + functionB(n-1);
}
“`
接下來(lái),我們需要編寫(xiě)性能測(cè)試程序。具體步驟如下:
1. 在程序開(kāi)始和結(jié)束處使用rdtsc函數(shù)獲取時(shí)間戳,計(jì)算出程序執(zhí)行的周期數(shù)。
2. 計(jì)算出函數(shù)執(zhí)行所需的周期數(shù),通過(guò)除以CPU的主頻(如2.93GHz)計(jì)算出函數(shù)執(zhí)行所需的時(shí)間(單位為秒)。
3. 執(zhí)行函數(shù),將性能測(cè)試結(jié)果打印出來(lái)。
完整的性能測(cè)試程序如下所示:
“`
#include
#include
#include
static inline uint64_t rdtsc(void)
{
unsigned int lo, hi;
__a__ __volatile__(“rdtsc” : “=a” (lo), “=d” (hi));
return ((uint64_t)hi
}
int functionA() {
int i, sum = 0;
for (i = 0; i
sum += i;
}
return sum;
}
int functionB(int n) {
if (n == 0) {
return 0;
}
return n + functionB(n-1);
}
int mn() {
uint64_t start, end, cycles;
double time;
int result;
// 測(cè)試函數(shù)A
start = rdtsc();
for (int i = 0; i
result = functionA();
}
end = rdtsc();
cycles = end – start;
time = (double)cycles / 2930000000;
printf(“Function A: %f seconds\n”, time);
// 測(cè)試函數(shù)B
start = rdtsc();
for (int i = 0; i
result = functionB(10000);
}
end = rdtsc();
cycles = end – start;
time = (double)cycles / 2930000000;
printf(“Function B: %f seconds\n”, time);
return 0;
}
“`
在上述代碼中,我們依次測(cè)試了函數(shù)A和函數(shù)B,每個(gè)函數(shù)都執(zhí)行10000次,最后將函數(shù)執(zhí)行所需時(shí)間打印出來(lái)。需要注意的是,這里我們假設(shè)CPU的主頻為2.93GHz,實(shí)際情況中需要按照自己的CPU主頻進(jìn)行計(jì)算。
在運(yùn)行上述程序過(guò)程中,可以得到類似如下的輸出結(jié)果:
“`
Function A: 0.000004 seconds
Function B: 0.000040 seconds
“`
可以看到,通過(guò)rdtsc函數(shù)獲取的時(shí)間戳,我們成功地計(jì)算出了函數(shù)A和函數(shù)B的執(zhí)行時(shí)間??梢园l(fā)現(xiàn),函數(shù)A的執(zhí)行效率比函數(shù)B高出許多,可用于作為性能優(yōu)化的參考。
三、注意事項(xiàng)
在使用rdtsc函數(shù)進(jìn)行性能測(cè)試時(shí),需要注意以下幾點(diǎn):
1. CPU主頻可能會(huì)因?yàn)楣?jié)能降頻等原因發(fā)生變化,需要根據(jù)當(dāng)前的主頻進(jìn)行計(jì)算。
2. 如果在不同的CPU上測(cè)試,可能會(huì)得到不同的結(jié)果。不同的CPU在單位時(shí)間內(nèi)執(zhí)行的指令數(shù)目是不同的,因此可能會(huì)導(dǎo)致測(cè)試結(jié)果的差異。
3. 在使用rdtsc函數(shù)時(shí)需要保證測(cè)試環(huán)境的穩(wěn)定性,避免其他進(jìn)程或線程的干擾。否則會(huì)導(dǎo)致測(cè)試結(jié)果不準(zhǔn)確。
4. 需要在程序開(kāi)始和結(jié)束處都獲取時(shí)間戳,并計(jì)算時(shí)間差,才能得到準(zhǔn)確的執(zhí)行時(shí)間。否則可能會(huì)出現(xiàn)多次執(zhí)行的累計(jì)時(shí)間。
相關(guān)問(wèn)題拓展閱讀:
- SetThreadAffinityMask設(shè)置使用多核CPU的哪個(gè)核心
- 匯編語(yǔ)言(面向機(jī)器的程式設(shè)計(jì)語(yǔ)言)詳細(xì)資料大全
SetThreadAffinityMask設(shè)置使用多核CPU的哪個(gè)核心
你好,CPU是每個(gè)核心都是平均分配的,目前有的老游戲不支持多核心,手動(dòng)是這樣的:你運(yùn)行游戲的時(shí)候可以打開(kāi)任務(wù)管理器,看哪個(gè)核心的負(fù)荷更高,然后找到你的游戲進(jìn)程,右鍵
-關(guān)系設(shè)置,然后把負(fù)荷更高的核心前面的勾去掉,然后重新勾上,在看時(shí)幾個(gè)核心的負(fù)荷就平均了,希望能幫到你!
雖然
rdtsc
廢掉了,性能測(cè)試用的高精度計(jì)時(shí)還是有辦法的
,在
windows
用
queryperformancecounter
和
queryperformancefrequency,linux
下用
posix
的
clock_gettime
函數(shù),以
clock_monotonic
參數(shù)調(diào)用。
queryperformancecounter()
錯(cuò)誤的情況我們也碰見(jiàn)過(guò),用
setthreadaffinitymask()
解決。
匯編語(yǔ)言(面向機(jī)器的程式設(shè)計(jì)語(yǔ)言)詳細(xì)資料大全
匯編語(yǔ)言(assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器或其他可程式器件的低級(jí)語(yǔ)言,亦稱為符號(hào)語(yǔ)言。在匯編語(yǔ)言中,用助記符(Mnemonics)代替機(jī)器指令的操作碼,用地址符號(hào)(Symbol)或標(biāo)號(hào)(Label)代替指令或運(yùn)算元的地址。在不同的設(shè)備中,匯編語(yǔ)言對(duì)應(yīng)著不同的機(jī)器語(yǔ)言指令集,通過(guò)匯編過(guò)程轉(zhuǎn)換成機(jī)器指令。普遍地說(shuō),特定的匯編語(yǔ)言和特定的機(jī)器語(yǔ)言指令集是一一對(duì)應(yīng)的,不同平臺(tái)之間不可直接移植。
許多匯編程式為程式開(kāi)發(fā)、匯編控制、輔助調(diào)試提供了額外的支持機(jī)制。有的匯編語(yǔ)言編程工具經(jīng)常會(huì)提供宏,它們也被稱為宏匯編器。
匯編語(yǔ)言不像其他大多數(shù)的程式設(shè)計(jì)語(yǔ)言一樣被廣泛用于程式設(shè)計(jì)。在今天的實(shí)際套用中,它通常被套用在底層,硬體操作和高要求的程式更佳化的場(chǎng)合。驅(qū)動(dòng)程式、嵌入式作業(yè)系統(tǒng)和實(shí)時(shí)運(yùn)行程式都需要匯編語(yǔ)言。
基本介紹中文名 :匯編語(yǔ)言 外文名 :Assembly Language 學(xué)科 :軟體工程 產(chǎn)生年代 :20世紀(jì)50年代 編譯方式 :匯編 發(fā)展歷程,語(yǔ)言特點(diǎn),總體特點(diǎn),優(yōu)點(diǎn),缺點(diǎn),語(yǔ)言組成,數(shù)據(jù)傳送指令,整數(shù)和邏輯運(yùn)算指令,移位指令,位操作指令,條件設(shè)定指令,控制轉(zhuǎn)移指令,串操作指令,輸入輸出指令,相關(guān)技術(shù),匯編器,編譯環(huán)境,發(fā)展前景,實(shí)際套用,經(jīng)典教材,x86處理器,ARM及單片機(jī), 發(fā)展歷程 說(shuō)到匯編語(yǔ)言的產(chǎn)生,首先要講一下機(jī)器語(yǔ)言。機(jī)器語(yǔ)言是機(jī)器指令的。機(jī)器指令展開(kāi)來(lái)講就是一臺(tái)機(jī)器可以正確執(zhí)行的命令。電子計(jì)算機(jī)的機(jī)器指令是一列二進(jìn)制數(shù)字。計(jì)算機(jī)將之轉(zhuǎn)變?yōu)橐涣懈叩碗娖?,以使?jì)算機(jī)的電子器件受到驅(qū)動(dòng),進(jìn)行運(yùn)算。 上面所說(shuō)的計(jì)算機(jī)指的是可以執(zhí)行機(jī)器指令,進(jìn)行運(yùn)算的機(jī)器。這是早期計(jì)算機(jī)的概念。在我們常用的PC機(jī)中,有一個(gè)晶片來(lái)完成上面所說(shuō)的計(jì)算機(jī)的功能。這個(gè)晶片就是我們常說(shuō)的CPU(Central Processing Unit,中央處理單元)。每一種微處理器,由于硬體設(shè)計(jì)和內(nèi)部結(jié)構(gòu)的不同,就需要用不同的電平脈沖來(lái)控制,使它工作。所以每一種微處理器都有自己的機(jī)器指令集,也就是機(jī)器語(yǔ)言。 早期的程式設(shè)計(jì)均使用機(jī)器語(yǔ)言。程式設(shè)計(jì)師們將用0, 1數(shù)字編成的程式代碼打在紙帶或卡片上,1打孔,0不打孔,再將程式通過(guò)紙帶機(jī)或卡片機(jī)輸入計(jì)算機(jī),進(jìn)行運(yùn)算。這樣的機(jī)器語(yǔ)言由純粹的0和1構(gòu)成,十分復(fù)雜,不方便閱讀和修改,也容易產(chǎn)生錯(cuò)誤。程式設(shè)計(jì)師們很快就發(fā)現(xiàn)了使用機(jī)器語(yǔ)言帶來(lái)的麻煩,它們難于辨別和記憶,給整個(gè)產(chǎn)業(yè)的發(fā)展帶來(lái)了障礙,于是匯編語(yǔ)言產(chǎn)生了。 匯編語(yǔ)言的主體是匯編指令。匯編指令和機(jī)器指令的差別在于指令的表示方法上。匯編指令是機(jī)器指令便于記憶的書(shū)寫(xiě)格式。 操作:暫存器BX的內(nèi)容送到AX中 機(jī)器指令mov ax,bx 匯編指令 此后,程式設(shè)計(jì)師們就用匯編指令編寫(xiě)源程式??墒?,計(jì)算機(jī)能讀懂的只有機(jī)器指令,那么如何讓計(jì)算機(jī)執(zhí)行程式設(shè)計(jì)師用匯編指令編寫(xiě)的程式呢?這時(shí),就需要有一個(gè)能夠?qū)R編指令轉(zhuǎn)換成機(jī)器指令的翻譯程式,這樣的程式我們稱其為編譯器。程式設(shè)計(jì)師用匯編語(yǔ)言寫(xiě)出源程式,再用匯編編譯器將其編譯為機(jī)器碼,由計(jì)算機(jī)最終執(zhí)行。
工作過(guò)程
語(yǔ)言特點(diǎn) 匯編語(yǔ)言是直接面向處理器(Processor)的程式設(shè)計(jì)語(yǔ)言。處理器是在指令的控制下工作的,處理器可以識(shí)別的每一條指令稱為機(jī)器指令。每一種處理器都有自己可以識(shí)別的一整套指令,稱為指令集。處理器執(zhí)行指令時(shí),根據(jù)不同的指令采取不同的動(dòng)作,完成不同的功能,既可以改變自己內(nèi)部的工作狀態(tài),也能控制其它外圍電路的工作狀態(tài)。 匯編語(yǔ)言的另一個(gè)特點(diǎn)就是它所操作的對(duì)象不是具體的數(shù)據(jù),而是暫存器或者存儲(chǔ)器,也就是說(shuō)它是直接和暫存器和存儲(chǔ)器打交道,這也是為什么匯編語(yǔ)言的執(zhí)行速度要比其它語(yǔ)言快,但同時(shí)這也使編程更加復(fù)雜,因?yàn)榧热粩?shù)據(jù)是存放在暫存器或存儲(chǔ)器中,那么必然就存在著定址方式,也就是用什么方法找到所需要的數(shù)據(jù)。例如上面的例子,我們就不能像高級(jí)語(yǔ)言一樣直接使用數(shù)據(jù),而是先要從相應(yīng)的暫存器AX、BX 中把數(shù)據(jù)取出。這也就增加了編程的復(fù)雜性,因?yàn)樵诟呒?jí)語(yǔ)言中定址這部分工作是由編譯系統(tǒng)來(lái)完成的,而在匯編語(yǔ)言中是由程式設(shè)計(jì)師自己來(lái)完成的,這無(wú)異增加了編程的復(fù)雜程度,降低了程式的可讀性。 再者,匯編語(yǔ)言指令是機(jī)器指令的一種符號(hào)表示,而不同類型的CPU 有不同的機(jī)器指令系統(tǒng),也就有不同的匯編語(yǔ)言,所以,匯編語(yǔ)言程式與機(jī)器有著密切的關(guān)系。所以,除了同系列、不同型號(hào)CPU 之間的匯編語(yǔ)言程式有一定程度的可移植性之外,其它不同類型(如:小型機(jī)和微機(jī)等)CPU 之間的匯編語(yǔ)言程式是無(wú)法移植的,也就是說(shuō),匯編語(yǔ)言程式的通用性和可移植性要比高級(jí)語(yǔ)言程式低。 正因?yàn)閰R編語(yǔ)言有“與機(jī)器相關(guān)性”的特性,程式設(shè)計(jì)師用匯編語(yǔ)言編寫(xiě)程式時(shí),可充分對(duì)機(jī)器內(nèi)部的各種資源進(jìn)行合理的安排,讓它們始終處于更佳的使用狀態(tài)。這樣編寫(xiě)出來(lái)的程式執(zhí)行代碼短、執(zhí)行速度快。匯編語(yǔ)言是各種程式語(yǔ)言中與硬體關(guān)系最密切、最直接的一種,在時(shí)間和空間的效率上也更高的一種,它是高等院校計(jì)算機(jī)套用技術(shù)必修的專業(yè)課程之一,對(duì)于訓(xùn)練學(xué)生掌握程式設(shè)計(jì)技術(shù),熟悉上機(jī)操作和程式調(diào)試技術(shù)有重要作用 總體特點(diǎn)
1.機(jī)器相關(guān)性
這是一種面向機(jī)器的低級(jí)語(yǔ)言,通常是為特定的計(jì)算機(jī)或系列計(jì)算機(jī)專門(mén)設(shè)計(jì)的。因?yàn)槭菣C(jī)器指令的符號(hào)化表示,故不同的機(jī)器就有不同的匯編語(yǔ)言。使用匯編語(yǔ)言能面向機(jī)器并較好地發(fā)揮機(jī)器的特性,得到質(zhì)量較高的程式。
2.高速度和高效率
匯編語(yǔ)言保持了機(jī)器語(yǔ)言的優(yōu)點(diǎn),具有直接和簡(jiǎn)捷的特點(diǎn),可有效地訪問(wèn)、控制計(jì)算機(jī)的各種硬體設(shè)備,如磁碟、存儲(chǔ)器、CPU、I/O連線埠等,且占用記憶體少,執(zhí)行速度快,是高效的程式設(shè)計(jì)語(yǔ)言。
3.編寫(xiě)和調(diào)試的復(fù)雜性
由于是直接控制硬體,且簡(jiǎn)單的任務(wù)也需要很多匯編語(yǔ)言語(yǔ)句,因此在進(jìn)行程式設(shè)計(jì)時(shí)必須面面俱到,需要考慮到一切可能的問(wèn)題,合理調(diào)配和使用各種軟、硬體資源。這樣,就不可避免地加重了程式設(shè)計(jì)師的負(fù)擔(dān)。與此相同,在程式調(diào)試時(shí),一旦程式的運(yùn)行出了問(wèn)題,就很難發(fā)現(xiàn)。 優(yōu)點(diǎn) 1、因?yàn)橛脜R編語(yǔ)言設(shè)計(jì)的程式最終被轉(zhuǎn)換成機(jī)器指令,故能夠保持機(jī)器語(yǔ)言的一致性,直接、簡(jiǎn)捷,并能像機(jī)器指令一樣訪問(wèn)、控制計(jì)算機(jī)的各種硬體設(shè)備,如磁碟、存儲(chǔ)器、CPU、I/O連線埠等。使用匯編語(yǔ)言,可以訪問(wèn)所有能夠被訪問(wèn)的軟、硬體資源。 2、目標(biāo)代碼簡(jiǎn)短,占用記憶體少,執(zhí)行速度快,是高效的程式設(shè)計(jì)語(yǔ)言,經(jīng)常與高級(jí)語(yǔ)言配合使用,以改善程式的執(zhí)行速度和效率,彌補(bǔ)高級(jí)語(yǔ)言在硬體控制方面的不足,套用十分廣泛。 缺點(diǎn) 1、匯編語(yǔ)言是面向機(jī)器的,處于整個(gè)計(jì)算機(jī)語(yǔ)言層次結(jié)構(gòu)的底層,故被視為一種低級(jí)語(yǔ)言,通常是為特定的計(jì)算機(jī)或系列計(jì)算機(jī)專門(mén)設(shè)計(jì)的。不同的處理器有不同的匯編語(yǔ)言語(yǔ)法和編譯器,編譯的程式無(wú)法在不同的處理器上執(zhí)行,缺乏可移植性; 2、難于從匯編語(yǔ)言代碼上理解程式設(shè)計(jì)意圖,可維護(hù)性差,即使是完成簡(jiǎn)單的工作也需要大量的匯編語(yǔ)言代碼,很容易產(chǎn)生bug,難于調(diào)試; 3、使用匯編語(yǔ)言必須對(duì)某種處理器非常了解,而且只能針對(duì)特定的體系結(jié)構(gòu)和處理器進(jìn)行更佳化,開(kāi)發(fā)效率很低,周期長(zhǎng)且單調(diào)。 語(yǔ)言組成 數(shù)據(jù)傳送指令 這部分指令包括通用數(shù)據(jù)傳送指令MOV、條件傳送指令CMOV 、堆疊操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交換指令XCHG/XLAT/BSWAP、地址或段描述符選擇子傳送指令LEA/LDS/LES/LFS/LGS/LSS等。注意,CMOV不是一條具體的指令,而是一個(gè)指令簇,包括大量的指令,用于根據(jù)EFLAGS暫存器的某些位狀態(tài)來(lái)決定是否執(zhí)行指定的傳送操作。 整數(shù)和邏輯運(yùn)算指令 這部分指令用于執(zhí)行算術(shù)和邏輯運(yùn)算,包括加法指令A(yù)DD/ADC、減法指令SUB/SBB、加一指令I(lǐng)NC、減一指令DEC、比較操作指令CMP、乘法指令MUL/IMUL、除法指令DIV/IDIV、符號(hào)擴(kuò)展指令CBW/CWDE/CDQE、十進(jìn)制調(diào)整指令DAA/DAS/AAA/AAS、邏輯運(yùn)算指令NOT/AND/OR/XOR/TEST等。 移位指令 這部分指令用于將暫存器或記憶體運(yùn)算元移動(dòng)指定的次數(shù)。包括邏輯左移指令SHL、邏輯右移指令SHR、算術(shù)左移指令SAL、算術(shù)右移指令SAR、循環(huán)左移指令ROL、循環(huán)右移指令ROR等。 位操作指令 這部分指令包括位測(cè)試指令、位測(cè)試并置位指令S、位測(cè)試并復(fù)位指令R、位測(cè)試并取反指令C、位向前掃描指令BSF、位向后掃描指令BSR等。 條件設(shè)定指令 這不是一條具體的指令,而是一個(gè)指令簇,包括大約30條指令,用于根據(jù)EFLAGS暫存器的某些位狀態(tài)來(lái)設(shè)定一個(gè)8位的暫存器或者記憶體運(yùn)算元。比如SETE/SETNE/SETGE等等。 控制轉(zhuǎn)移指令 這部分包括無(wú)條件轉(zhuǎn)移指令JMP、條件轉(zhuǎn)移指令J /JCXZ、循環(huán)指令LOOP/LOOPE/LOOPNE、過(guò)程調(diào)用指令CALL、子過(guò)程返回指令RET、中斷指令I(lǐng)NTn、INT3、INTO、IRET等。注意,J 是一個(gè)指令簇,包含了很多指令,用于根據(jù)EFLAGS暫存器的某些位狀態(tài)來(lái)決定是否轉(zhuǎn)移;INT n是軟中斷指令,n可以是0到255之間的數(shù),用于指示中斷向量號(hào)。 串操作指令 這部分指令用于對(duì)數(shù)據(jù)串進(jìn)行操作,包括串傳送指令MOVS、串比較指令CMPS、串掃描指令SCANS、串載入指令LODS、串保存指令STOS,這些指令可以有選擇地使用REP/REPE/REPZ/REPNE和REPNZ的前綴以連續(xù)操作。 輸入輸出指令 這部分指令用于同外圍設(shè)備交換數(shù)據(jù),包括連線埠輸入指令I(lǐng)N/INS、連線埠輸出指令OUT/OUTS。
高級(jí)語(yǔ)言輔助指令
這部分指令為高級(jí)語(yǔ)言的編譯器提供方便,包括創(chuàng)建棧幀的指令ENTER和釋放棧幀的指令LEAVE。
控制和特權(quán)指令
這部分包括無(wú)操作指令NOP、停機(jī)指令HLT、等待指令WAIT/MWAIT、換碼指令ESC、匯流排封鎖指令LOCK、記憶體范圍檢查指令BOUND、全局描述符表操作指令LGDT/SGDT、中斷描述符表操作指令LIDT/SIDT、局部描述符表操作指令LLDT/SLDT、描述符段界限值載入指令LSR、描述符訪問(wèn)權(quán)讀取指令LAR、任務(wù)暫存器操作指令LTR/STR、請(qǐng)求特權(quán)級(jí)調(diào)整指令A(yù)RPL、任務(wù)切換標(biāo)志清零指令CLTS、控制暫存器和調(diào)試暫存器數(shù)據(jù)傳送指令MOV、高速快取控制指令I(lǐng)NVD/WBINVD/INVLPG、型號(hào)相關(guān)暫存器讀取和寫(xiě)入指令RDMSR/WRMSR、處理器信息獲取指令CPUID、時(shí)間戳讀取指令RDTSC等。
浮點(diǎn)和多媒體指令
這部分指令用于加速浮點(diǎn)數(shù)據(jù)的運(yùn)算,以及用于加速多媒體數(shù)據(jù)處理的單指令多數(shù)據(jù)(SIMD及其擴(kuò)展SSEx)指令。這部分指令數(shù)據(jù)非常龐大,無(wú)法一一列舉,請(qǐng)自行參考INTEL手冊(cè)。
虛擬機(jī)擴(kuò)展指令
這部分指令包括INVEPT/INVVPID/VMCALL/VMCLEAR/VMLAUNCH/VMRESUME/VMPTRLD/VMPTRST/VMREAD/VMWRITE/VMXOFF/VMON等。 相關(guān)技術(shù) 匯編器 典型的現(xiàn)代
匯編器
(assembler)建造目標(biāo)代碼,由解譯組語(yǔ)指令集的易記碼(mnemonics)到操作碼(OpCode),并解析符號(hào)名稱(symbolic names)成為存儲(chǔ)器地址以及其它的實(shí)體。使用符號(hào)參考是匯編器的一個(gè)重要特征,它可以節(jié)省修改程式后人工轉(zhuǎn)址的乏味耗時(shí)計(jì)算?;揪褪前褭C(jī)器碼變成一些字母而已,編譯的時(shí)候再把輸入的指令字母替換成為晦澀難懂機(jī)器碼。 編譯環(huán)境 用匯編語(yǔ)言等非機(jī)器語(yǔ)言書(shū)寫(xiě)好的符號(hào)程式稱為源程式,匯編語(yǔ)言編譯器的作用是將源程式翻譯成目標(biāo)程式。目標(biāo)程式是機(jī)器語(yǔ)言程式,當(dāng)它被安置在記憶體的預(yù)定位置上后,就能被計(jì)算機(jī)的CPU處理和執(zhí)行。 匯編的調(diào)試環(huán)境總的來(lái)說(shuō)比較少,也很少有非常好的編譯器。編譯器的選擇依賴于目標(biāo)處理器的類型和具體的系統(tǒng)平臺(tái)。一般來(lái)說(shuō),功能良好的編譯器用起來(lái)應(yīng)當(dāng)非常方便,比如,應(yīng)當(dāng)可以自動(dòng)整理格式、語(yǔ)法高亮顯示,集編譯、連結(jié)和調(diào)試為一體,方便實(shí)用。 對(duì)于廣泛使用的個(gè)人計(jì)算機(jī)來(lái)說(shuō),可以自由選擇的匯編語(yǔ)言編譯器有MA、NA、TA、GAS、FA、RADA等,但大都不具備調(diào)試功能。如果是為了學(xué)習(xí)匯編語(yǔ)言,輕松匯編因?yàn)閾碛幸粋€(gè)完善的集成環(huán)境,是一款非常適合初學(xué)者的匯編編譯器。 發(fā)展前景 匯編語(yǔ)言是機(jī)器語(yǔ)言的助記符,相對(duì)于比枯燥的機(jī)器代碼易于讀寫(xiě)、易于調(diào)試和修改,同時(shí)優(yōu)秀的匯編語(yǔ)言設(shè)計(jì)者經(jīng)過(guò)巧妙的設(shè)計(jì),使得匯編語(yǔ)言匯編后的代碼比高級(jí)語(yǔ)言執(zhí)行速度更快,占記憶體空間少等優(yōu)點(diǎn),但匯編語(yǔ)言的運(yùn)行速度和空間占用是針對(duì)高級(jí)語(yǔ)言并且需要巧妙設(shè)計(jì),而且部分高級(jí)語(yǔ)言在編譯后代碼執(zhí)行效率同樣很高,所以此優(yōu)點(diǎn)慢慢弱化。而且在編寫(xiě)復(fù)雜程式時(shí)具有明顯的局限性,匯編語(yǔ)言依賴于具體的機(jī)型,不能通用,也不能在不同機(jī)型之間移植。常說(shuō)匯編語(yǔ)言是低級(jí)語(yǔ)言,并不是說(shuō)匯編語(yǔ)言要被棄之,相反,匯編語(yǔ)言仍然是計(jì)算機(jī)(或微機(jī))底層設(shè)計(jì)程式設(shè)計(jì)師必須了解的語(yǔ)言,在某些行業(yè)與領(lǐng)域,匯編是必不可少的,非它不可適用。只是,現(xiàn)在計(jì)算機(jī)更大的領(lǐng)域?yàn)镮T軟體,也是我們常說(shuō)的計(jì)算機(jī)套用軟體編程,在熟練的程式設(shè)計(jì)師手里,使用匯編語(yǔ)言編寫(xiě)的程式,運(yùn)行效率與性能比其它語(yǔ)言寫(xiě)的程式相對(duì)提高,但是代價(jià)是需要更長(zhǎng)的時(shí)間來(lái)更佳化,如果對(duì)計(jì)算機(jī)原理及編程基礎(chǔ)不扎實(shí),反而增加其開(kāi)發(fā)難度,實(shí)在是得不償失,對(duì)比2023年前后的軟體開(kāi)發(fā),已經(jīng)是市場(chǎng)化的軟體行業(yè),加上高級(jí)語(yǔ)言的優(yōu)秀與跨平臺(tái),一個(gè)公司不可以讓一個(gè)團(tuán)隊(duì)使用匯編語(yǔ)言來(lái)編寫(xiě)所有的東西,花上幾倍甚至幾十倍的時(shí)間,不如使用其它語(yǔ)言來(lái)完成,只要最終結(jié)果不比匯編語(yǔ)言編寫(xiě)的差太多,就能搶先一步完成,這是市場(chǎng)經(jīng)濟(jì)下的必然結(jié)果。 但是,迄今為止,還沒(méi)有程式設(shè)計(jì)師敢斷定匯編語(yǔ)言是不需要學(xué)的,同時(shí),匯編語(yǔ)言(Assembly Language)是面向機(jī)器的程式設(shè)計(jì)語(yǔ)言,設(shè)計(jì)精湛的匯編程式設(shè)計(jì)師,部分已經(jīng)脫離軟體開(kāi)發(fā),擠身于工業(yè)電子編程中。對(duì)于功能相對(duì)小巧但硬體對(duì)語(yǔ)言設(shè)計(jì)要求苛刻的行業(yè),如4位單片機(jī),由于其容量及運(yùn)算,此行業(yè)的電子工程師一般負(fù)責(zé)從開(kāi)發(fā)設(shè)計(jì)電路及軟體控制,主要開(kāi)發(fā)語(yǔ)言就是匯編,c語(yǔ)言使用只占極少部分,而電子開(kāi)發(fā)工程師是千金難求,在一些工業(yè)公司,一個(gè)核心的電子工程師比其它任何職員待遇都高,對(duì)比起來(lái),一般電子工程師待遇是程式設(shè)計(jì)師的十倍以上。這種情況是因?yàn)?1世紀(jì)以來(lái),學(xué)習(xí)匯編的人雖然也不少,但是真正能學(xué)到精通的卻不多,它相對(duì)于高級(jí)語(yǔ)言難學(xué),難用,適用范圍小,雖然簡(jiǎn)單,但是過(guò)于靈活,學(xué)習(xí)過(guò)高級(jí)語(yǔ)言的人去學(xué)習(xí)匯編比一開(kāi)始學(xué)匯編的人難得多,但是學(xué)過(guò)匯編的人學(xué)習(xí)高級(jí)語(yǔ)言卻很容易,簡(jiǎn)從繁易,繁從簡(jiǎn)難。對(duì)于一個(gè)全面了解微機(jī)原理的程式設(shè)計(jì)師,匯編語(yǔ)言是必修語(yǔ)言。 實(shí)際套用 隨著現(xiàn)代軟體系統(tǒng)越來(lái)越龐大復(fù)雜,大量經(jīng)過(guò)了封裝的高級(jí)語(yǔ)言如C/C++,Pascal/Object Pascal也應(yīng)運(yùn)而生。這些新的語(yǔ)言使得程式設(shè)計(jì)師在開(kāi)發(fā)過(guò)程中能夠更簡(jiǎn)單,更有效率,使軟體開(kāi)發(fā)人員得以應(yīng)付快速的軟體開(kāi)發(fā)的要求。而匯編語(yǔ)言由于其復(fù)雜性使得其適用領(lǐng)域逐步減小。但這并不意味著匯編已無(wú)用武之地。由于匯編更接近機(jī)器語(yǔ)言,能夠直接對(duì)硬體進(jìn)行操作,生成的程式與其他的語(yǔ)言相比具有更高的運(yùn)行速度,占用更小的記憶體,因此在一些對(duì)于時(shí)效性要求很高的程式、許多大型程式的核心模組以及工業(yè)控制方面大量套用。 此外,雖然有眾多程式語(yǔ)言可供選擇,但匯編依然是各大學(xué)計(jì)算機(jī)科學(xué)類專業(yè)學(xué)生的必修課,以讓學(xué)生深入了解計(jì)算機(jī)的運(yùn)行原理。 歷史上,匯編語(yǔ)言曾經(jīng)是非常流行的程式設(shè)計(jì)語(yǔ)言之一。隨著軟體規(guī)模的增長(zhǎng),以及隨之而來(lái)的對(duì)軟體開(kāi)發(fā)進(jìn)度和效率的要求,高級(jí)語(yǔ)言逐漸取代了匯編語(yǔ)言。但即便如此,高級(jí)語(yǔ)言也不可能完全替代匯編語(yǔ)言的作用。就拿Linux核心來(lái)講,雖然絕大部分代碼是用C語(yǔ)言編寫(xiě)的,但仍然不可避免地在某些關(guān)鍵地方使用了匯編代碼。由于這部分代碼與硬體的關(guān)系非常密切,即使是C語(yǔ)言也會(huì)顯得力不從心,而匯編語(yǔ)言則能夠很好揚(yáng)長(zhǎng)避短,更大限度地發(fā)揮硬體的性能。 首先,匯編語(yǔ)言的大部分語(yǔ)句直接對(duì)應(yīng)著機(jī)器指令,執(zhí)行速度快,效率高,代碼體積小,在那些存儲(chǔ)器容量有限,但需要快速和實(shí)時(shí)回響的場(chǎng)合比較有用,比如儀器儀表和工業(yè)控制設(shè)備中。 其次,在系統(tǒng)程式的核心部分,以及與系統(tǒng)硬體頻繁打交道的部分,可以使用匯編語(yǔ)言。比如作業(yè)系統(tǒng)的核心程式段、I/O接口電路的初始化程式、外部設(shè)備的低層驅(qū)動(dòng)程式,以及頻繁調(diào)用的子程式、動(dòng)態(tài)連線庫(kù)、某些高級(jí)繪圖程式、視頻游戲程式等等。 再次,匯編語(yǔ)言可以用于軟體的加密和解密、計(jì)算機(jī)病毒的分析和防治,以及程式的調(diào)試和錯(cuò)誤分析等各個(gè)方面。 最后,通過(guò)學(xué)習(xí)匯編語(yǔ)言,能夠加深對(duì)計(jì)算機(jī)原理和作業(yè)系統(tǒng)等課程的理解。通過(guò)學(xué)習(xí)和使用匯編語(yǔ)言,能夠感知、體會(huì)和理解機(jī)器的邏輯功能,向上為理解各種軟體系統(tǒng)的原理,打下技術(shù)理論基礎(chǔ);向下為掌握硬體系統(tǒng)的原理,打下實(shí)踐套用基礎(chǔ)。 經(jīng)典教材 匯編語(yǔ)言教材很多,各種處理器都有涉及,粗略統(tǒng)計(jì)不下百種。在這么多的教材里,用得較多的可以分類列舉如下: x86處理器 1.《x86匯編語(yǔ)言:從實(shí)模式到保護(hù)模式》,李忠著,電子工業(yè)出版社,2023-1 。 基于INTEL x86處理器、NA編譯器和BOCHS虛擬機(jī)。匯編語(yǔ)言就是處理器的語(yǔ)言,從這個(gè)意義上來(lái)說(shuō),既然學(xué)習(xí)匯編語(yǔ)言,就必須直接面向硬體編程,而不是使用莫名其妙的DOS中斷和API調(diào)用。這是一本有趣的書(shū),它沒(méi)有把篇幅花在計(jì)算一些枯燥的數(shù)學(xué)題上。相反,它教你如何直接控制硬體,在不借助于BIOS、DOS、Windows、Linux或者任何其他軟體支持的情況下來(lái)顯示字元、讀取硬碟數(shù)據(jù)、控制其他硬體等。 我們知道,32位和64位是主流,實(shí)模式和DOS作業(yè)系統(tǒng)已經(jīng)成為歷史,Linux和Windows都工作在保護(hù)模式下。這本書(shū)從實(shí)模式講到32位保護(hù)模式,尤其以32位保護(hù)模式為重點(diǎn),閱讀本書(shū),對(duì)理解現(xiàn)代計(jì)算機(jī)和現(xiàn)代作業(yè)系統(tǒng)的工作原理有非常大的幫助作用。 2.《匯編語(yǔ)言》(第2版),王爽 著,清華大學(xué)出版社,基于INTEL 8086處理器、MA編譯器,以及DOS平臺(tái)的匯編教材,完全以8086處理器的實(shí)模式為主,不涉及常用的32位和64位模式,但因?yàn)橥ㄋ滓锥x者反映很好。 3.《80X86匯編語(yǔ)言程式設(shè)計(jì)教程》,楊季文等 編著,清華大學(xué)出版社,基于INTEL x86處理器、MA和TA編譯器,包含16位實(shí)模式和32位保護(hù)模式的內(nèi)容,而且對(duì)后者講述較為詳細(xì)。 4.《32位匯編語(yǔ)言程式設(shè)計(jì)》,錢曉捷 編著,機(jī)械工業(yè)出版社,基于INTEL x86處理器、MA編譯器,以及WINDOWS平臺(tái)的匯編教材。 5.《16/32位微機(jī)原理匯編語(yǔ)言及接口技術(shù)》,錢曉捷,陳濤編著,機(jī)械工業(yè)出版社,基于INTEL x86處理器,論述16位微型計(jì)算機(jī)的基本原理、匯編語(yǔ)言和接口技術(shù),并引出32位微機(jī)系統(tǒng)相關(guān)技術(shù)。 6.《Intel匯編語(yǔ)言程式設(shè)計(jì)》(第五版),(美)歐文 著,電子工業(yè)出版社,基于INTEL x86處理器、MA編譯器,以及DOS/WINDOWS平臺(tái)的匯編教材,既有16位實(shí)模式的內(nèi)容,也有32位保護(hù)模式的內(nèi)容。 7.《匯編語(yǔ)言的編程藝術(shù)》(第2版),(美)海德 著,清華大學(xué)出版社,基于INTEL x86處理器,使用了作者自制的高級(jí)語(yǔ)言匯編器(High Level Assembler,HLA)作為教學(xué)工具,以部分地獲得高級(jí)語(yǔ)言的優(yōu)勢(shì)和功能。 8.《x86 PC匯編語(yǔ)言、設(shè)計(jì)與接口》(第五版),(美)馬茲迪,考西著,電子工業(yè)出版社,基于INTEL x86處理器,既講了16位實(shí)模式的內(nèi)容,也講了32位保護(hù)模式的內(nèi)容,對(duì)64位也有所介紹。 ARM及單片機(jī) 1.《匯編語(yǔ)言程式設(shè)計(jì)–基于ARM體系結(jié)構(gòu)》(第2版),文全剛等主編,北京航空航天大學(xué)出版社,基于ARM體系結(jié)構(gòu)的處理器,是學(xué)習(xí)嵌入式技術(shù)的入門(mén)教材。 2.《零基礎(chǔ)學(xué)AVR單片機(jī)》,徐益民等編著,機(jī)械工業(yè)出版社,單片機(jī)概述、avr單片機(jī)的開(kāi)發(fā)工具、avr單片機(jī)c語(yǔ)言、atmega16單片機(jī)基本結(jié)構(gòu)、avr的指令系統(tǒng)與匯編系統(tǒng)等。 3.《基于Multisim10的51單片機(jī)仿真實(shí)戰(zhàn)教程》,聶典,丁偉主編,電子工業(yè)出版社,闡述了NI Multisim 10在單片機(jī)仿真中的各項(xiàng)主要功能。 4.《PIC18微控制器:體系結(jié)構(gòu)、編程與接口設(shè)計(jì)》,(美)貝里著,清華大學(xué)出版社,微控制器廣泛套用于汽車、家電、工業(yè)控制、醫(yī)療設(shè)備等眾多領(lǐng)域。本書(shū)以Microchip公司的PIC18系列微控制器為例,全面講解如何使用C語(yǔ)言和匯編語(yǔ)言對(duì)微控制器進(jìn)行編程。 5.《CASL匯編語(yǔ)言程式設(shè)計(jì)》,趙立輝編著,中國(guó)電力出版社,CASL匯編語(yǔ)言是中國(guó)計(jì)算機(jī)軟體專業(yè)技術(shù)資格和水平考試高級(jí)程式設(shè)計(jì)師級(jí)的必考內(nèi)容。本書(shū)是講述CASL匯編語(yǔ)言程式設(shè)計(jì)的專著。
關(guān)于linux rdtsc的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)頁(yè)名稱:如何使用Linux上的rdtsc函數(shù)進(jìn)行性能測(cè)試(linuxrdtsc)
鏈接地址:http://m.fisionsoft.com.cn/article/djohigi.html


咨詢
建站咨詢
