轉載於: http://blog.csdn.net/yao_guet/article/details/6450128
在使用gcc編譯的時候,可以在C語言程序中嵌套匯編指令,這樣極大的方便在高級語言中使用跟配件相關的指令。
在gcc中嵌套的匯編指令跟純匯編文件的語法有一點不一樣,在gcc中嵌套指令的格式是固定的:
__asm__(code : output operand list : input operand list : clobber list);
__asm__(匯編語句模板 : 輸出部分 : 輸入部分 : 破壞描述部分);
其中包括四個部分,每個部分之間使用":"分開
匯編語句模板是匯編命令的字符串,輸出部分是需要輸出到C變量參數列表,
輸入部分是需要從C變量輸入到ASM匯編的參數列表,破壞描述部分是指執行匯編指令會破壞的寄存器描述。
第一部分是必須寫的,后面三部分是可以省略,但是分號":"不能省略!
例如
__asm__("cli":::)
一個嵌套匯編塊里面可以寫多條匯編指令,指令之間需要換行符隔開“/n"或分號";"隔開
__asm__("mrs r0, cpsr /n" /
"orr r0, r0, #128/n" / "msr cpsr_c, r0" :
:
:)
嵌套匯編里面可以訪問C語言所定義的變量,
可以在輸入部分,給匯編指令傳遞C語言定義的參數,也可以把匯編指令中得到的值傳遞到C語言所定義的變量中。
例如:
unsigned long x; unsigned long temp; (void) (&temp == &x); __asm__ __volatile__( "mrs %0, cpsr /n" /
"orr %1, %0, #128 /n" / "msr cpsr_c, %1" / : "=r" (x), "=r" (temp) / : : "memory", "cc"); })
上面代碼中,%0表示第一個參數,%1表示第二個參數,依此類推,可以得到其它的參數,
這是老版本的gcc的方法了,好像只可以支持到10個參數吧?
新版本的是可以直接在匯編中使用參數名的訪問的,呵呵,不過大部分源碼還是使用%0的方法,所以在這也只看這個方法吧,,,
"=r" (x), "=r" (temp)
這里是輸出的列表,每個參數是以逗號","隔開的,
"=r"(x)表示asm中第一個參數的值保存到變量x中.
"=r"(temp)表示asm中第二個參數的值保存到變量temp中.
如果是需要輸入參數的話,則把"="號去除,
unsigned long x;
__asm__ __volatile__( "msr cpsr_c, %0 /n" / : : "r" (x) : "memory", "cc")
上面代碼就是把變量x傳入到匯編指令當中去,后面的破壞描述符會告訴編譯器哪個寄存器被使用了,避免寄存器使用沖突。
"memory"描述符 表示
1.將不重新排序該段內嵌匯編指令與前面的指令。
2.不使用寄存器作為緩存。
呵呵,這個只是簡單參考網上文章得到的,如果需要進一步了解可以去讀一下
ARM GCC Inline Assembler Cookbook
http://www.ethernut.de/en/documents/arm-inline-asm.html