130 likes | 409 Views
組合語言與 C 語言的混合編譯實驗. 實驗目的: 掌握 ARM C 語言編譯 掌握 ARM 組合語言與 C 語言的混合編譯 實驗內容: 用組合語言實驗 LED 燈的閃爍 實驗設備: DMA2440XP 教學平台 ADS 1.2 試用版內建開發環境和除錯軟體 USB 連接線、串列連接線、電源. 1.1 ARM 程式呼叫 ATPCS ( ARM ). ARM 編譯中不同語言的程式只要遵守 ATPCS 規則就可實現不同語言間的互相呼叫。 ATPCS 是一系列用於規定應用程式之間互相呼叫的基本規則,這個規則包括: 支援資料限制檢查 支援唯讀位置無關( ROPI )
E N D
組合語言與C語言的混合編譯實驗 實驗目的: • 掌握ARM C語言編譯 • 掌握ARM 組合語言與C語言的混合編譯 實驗內容: • 用組合語言實驗LED燈的閃爍 實驗設備: • DMA2440XP教學平台 • ADS 1.2 試用版內建開發環境和除錯軟體 • USB連接線、串列連接線、電源
1.1 ARM程式呼叫ATPCS(ARM) ARM編譯中不同語言的程式只要遵守ATPCS規則就可實現不同語言間的互相呼叫。ATPCS是一系列用於規定應用程式之間互相呼叫的基本規則,這個規則包括: • 支援資料限制檢查 • 支援唯讀位置無關(ROPI) • 支援可讀/寫段位置無關(RWPI) • 支援ARM程式和Thumb程式的混合使用 • 處理浮點運算 使用以上規定的ATPCS規則時,應用程式必須遵守如下: • 程式編寫遵守ATPCS • 變數傳遞以中間暫存器和資料完成 • 組合語言器使用-apcs開關選項 關於其他ATPCS規則,用戶可以參考ARM處理器相關書籍或登錄ARM公司網站。
1.2組合語言與C語言的互相呼叫 • 組合語言切換到C語言的方法 C語言中定義的函數名在組合語言中可作為標籤使用,因此,在組合語言中可使用程式分支指令直接轉移到C語言中定義的標籤(函數)中。下面程式實現從組合語言跳躍到C語言的Main函數中。 組合語言程式:
組合語言中函數的實現 程式只要遵守ATPCS相對應規則,就可以使用不同的程式編寫程式。程式間的互相呼叫最主要的是解決參數傳遞問題。應用程式之間使用中間暫存器及資料暫存器來傳遞參數,其中,第一個到第四個參數使用R0-R3,多於四個參數的使用資料暫存器進行傳遞。這樣,接收參數的應用程式必須知道參數的個數。但是,在應用程式被呼叫時,一般無從知道所傳遞參數的個數。不同語言編寫的應用程式在呼叫時可以自定義參數傳遞的約定,使用具有一定意義的形式來傳遞,可以很好地解決參數個數的問題。常用的方法是把第一個或最後一個參數作為參數個數(包括個數本身)傳遞給應用程式。
下面的程式就是用組合語言寫的一個簡單函數:下面的程式就是用組合語言寫的一個簡單函數: 上面的組合語言函數相當於如下聲明的C語言函數: int asse_add(int x, int y); 在組合語言中可以使用: BL asse_add 指令呼叫該函數。輸入時,r0為x參數,r1為y參數;輸出r0。該函數實現的功能很簡單,返回參數x與y的和。
C語言呼叫組合語言檔的函數 以上面的asse_add函數為例,在C語言中聲明該函數在其他檔中實現: extern int asse_add(int x, int y); 然後就可像呼叫C函數一樣呼叫該函數: x = asse_add(10,20)。
C語言中內嵌組合語言 ARM的編譯器支援內嵌組合語言。如下示例為C語言中採用內嵌組合語言的方式實現asse_add相同的功能:
1.3 實驗步驟 • 新建一個工程名為ASM_c,並新建原始檔案、輸入程式,設置好工程編譯產生映像檔。 • 硬體連接:用串列線將PC的COM1與實驗箱的UART1連起來,再用USB連接 • 線(A->B)將PC的USB HOST介面與實驗箱的USB Device介面連起來,最後插上12V電源。 • 下載、除錯並執行:該步驟操作過程與手冊5-3.2小節的步驟是類似的。 • 結合實驗內容和原理,觀察實驗現象,實驗結果應該是D2燈不停的閃爍。 • 完成實驗練習題。
1.4 應用程式編譯 • 參考程式碼 組合語言參考程式init.s如下:
上面是關於該實驗涉及到的部分函數,完整的程式請看光碟目錄的demo檔案夾下相對應實驗的工程目錄。上面是關於該實驗涉及到的部分函數,完整的程式請看光碟目錄的demo檔案夾下相對應實驗的工程目錄。
1.5 實驗過程 在進行NOR FLASH燒寫的時候,先要用20PIN的排線將實驗箱的20PINJTAG頭與JTAG小板的JP2介面座相連,同時串列埠線,USB線連接上,程式執行後,你會看到LED2不停的閃爍。