混合使用C、C++和彙編語之:內聯彙編和嵌入型彙編的使用

2021-01-06 電子產品世界

本文引用地址:http://www.eepw.com.cn/article/257034.htm

內聯彙編和嵌入型彙編是包含在C/C++編譯器中的彙編器。使用它可以在C/C++程序中實現C/C++語言不能完成的一些工作。例如,在下面幾種情況中必須使用內聯彙編或嵌入型彙編。

·程序中使用飽和算術運算(Saturatingarithmetic),如SSAT16和USAT16指令。

·程序中需要對協處理器進行操作。

·在C或C++程序中完成對程序狀態寄存器的操作。

使用內聯彙編編寫的程序代碼效率也比較高。

12.1.1內聯彙編1.內聯彙編語法

內聯彙編使用「_asm」(C++)和「asm」(C和C++)關鍵字聲明,語法格式如下所示。

·__asm(instruction[;instruction]); //必須為單條指令

__asm{instruction[;instruction]}

·__asm{

...

instruction

...

}

·asm(instruction[;instruction]); //必須為單條指令

asm{instruction[;instruction]}

·asm{

...

instruction

...

}

內聯彙編支持大部分的ARM指令,但不支持帶狀態轉移的跳轉指令,如BX和BLX指令,詳見ARM相關文檔。

由於內聯彙編嵌入在C或C++程序中,所有在用法上有其自身的一些特點。

①如果同一行中包含多條指令,則用分號隔開。

②如果一條指令不能在一行中完成,使用反斜槓「/」將其連接。

③內聯彙編中的注釋語句可以使用C或C++風格的。

④彙編語言中使用逗號「,」作為指令操作數的分隔符,所以如果在C語言中使用逗號必須用圓括號括起來。如,__asm{ADDx,y,(f(),z)}。

⑤內聯彙編語言中的寄存器名被編譯器視為C或C++語言中的變量,所以內聯彙編中出現的寄存器名不一定和同名的物理寄存器相對應。這些寄存器名在使用前必須聲明,否則編譯器將提示警告信息。

⑥內聯彙編中的寄存器(除程序狀態寄存器CPSR和SPSR外)在讀取前必須先賦值,否則編譯器將產生錯誤信息。下面的例子顯示了內聯彙編和真正彙編的區別。

錯誤的內聯彙編函數如下所示。

intf(intx)

{

__asm

{

STMFDsp!,{r0} //保存r0不合法,因為在讀之前沒有對寄存器寫操作

ADDr0,x,1

EORx,r0,x

LDMFDsp!,{r0} //不需要恢復寄存器

}

returnx;

}

將其進行改寫,使它符合內聯彙編的語法規則。

intf(intx)

{

intr0;

__asm

{

ADDr0,x,1

EORx,r0,x

}

returnx;

}

下面通過幾個例子進一步了解內聯彙編的語法。

①字符串拷貝

下面的例子使用一個循環完成了字符串的拷貝工作。

#includestdio.h>

voidmy_strcpy(constchar*src,char*dst)

{

intch;

__asm

{

loop:

LDRBch,[src],#1

STRBch,[dst],#1

CMPch,#0

BNEloop

}

}

intmain(void)

{

constchar*a=Helloworld!;

charb[20];

my_strcpy(a,b);

printf(Originalstring:'%s'\n,a);

printf(Copiedstring:'%s'\n,b);

return0;

}

c語言相關文章:c語言教程

c++相關文章:c++教程


