麻豆一区二区三区蜜桃免费_中文字幕Va一区二区三区 _国产成人综合久久二区_丰满多毛的大隂户毛茸茸_国产麻豆剧果冻传媒免费老狼_无码人妻精品一区二区三区久久久 _亚洲中文无码精品卡通_蜜臀亚洲AV永久无码精品老司机

【方輝專欄】ARM嵌入式編譯器(十一) C文件內(nèi)嵌匯編代碼介紹
發(fā)布時(shí)間:2022-09-06

摘要: 本文主要對(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í)