一.我們的的程序是如何被芯片識別的?
有時我們會想,我們使用c語言或者更高級的語言寫好代碼,這些類似英文字母的東西芯片是怎麼識別並且按照我們的想法執行的?
上圖是一個ARM芯片基本的硬件組成,我們的程序肯定是存放在FLASH上。
我們一般的項目開發中,在啓動文件中或者特定場景下爲了更高的效率一般使用匯編文件,其他的邏輯實現一般使用c語言進行開發,也就是像上圖一樣彙編文件執行完畢後,跳到c文件中開始執行。C代碼通過以下過程,生成最終的二進制機器碼,存入FLASH中。
(1)預處理 .i文件(展開頭文件,宏定義,條件編譯處理等)
(2)編譯 .s彙編文件(預處理後的文件翻譯成彙編代碼過程)
(3)彙編 .o文件(將彙編代碼翻譯成對應二進制機器碼的過程)
(4)鏈接 多個.o文件生成elf格式文件
(5)然後生成機器可識別的二進制文件。
然後將我們的二進制文件通過下載器下載到芯片的指定Flash地址上。
二.彙編代碼是怎麼轉換爲二進制機器碼的?
也不難想到,就是互相約定的唄,哪幾位代表什麼?那麼我們詳細的分析下轉換協議。
例:
mov r1,#0xff
1110 00 1 1101 0 0000 0001 000011111111
31~28:條件段mov 後面沒有跟條件,所以爲1110
27~26:保留位,恆定爲00
25:標誌shifter_operand段存放的是立即數還是寄存器。若爲寄存器則置零,若爲立即數則置一。
24~21:標明指令的類型。mov是1101
20:表明該指令是否會影響程序狀態字寄存器。是則置一,否則置零
19--16位:標明第一個源操作數寄存器
15--12位:標明目的寄存器
11--0位:操作數,若爲立即數則填該立即數的二進制值,若爲通用寄存器則填通用寄存器標號的二進制值
那麼從編寫代碼到轉換爲板子認識的語言的整過過程我們已經理解了。
三.板子內已經注入了我們的思想,那麼它又是怎麼轉化,執行操作的?
這裏需要提到一個流水線的概念。
在芯片的手冊上都會提到是幾級流水線那麼什麼是流水線??
處理器執行一條指令的三個階段,取指,譯碼和執行(ARM7是馮·諾依曼結構,採用了典型的三級流水線,而ARM9則是哈佛結構,採用五級流水線技術,而ARM11則更是使用了7級流水線)。
流水線技術通過多個功能部件並行工作來縮短程序執行時間,提高處理器的效率和吞吐率簡單來說,執行某條指令至少要通過取指、譯碼、執行三個步驟。
更形象的理解就是有一筐蘋果,取出來一個,看看紅不紅,紅就咬一口,不紅就扔掉。但是這樣效率比較低,假如我們在判斷紅不紅的時候,手就開始拿下一個了,當上個咬完之後,緊接着就可以判斷下一個。一點不耽誤,哈哈。
我們的流水線也是這個原理。
1.第一週期,PC指向指令1,此時指令1進入流水線取指階段
2.第二週期,PC指向指令2,此時進入譯碼階段,同時取出指令2
3.第三週期,PC指向指令3,此時進入執行階段,同時指令2進入譯碼階段,指令3取指
4.第四周期,指令1執行完成,指令2和三同時推進一級,開始指令4取指。。
就想水一樣,一級級推進。(有同時執行的時候)
注:
哈佛結構是一種將程序指令儲存和數據儲存分開的存儲器結構。
馮諾依曼結構是一種將程序指令存儲器和數據存儲器合併在一起的結構。
更爲細節的內容這裏就不多說了,下節總結常用的彙編指令。