37.C與彙編混合編程

37.C與彙編混合編程 編程

新建light.c:函數

修改start.S:優化

修改Makefile:加light.ospa

最後make成功,燒寫成功。3d

 

一樣,咱們也能夠在C函數裏調用咱們的彙編裏面的函數:blog

修改start.S:把light_led申明爲global:內存

在light.c中被調用:開發

Make編譯燒寫到開發板:發現燈是能夠被點亮的。在C中調用匯編函數成功。asm

接下來的是在C中嵌入彙編代碼,而不是調用:編譯

 

 

C中嵌入彙編代碼:

格式:

C內嵌彙編以關鍵字"__asm__"或者"asm"開始,包含四個部分的內容,如上圖,各個部分用":"分開,第一部分是必須寫的,後面三個部分是能夠忽略的,可是分號:不能省略。

  1. 彙編語句
  2. 輸出部分:C語言中修改的變量
  3. 輸入部分:從C傳來的參數
  4. 破壞描述:寄存器的值被修改,寄存器就要列在這裏。

 

簡單實例:

在C語言裏實現讀出CPSR裏的c1寄存器的值:

上面的彙編語句中,注意到通用寄存器的位置被一個參數%0,凡是要去讀出的部分都放在輸入部分,凡是要去寫的部分都放在輸出部分。

上面的輸入部分的"r"是通用寄存器,由系統分配的,後面括號value是存在寄存器裏的值。

 

在C語言裏實現寫入CPSR裏的c1寄存器的值:

參數寄存器是輸出cpsr裏寄存器的值。

等號是隻寫的意思,就是對寄存器r進行只寫的操做,還要把寄存器裏的值寫到value裏。

破壞部裏有memory,是告訴系統,在彙編語句裏,修改了內存裏變量的值。

 

 

Volatile是告訴cpu不要優化該代碼:

 

 

 

實現點燈:

上面用%0和%1來表示這裏是兩個參數,參數的值是兩個通用寄存器裏的值。"r"(GPKCON)中的"r"表示通用寄存器,值是GPKCON。"r0"是破壞部,由於整個操做會影響r0的值。

Make燒寫,燈亮。

相關文章
相關標籤/搜索