原文鏈接:http://www.orlion.ga/776/ 用C寫的程式效率可能不如彙編,而且有些平臺相關的指令必須手寫,例如x86是埠I/O,而c語言就沒有這個概念,所以in/out指令必須用彙編來寫。 gcc提供了一種擴展寫法可以在C代碼中試用內聯彙編,最簡單的格式是__asm__("ass ...
原文鏈接:http://www.orlion.ga/776/
用C寫的程式效率可能不如彙編,而且有些平臺相關的指令必須手寫,例如x86是埠I/O,而c語言就沒有這個概念,所以in/out指令必須用彙編來寫。
gcc提供了一種擴展寫法可以在C代碼中試用內聯彙編,最簡單的格式是__asm__("assembly code"); , 例如__asm__("nop");,nop這條指令讓CPU空轉一個周期,如果需要執行多條指令則用\n\t將各條指令隔開,例如:
__asm__("movl $1, %eax\n\t" "movl $4, %ebx\n\t" "int $0x80");
通常c代碼中的內聯彙編需要和c變數建立關聯,需要用到完整的內聯彙編樣式:
__asm__(assembler template : output operands /* optional */ : input operands /* optional */ : list of clobbered registers /* optional */ );
這種格式由四部分組成,第一部分是彙編指令,和上面的例子一樣,第二部分和第三部分是約束條件,第二部分指示彙編指令的運算結果要輸出到那些c操作數中,c操作數應該是左值表達式,第三部分指示彙編指令需要從那些c操作數獲取輸入,第四部分是在彙編指令中被修改過的寄存器列表,指示編譯器哪些寄存器的值在執行這條__asm__語句時會改變。後三個部分都是可選的,如果沒有就空著值寫個":"號,例如: