在C語言程序中嵌套匯編指令


轉載於: 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM