通常來講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; }