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