Part10.4-C與彙編混合編程

通常來講C比彙編語言好,可是函數

 

 

一、彙編調用C函數優化

彙編:spa

  ldr pc,=gboot_main3d

C:指針

  noneblog

 

二、C調用匯編函數內存

彙編:編譯器

  .global light_ledasm

C:編譯

   light_led();

 

三、C內嵌彙編

和第二種方式不一樣,第二種方式彙編語句存放於單獨的彙編文件中,而這種方式沒有單獨的彙編文件

 

3.1格式

其中破壞描述就是值被修改的寄存器都要列出來

破壞 能夠理解爲 修改

 

 

三、2範例

 

 這裏%0表示是一個參數,是咱們的零號參數

雖然不知道這是否是r0,可是凡是咱們要讀的參數都要寫到輸入部分,p15_c1不是參數因此不用寫

"r"指明這個參數的性質是通用寄存器,value表示這個通用寄存器的值,而這個寄存器是哪一個咱們不關心,系統隨便給一個就行

 

=代表是隻寫的意思,只寫入值

而後還要把寄存器r裏面的值賦值給value

這裏破壞部用到了memory,也就是內存被修改了。value局部變量存在於棧當中,被修改了,也就是內存被修改了

這裏的註釋符號仍是用@,而不是//

 

三、3優化

 通常處理器有可能會優化代碼,好比

p1=0x01

p1=0x010

編譯器會默認把前面的語句去掉。而在好比C51當中,這種輸入極可能是實現某功能的要求輸入序列,去掉功能不能實現

 

 當有多行代碼時須要沒一行用引號括起來,再加上換行符

 

 

三、4修改代碼,使用內嵌彙編實現點亮LED

 

首先複製進去,修改格式

而後去掉mov pc,lr。不須要回到主彙編當中

 

而後去掉ldr r0, =GPKCON      ldr r0, =GPKDAT這兩句,在輸入部體現。

這兩個參數咱們都是讀取它們的值做爲地址輸入到彙編中。

沒有輸出部,沒有往某個參數裏面去寫入值。沒有在彙編中被修改的C變量。破壞部由於會對r1寄存器形成影響,因此有破壞部

 

宏定義部分和上一節不同,由於下面再也不做爲地址指針使用,而是直接在彙編中替換

#define GPKCON 0x7f008800
#define GPKDAT 0x7f008808

int gboot_main()
{
_asm_(

  "ldr r1, =0x11110000\n"
  "str r1, [%0]\n"
  "ldr r1, =0xff\n"
  "str r1, [%1]\n"

  :

  :"r"(GPKCON),"r"(GPKDAT)

  :"r1");

 

return 0; }

相關文章
相關標籤/搜索