相關焦點

  • 混合使用C、C++和彙編語之:從彙編代碼訪問 C 全局變量
    在彙編代碼中訪問C全局變量,只能通過地址間接訪問全局變量。要訪問全局變量,必須在彙編中使用IMPORT偽操作輸入全局變量,然後將地址載入寄存器。可以根據變量的類型使用載入和存儲指令訪問該變量。
  • ARM中C和彙編混合編程及示例ARM中C和彙編混合編程及示
    而且,彙編語言是和CPU的指令集緊密相連的,作為涉及底層的嵌入式系統開發,熟練對應彙編語言的使用也是必須的。小結  以上通過幾個簡單的例子演示了嵌入式開發中常用的C和彙編混合編程的一些方法和基本的思路,其實最核心的問題就是如何在C和彙編之間傳值,剩下的問題就是各自用自己的方式來進行處理。
  • C語言與彙編語言混合編程應遵守的規則
    在使用C語言時,要用到和彙編語言的混合編程。若彙編代碼較為簡潔,則可使用直接內嵌彙編的方法;否則要將彙編程序以文件的形式加入到項目中,按照ATPCS(ARM/Thumb過程調用標準,ARM/Thumb Procedure Call Standard)的規定與C程序相互調用與訪問。
  • DSP編程技巧之24---C/C++與彙編語言的交互之-(2)從C/C++代碼調用...
    在C/C++與彙編語言混合編程的情況下,一般我們都會選擇C/C++來實現所期待的大部分功能,對於少數和硬體關聯度高(例如操作某些CPU寄存器)以及對運算的實時性要求高(例如高速、多點的FFT)的功能才使用彙編來實現,這就使得大多數情況下,C/C++與彙編的交互都是從C/C++代碼調用彙編代碼中的函數與變量,所以在此我們就來看一下這種調用的規則。
  • ARM中ADS環境下C語言和彙編語言混合編程及示例
    但對於一寫硬體上的操作,很多地方還是要用到彙編語言,例如硬體系統的初始化中的CPU 狀態的設定,中斷的使能,主頻的設定,RAM控制參數等。另外在一些對性能非常敏感的代碼塊,基於彙編與機器碼一一對應的關係,這時不能依靠C編譯器的生成代碼,而要手工編寫彙編,從而達到優化的目的。彙編語言是和CPU的指令集緊密相連的,作為涉及底層的嵌入式系統開發,熟練對應彙編語言的使用也是必須的。
  • 單片機程序C語言與彙編語言混合編程
    C語言函數和彙編語言函數相互調用在這個示例中C語言函數main()調用彙編語言函數get_rand()以得到一個隨機數;彙編語言函數get_rand()首先調用C語言的標準庫函數rand()得到一個整型隨機值,然後用調用C語言函數mult()的方法把這個隨機值乘以main()函數傳遞給自己的實參,並把乘積值返回給
  • 基於Android的ARM彙編語言系列之二:C/C++程序生成ARM彙編程序
    章節列表之一:ARM彙編語言開篇之二:C/C++程序生成ARM彙編程序的過程分析之三:ARM彙編語言程序結構之四:ARM處理器的尋址方式之五:ARM指令集與Thumb指令集之六:NEON指令集與VFP指令集本文引用地址:http://www.eepw.com.cn
  • iOS ARM彙編
    一、簡介1、模擬器和真機的彙編是不一樣的2、真機和模擬器上各自的彙編代碼樣式:三、mov指令mov:move如何編寫彙編指令:1、在OC或C中嵌入彙編;在OC或C中嵌入彙編2、外部建立一個彙編文件.s,再配個.h文件暴露函數的聲明,以函數的形式來練習彙編(實現文件後綴.asm或.s);
  • C語言和彙編語言是什麼?他們之間可以有怎樣的合作?為你解析
    驅動程序、嵌入式作業系統和實時運行程序都需要彙編語言。一種是在 C 語言中嵌入彙編語言代碼,另一種是讓 C 語言從外部調用彙編。首先,我們看一看在 C 語言中怎樣嵌入彙編語言代碼。在 C 語言中嵌入彙編語言代碼,也有兩種格式,一種是單句的,一種是模塊的。 我們來看看一些簡單的例子。
  • 在C中嵌套彙編代碼難嗎?
    做底層軟體開發的,或多或少都會接觸一些彙編代碼,今天就來說說關於彙編在C中的定義和調用,以及舉例說明嵌套彙編代碼。有認真研究,或者說細心一點的讀者應該都知道:C中定義彙編代碼與編譯器有關。如果你寫過Keil C51,你還會發現有如下(通過預處理)嵌套彙編:#pragma asm; Assembler Code Here#pragma endasm所以
  • 基於Android的ARM彙編語言系列之三:ARM彙編語言程序結構
    章節列表之一:ARM彙編語言開篇之二:C/C++程序生成ARM彙編程序的過程分析之三:ARM彙編語言程序結構之四:ARM處理器的尋址方式之五:ARM指令集與Thumb指令集之六:NEON指令集與VFP指令集本文引用地址:http://www.eepw.com.cn
  • 初識Golang彙編
    為什麼寫本文平時業務中一直使用PHP編寫代碼 (就是那個世界上最好的語言,哈哈~, 不引戰,想說的是能處理好業務的語言就是最好的語言),但是一直對golang比較感興趣,閒暇、周末之餘會看一些Go底層源碼。
  • ARM裸機開發bootloader彙編語言
    一、彙編語言概述1、為什麼要使用彙編本文引用地址:http://www.eepw.com.cn/article/201611/318213.htm一般情況下我們不會用到彙編,但有兩種情況下,我們要用到彙編。1、啟動代碼。
  • 彙編語言的使用領域
    彙編語言的特點明顯,其誘人的優點直接導致其嚴重的缺點, 其「與機器相關」和「執行的高效率」導致其可移植性差和調試難。所以, 我們在選用彙編語言時要根據實際的應用環境,儘可能避免其缺點對整個應 用系統的影響。 下面簡單列舉幾個領域以示說明,但不要把它們絕對化。
  • C語言能夠實現單片機功能,為什麼還要使用彙編呢?
    首先彙編語言和C語言都是程式語言,彙編是一種機器語言直接面對底層,與單片機底層硬體構架息息相關,相對於C語言,是一門低級語言,C語言面向過程的語言,在編譯執行會轉為彙編在生成單片機可執行文件。是一門高級語言,兩種語言各有優缺點。一,C語言/彙編優缺點。1學習難度。
  • ARM彙編指令:.align理解和用法
    對齊偽指令ALIGN對齊偽指令格式:ALIGN Num其中:Num必須是2的冪,如:2、4、8和16等。偽指令的作用是:告訴彙編程序,本偽指令下面的內存變量必須從下一個能被Num整除的地址開始分配。
  • 哪幾種情況中必須使用內聯彙編或嵌入型彙編?
    四、內核實例為了讓讀者有個更加深刻的理解, 以內核中的例子為例:arch/arm/kernel/setup.cvoid notrace cpu_init(void) {    unsigned int cpu = smp_processor_id
  • 單片機編程用C語言還是彙編?
    單片機的編程可以通過彙編語言和C語言來實現。 1彙編編程的特點 彙編是一種更接近於硬體底層的低級語言。硬體在編程時總線和地址非常重要,在彙編語言中,一般用助記符來替代機器指令的操作碼,用標號代表操作數的地址,所以彙編語言和機器指令之間存在著唯一對應的關係,這就導致了不通系列的單片機其彙編指令集是完全不通的。
  • JVM系列之:通過一個例子分析JIT的彙編代碼
    調用這麼多次,主要是為了保證add成為熱點代碼,從而使用JIT進行編譯。使用jitWatch進行分析之前提到了JIT分析的神器jitWatch,今天我們來使用jitWatch來分析上面的代碼。接著調用iadd把1和b相加。最後將生成的值使用putstatic賦值給a。字節碼和原始碼一一對應,完全沒有問題。分析彙編代碼那麼JIT生成的彙編代碼是不是也和java代碼一致呢?
  • C函數與彙編函數之間參數及返回值傳遞方法
    , {R5 - R6, R10}    @R5,R6,R10寄存器出棧.endfunc1234567891011121314151617TestFunc2函數使用了R0、R1、R3、R4、R5、R6、R10共7個寄存器,遵循AAPCS規則,在使用R0、R1和R3之前並沒有對它們壓棧,但對R5、R6和R10寄存器進行了壓棧保存,在函數返回前又出棧還原了這3個寄存器