摘要: 本文主要對(duì)Arm Compiler 6編譯器提供的內(nèi)聯(lián)匯編器。對(duì)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)匯編代碼合并到一個(gè)函數(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 = %dn", a, b, c);
}
1. 內(nèi)聯(lián)匯編結(jié)構(gòu)
__asm內(nèi)聯(lián)匯編語(yǔ)句結(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ù)列表,以逗號(hào)分隔。每個(gè)操作數(shù)由方括號(hào)中的符號(hào)名稱、約束字符串和小括號(hào)中的C表達(dá)式。在此示例中,有一個(gè)輸出操作數(shù):[result] "=r" (res);
輸出操作數(shù)列表也可以為空。
例如:
__asm ("ADD R0, %[input_i], %[input_j]"
: ?/* 輸出操作數(shù)為空 */
: [input_i] "r" (i), [input_j] "r" (j)
);
inputs
輸入操作數(shù)的可選列表,以逗號(hào)分隔。輸入操作數(shù)使用與輸出操作數(shù)相同。在此示例中,有兩個(gè)輸入操作數(shù):[input_i] "r" (i), [input_j] "r" (j).輸入操作數(shù)列表也可以為空。
clobber_list
以逗號(hào)分隔的字符串列表。每個(gè)字符串都是匯編代碼可能修改的寄存器的名稱,但最終值并不重要。要防止編譯器將寄存器用于內(nèi)聯(lián)匯編字符串中的模板字符串,請(qǐng)將寄存器添加到 clobber 列表中。
例如,如果一個(gè)寄存器包含一個(gè)臨時(shí)值,則將其包含在 clobber 列表中。編譯器避免使用此列表中的寄存器作為輸入或輸出操作數(shù),或者在執(zhí)行匯編代碼時(shí)使用它來(lái)存儲(chǔ)另一個(gè)值。
該列表可以為空。除了寄存器,列表還可以包含特殊參數(shù):
"cc"
該指令修改條件代碼標(biāo)志。
"memory"
該指令訪問(wèn)未知的內(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. 定義符號(hào)和標(biāo)簽
定義符號(hào):
例如,__asm (".global __use_no_semihostingnt");
定義標(biāo)簽:在標(biāo)簽后需要加“:”。
例如,__asm ("my_label:nt");
3. 多條指令
在__asm一條語(yǔ)句中編寫多條指令。
例如在下例中,使用一個(gè)__asm語(yǔ)句為 Arm?v8-M 架構(gòu)編寫的中斷處理程序:
void HardFault_Handler(void)
{
__asm (
"TST LR, #0x40nt"
"BEQ from_nonsecurent"
"from_secure:nt"
"TST LR, #0x04nt"
"ITE EQnt"
"MRSEQ R0, MSPnt"
"MRSNE R0, PSPnt"
"B hard_fault_handler_cnt"
"from_nonsecure:nt"
"MRS R0, CONTROL_NSnt"
"TST R0, #2nt"
"ITE EQnt"
"MRSEQ R0, MSP_NSnt"
"MRSNE R0, PSP_NSnt"
"B hard_fault_handler_cnt"
);
}
將上面的處理程序代碼復(fù)制到file.c,然后使用以下命令對(duì)其進(jìn)行編譯:
armclang --target=arm-arm-none-eabi -march=armv8-m.main -S file.c -o file.s
來(lái)源:《Arm? Compiler for Embedded User Guide Version 6.18》
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
關(guān)于億道電子
億道電子技術(shù)有限公司(英文名稱:Emdoor Electronics Technology Co.,Ltd)是國(guó)內(nèi)資深的研發(fā)工具軟件提供商,公司成立于 2002 年,面向中國(guó)廣大的制造業(yè)客戶提供研發(fā)、設(shè)計(jì)、管理過(guò)程中使用的各種軟件開(kāi)發(fā)工具,致力于幫助客戶提高研發(fā)管理效率、縮短產(chǎn)品設(shè)計(jì)周期,提升產(chǎn)品可靠性。
20 年來(lái),先后與 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)系,并作為他們?cè)谥袊?guó)區(qū)的主要分銷合作伙伴服務(wù)了數(shù)千家中國(guó)本土客戶,為客戶提供從芯片級(jí)開(kāi)發(fā)工具、EDA 設(shè)計(jì)工具、軟件編譯以及測(cè)試工具、結(jié)構(gòu)設(shè)計(jì)工具、仿真工具、電氣設(shè)計(jì)工具、以及嵌入式 GUI 工具等等。億道電子憑借多年的經(jīng)驗(yàn)積累,真正的幫助客戶實(shí)現(xiàn)了讓研發(fā)更簡(jiǎn)單、更可靠、更高效的目標(biāo)。
歡迎關(guān)注“億道電子”公眾號(hào)
了解更多研發(fā)工具軟件知識(shí)