国产精品无码一区二区三区A片_无码狠狠躁久久久久久久91_国产精品久久久久久久_国产99九九久久无码熟妇_国产人妻精品久久久久野外_久久夜色精品国产欧美乱极品_91精品国产色综合久久不卡98口_精品人妻系列无码人妻免费视频

技術熱線: 4007-888-234
設計開發(fā)

專注差異化嵌入式產(chǎn)品解決方案 給智能產(chǎn)品定制注入靈魂給予生命

開發(fā)工具

提供開發(fā)工具、應用測試 完善的開發(fā)代碼案例庫分享

技術支持

從全面的產(chǎn)品導入到強大技術支援服務 全程貼心伴隨服務,創(chuàng)造無限潛能!

新品推廣

提供新的芯片及解決方案,提升客戶產(chǎn)品競爭力

新聞中心

提供最新的單片機資訊,行業(yè)消息以及公司新聞動態(tài)

了解匯編語言和C語言:單片機開發(fā)為何要懂匯編

更新時間: 2019-10-19
閱讀量:4556

當前,大多數(shù)單片機編程都是使用C語言完成的,如果不是C,則是另一種高級語言,如C++。但真實情況并非總是如此,在使用單片機的早期,所有代碼都是用匯編語言編寫的,在那時這是唯一的選擇。記得在那時候,內(nèi)存是極其有限的,因此必須非常嚴格地控制它的使用。而且除此之外,沒有可用的高級語言工具。

QQ截圖20191019153849.png

隨著計算機技術的發(fā)展,程序開發(fā)語言變得更多,單片機的功能也變得越來越強大(16位、32位,再到64位),價格變得更便宜,集成度更密集,應用程序也變得更復雜。

那么,為什么現(xiàn)在還需要學會匯編語言?單片機開發(fā)人員應具有閱讀匯編語言的能力,這其中有兩個原因。

首先,單片機中的代碼效率幾乎總是至關重要的?,F(xiàn)代編譯器通常在優(yōu)化代碼方面做得非常出色。但是,了解編譯器工作原理很重要。否則,開發(fā)人員在做調(diào)試時可能會造成混亂。

此外,編譯器也可能不夠完美的運行,比如用C語言編寫代碼時,不是以最清晰的方式編寫的,開發(fā)人員需要能夠理解出了什么問題。檢查編譯器生成的代碼應該是開發(fā)過程中的日常工作,這提供了機會來確保編譯器的輸出確實能夠達到程序員的預期。

有些開發(fā)人員需要能夠讀懂匯編的第二個原因是,在做“硬件開發(fā)”進行編程時,這是必不可少的。如今,驅(qū)動程序不一定是100%匯編的,但是某些匯編語言的內(nèi)容幾乎是不可避免的。為了最有效地使用驅(qū)動程序并進行故障排除,必須能夠詳細了解驅(qū)動程序在做什么。

為什么要學會編寫匯編語言

編寫匯編語言呢?如今,用匯編語言編寫整個應用程序是非常少見的,至少大多數(shù)代碼都是用C編寫的。因此,C編程技能是單片機開發(fā)的關鍵要求。但是,一些開發(fā)人員需要掌握匯編語言編程。當然,此技能是針對特定處理器的。但是,如果設計人員已經(jīng)掌握了一個CPU的匯編語言,則遷移到另一個CPU并不會太有挑戰(zhàn)性。

編寫匯編語言有兩個原因。第一個也是最重要的原因是實現(xiàn)一些用C語言無法表達的功能。一個簡單的例子:禁用中斷功能。這可以通過編寫匯編語言子例程并像調(diào)用C函數(shù)一樣調(diào)用它來實現(xiàn)。為此,必須知道正在使用的C編譯器的調(diào)用/返回協(xié)議,但這通常很容易弄清楚。例如,你可以只看編譯器生成的代碼。

實現(xiàn)匯編語言代碼的另一種方法是,通常使用asm擴展關鍵字將其內(nèi)聯(lián)插入C代碼中。當需要單個或僅幾個匯編程序指令時,這特別有意義,因為消除了調(diào)用/返回開銷。此擴展的實現(xiàn)因編譯器而異,但通常,asm語句采用以下形式:

asm(" trap #0");

通常,唯一需要用C語言表示的功能的地方是啟動代碼和設備驅(qū)動程序。嵌入式軟件應用程序開發(fā)的這一部分涉及少量開發(fā)人員。因此,如上所述,對匯編編寫技能的需求僅限于一組選定的工程師。

一些開發(fā)人員認為,他們需要知道如何編寫匯編語言,才能以比編譯器“更有效”的方式實現(xiàn)代碼。在極少數(shù)情況下,這可能是正確的。因為,現(xiàn)在大多數(shù)現(xiàn)代編譯器在優(yōu)化和生成高效代碼方面,已經(jīng)做得非常出色。

這是一個例子:

#define ARRAYSIZE 4
char aaa[ARRAYSIZE];
int main()
{
    int i;
    for (i=0; i<ARRAYSIZE; i++)
    aaa[i] = 0;
}

這看起來像一個簡單的循環(huán),將數(shù)組的每個元素設置為零。如果你在激活了合理數(shù)量的優(yōu)化的情況下進行編譯并嘗試調(diào)試代碼,你將得到一個奇怪的結果:它將直接跳入循環(huán)(即,表現(xiàn)得好像根本沒有循環(huán))。這是因為編譯器確定將零移動32位到數(shù)組中比循環(huán)更有效。

結果代碼如下所示:

mov r3, #0
ldr r2, .L3
mov r0, r3
str r3, [r2]
bx lr
.L3:
.word .LANCHOR0

調(diào)整ARRAYSIZE的值會產(chǎn)生一些有趣的結果。將其設置為5可得到以下效果:

mov r3, #0
ldr r2, .L3
mov r0, r3
str r3, [r2]
strb r3, [r2, #4]

仍然沒有循環(huán)。使它繼續(xù)進行下去是8:

然后,為64位CPU構建此代碼將變得更好:

mov w0, 0
str xzr, [x1, #:lo12:.LANCHOR0]

因此,它可以繼續(xù)運行。較大的數(shù)組大小會導致有效的循環(huán),或者可能只是調(diào)用諸如memset()之類的庫函數(shù),這是可以從匯編中調(diào)用的標準C庫函數(shù)。

最重要的是,匯編語言技能遠不是過時的,單片機開發(fā)人員不應該僅限于會閱讀匯編語言。