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"開始,包含四個部分的內容,如上圖,各個部分用":"分開,第一部分是必須寫的,後面三個部分是能夠忽略的,可是分號:不能省略。
簡單實例:
在C語言裏實現讀出CPSR裏的c1寄存器的值:
上面的彙編語句中,注意到通用寄存器的位置被一個參數%0,凡是要去讀出的部分都放在輸入部分,凡是要去寫的部分都放在輸出部分。
上面的輸入部分的"r"是通用寄存器,由系統分配的,後面括號value是存在寄存器裏的值。
在C語言裏實現寫入CPSR裏的c1寄存器的值:
參數寄存器是輸出cpsr裏寄存器的值。
等號是隻寫的意思,就是對寄存器r進行只寫的操做,還要把寄存器裏的值寫到value裏。
破壞部裏有memory,是告訴系統,在彙編語句裏,修改了內存裏變量的值。
Volatile是告訴cpu不要優化該代碼:
實現點燈:
上面用%0和%1來表示這裏是兩個參數,參數的值是兩個通用寄存器裏的值。"r"(GPKCON)中的"r"表示通用寄存器,值是GPKCON。"r0"是破壞部,由於整個操做會影響r0的值。
Make燒寫,燈亮。