【方輝專欄】ARM嵌入式編譯器(十一) C文件內嵌匯編代碼介紹
2022-09-06
摘要: 本文主要對Arm Compiler 6編譯器提供的內聯匯編器。對C文件內嵌匯編代碼的編寫介紹。關鍵字:Arm Compiler 6、編譯器、 內聯匯編器、C文件內嵌匯編Arm Compiler 6集成了內聯匯編器,可以為在C或C++代碼中的GUN匯編進行編譯。例如:使用__asm關鍵字將GNU內聯匯編代碼合并到一個函數中。 #include <stdio.h>int add(int i, int j){??int res = 0;??__asm ("ADD %[result], %[input_i], %[input_j]"????: [result] "=r" (res)????: [input_i] "r" (i), [input_j] "r" (j)??);??return res;}int main(void){??int a = 1;??int b = 2;??int c = 0;??c = add(a,b);??printf("Result of %d + %d = %d\n", a, b, c);}1. 內聯匯編結構__asm內聯匯編語句結構: /* 基本內聯形式 */__asm [volatile] (code); /*擴展內聯形式 */__asm [volatile] (code_template:outputs[:inputs[:clobber_list]]);code匯編指令,例如"ADD R0, R1, R2".code_template匯編指令的模板,例如"ADD %[result], %[input_i], %[input_j]".outputs輸出操作數列表,以逗號分隔。每個操作數由方括號中的符號名稱、約束字符串和小括號中的C表達式。在此示例中,有一個輸出操作數:[result] "=r" (res);輸出操作數列表也可以為空。例如:__asm ("ADD R0, %[input_i], %[input_j]" : ?/* 輸出操作數為空 */ : [input_i] "r" (i), [input_j] "r" (j));inputs輸入操作數的可選列表,以逗號分隔。輸入操作數使用與輸出操作數相同。在此示例中,有兩個輸入操作數:[input_i] "r" (i), [input_j] "r" (j).輸入操作數列表也可以為空。clobber_list以逗號分隔的字符串列表。每個字符串都是匯編代碼可能修改的寄存器的名稱,但最終值并不重要。要防止編譯器將寄存器用于內聯匯編字符串中的模板字符串,請將寄存器添加到 clobber 列表中。例如,如果一個寄存器包含一個臨時值,則將其包含在 clobber 列表中。編譯器避免使用此列表中的寄存器作為輸入或輸出操作數,或者在執行匯編代碼時使用它來存儲另一個值。該列表可以為空。除了寄存器,列表還可以包含特殊參數:"cc"該指令修改條件代碼標志。"memory"該指令訪問未知的內存地址。中的寄存器clobber_list必須使用小寫字母而不是大寫字母。帶有 a 的示例指令clobber_list是:__asm ("ADD R0, %[input_i], %[input_j]" : ?/*輸出操作數為空 */ : [input_i] "r" (i), [input_j] "r" (j) : "r5","r6","cc","memory");2. 定義符號和標簽定義符號:例如,__asm (".global __use_no_semihosting\n\t");定義標簽:在標簽后需要加“:”。例如,__asm ("my_label:\n\t");3. 多條指令在__asm一條語句中編寫多條指令。例如在下例中,使用一個__asm語句為 Arm?v8-M 架構編寫的中斷處理程序:void HardFault_Handler(void){ __asm ( "TST LR, #0x40\n\t" "BEQ from_nonsecure\n\t" "from_secure:\n\t" "TST LR, #0x04\n\t" "ITE EQ\n\t" "MRSEQ R0, MSP\n\t" "MRSNE R0, PSP\n\t" "B hard_fault_handler_c\n\t" "from_nonsecure:\n\t" "MRS R0, CONTROL_NS\n\t" "TST R0, #2\n\t" "ITE EQ\n\t" "MRSEQ R0, MSP_NS\n\t" "MRSNE R0, PSP_NS\n\t" "B hard_fault_handler_c\n\t" );}將上面的處理程序代碼復制到file.c,然后使用以下命令對其進行編譯:armclang --target=arm-arm-none-eabi -march=armv8-m.main -S file.c -o file.s來源:《Arm? Compiler for Embedded User Guide Version 6.18》+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++關于億道電子億道電子技術有限公司(英文名稱:Emdoor Electronics Technology Co.,Ltd)是國內資深的研發工具軟件提供商,公司成立于 2002 年,面向中國廣大的制造業客戶提供研發、設計、管理過程中使用的各種軟件開發工具,致力于幫助客戶提高研發管理效率、縮短產品設計周期,提升產品可靠性。20 年來,先后與 Altium、ARM、Ansys、QT、Adobe、Visu-IT、Minitab、Testplant、EPLAN、HighTec、GreenHills、PLS、Ashling、MSC Software 、Autodesk、Source Insight、TeamEDA、MicroFocus等多家全球知名公司建立戰略合作伙伴關系,并作為他們在中國區的主要分銷合作伙伴服務了數千家中國本土客戶,為客戶提供從芯片級開發工具、EDA 設計工具、軟件編譯以及測試工具、結構設計工具、仿真工具、電氣設計工具、以及嵌入式 GUI 工具等等。億道電子憑借多年的經驗積累,真正的幫助客戶實現了讓研發更簡單、更可靠、更高效的目標。歡迎關注“億道電子”公眾號了解更多研發工具軟件知識
查看更多→