Linux(四)彙編基礎知識 為什麼要用彙編

2021-10-05 14:20:33 字數 1805 閱讀 3933

cortex-a 晶元一上電 sp 指標還沒初始化, c 環境還沒準備好,所以肯定不能執行 c **,必須先用組合語言設定好 c 環境,比如初始化 ddr、設定 sp指標等等,當彙編把 c 環境設定好了以後才可以執行 c **。所以 cortex-a 一開始肯定是彙編**,其實stm32 也一樣的,一開始也是彙編,以 stm32f103 為例,啟動檔案startup_stm32f10x_hd.s 就是彙編檔案,只是這個檔案 st 已經寫好了,我們根本不用去修改,所以大部分學習者都沒有深入的去研究。彙編的知識很龐大,本章我們只講解最常用的一些指令,滿足我們後續學習即可。

對於 cortex-a 晶元來講,大部分晶元在上電以後 c 語言環境還沒準備好,所以第一行程式肯定是彙編的,至於要寫多少匯程式設計序,那就看你能在哪一步把 c 語言環境準備好。所謂的 c語言環境就是保證 c 語言能夠正常執行。 c 語言中的函式呼叫涉及到出棧入棧,出棧入棧就要對堆疊進行操作,所謂的堆疊其實就是一段記憶體,這段記憶體比較特殊,由 sp 指標訪問, sp 指標指向棧頂。晶元一上電 sp 指標還沒有初始化,所以 c 語言沒法執行,對於有些晶元還需要初始化 ddr,因為晶元本身沒有 ram,或者內部 ram 不開放給使用者使用,使用者**需要在ddr 中執行,因此一開始要用彙編來初始化 ddr 控制器。

如果大家使用過 stm32 的話就會知道 mdk 和 iar 下的啟動檔案 startup_stm32f10x_hd.s其中的彙編語法是有所不同的,將 mdk 下的彙編檔案直接複製到 iar 下去編譯就會出錯,因為 mdk 和 iar 的編譯器不同,因此對於彙編的語法就有一些小區別。我們要編寫的是 arm彙編,編譯使用的 gcc 交叉編譯器,所以我們的彙編**要符合 gnu 語法。

暫存器與暫存器之間的操作指令:mov(普通暫存器間複製)、mrs(特殊暫存器->普通暫存器)、msr(普通暫存器->特殊暫存器)

儲存器與暫存器之間的操作指令:ldr(儲存器->暫存器)、str(暫存器->儲存器)

ldr r0, =0x20c4068 /*把0x20c4068位址寫入至r0暫存器*/

ldr r1, =0xffffffff  /*把0xffffffff寫入至r1暫存器中*/

ldr r1, [r0] 是把ro暫存器存的位址下的資料讀到r1暫存器中

str r1, [r0] 是把r1暫存器中的資料,寫入到r0暫存器所儲存的位址中去

push(壓棧) 和 pop(出棧)指令

跳轉指令

算數指令

邏輯運算指令

用彙編先準備c語言環境,初始化ddr、初始化sp指標,還要編寫類似stm32的startup.s啟動檔案,這樣才能跳轉到main函式中。那麼我們如何真正使用彙編呢?下一章將介紹,如何使用彙編點亮乙個led。

組合語言基礎知識(四)

1.ret指令用棧中的資料,修改ip內容,從而實現轉移。retf指令也是根據棧中的內容,修改cs和ip的內容,進行控制轉移。2.call指令將當前的ip或cs和ip壓入棧中,然後進行跳轉。3.call命令被送到cpu指令快取的時候,ip已經指向了call命令下一條指令,cpu執行call令後,是將c...

彙編基礎知識

最近感覺自己學的到了乙個瓶頸,學的不知道有多少是記住的,總是感覺自己要學的東西有那麼多,時間又太少。專業課也越來越多,花在程式設計上的時間就少了,但是這畢竟是我的興趣愛好,所以我不想放棄。昨晚突然有個想法,以後寫部落格的頻率加快,儘管這樣部落格的質量也就下降了很多,但是我還是覺得部落格就是來記錄我成...

彙編 基礎知識

一 進製數的表示 十進位制後加d,二進位制後加b,八進位制加o,十六進製制加h 二 十進位制數轉換為二進位制數或十六進製制數 使用除2取餘法或使用除16取餘法,結果向上讀,如4,得餘數0 0 1,則相應二進位制為100,十六進製制數類似 三 二進位制數或十六進製制數轉換為十進位制數 使用權的展開式 ...