C語言內嵌匯編
阿新 • • 發佈:2018-02-27
內嵌匯編1.C語言內嵌匯編
1.1內嵌匯編的語法
1.2內嵌匯編示例
#include <stdio.h> int main() { int result = 0; int input = 1; int a = 1; int b = 2; asm volatile ( "movl %1, %0\n" // 通過占位符指定交互的變量 : "=r"(result) // 輸出變量,與匯編交互 : "r"(input) // 輸出變量,與匯編交互 // 這裏的r指示編譯器自動將通用寄存器關聯到變量 ); printf("result = %d\n", result); printf("input = %d\n", input); asm volatile ( "movl %%eax, %%ecx\n" "movl %%ebx, %%eax\n" "movl %%ecx, %%ebx\n" : "=a"(a), "=b"(b) // 這裏指明a變量使用a寄存器 : "a"(a), "b"(b) ); printf("a = %d\n", a); printf("b = %d\n", b); return 0; }
1.3編譯器做了什麽
對於上述示例,編譯器做了如下工作:
1.將result關聯到某個合適的寄存器
2.將input關聯到某個合適的寄存器
3.通過通用寄存器間接操作變量
註意:
匯編語言不支持內存到內存的直接操作,要使用寄存器作為中間角色。
1.4常用限制符說明
1.5使用系統服務
可以直接通過內嵌匯編使用系統服務。通過INT 80H使用內核服務
1.INT指令用於使用Linux內核服務(中斷指令)
2.80H是一個中斷向量號,用於執行系統調用
3.可以通過寄存器指定具體的系統調用及其參數(如sys_write服務)
1.6使用系統服務完成打印
char* s = "D.T.Software\n"; int l = 13; asm volatile( "movl $4, %%eax\n" // "movl $1, %%ebx\n" "movl %0, %%ecx\n" "movl %1, %%edx\n" "int $0x80 \n" : : "r"(s), "r"(l) : "eax", "ebx", "ecx", "edx" );
1.7使用系統服務執行程序退出
asm volatile(
"movl $1, %eax\n"
"movl $42, %ebx\n"
"int $0x80 \n"
);
註意:
1.內嵌匯編時,除匯編模板外,其余參數都可以省略
2.當省略的參數在中間時,對應分隔符":"不可省略
3.當省略保留列表時,對應得到分隔符":"可以省略
4.當省略可選參數時,寄存器前使用單個%作為前綴
當存在可選參數時,寄存器前使用兩個%%作為前綴
C語言內嵌匯編