目的
在C语言程序中插入汇编语法(内联汇编)
意义
使用C语言配合汇编不仅可以保留C语言操作的便捷性,还可以让我们拥有对内存进行字节粒度操作的能力
内联汇编使用
使用全局变量
使用普通的内联汇编语法时,参数只能通过全局变量传递
语法格式:
asm(“assembly code”);
try5.s
#include <stdio.h>
int a=1, b=2, result;
int main(){
asm( "pusha \n\t"
"movl a, %eax \n\t"
"movl b, %ebx \n\t"
"imull %ebx, %eax \n\t"
"movl %eax, result \n\t"
"popa \n\t"
);
printf("a * b = %d\n", result);
return 0;
}
编译执行
解释
1、普通的内联汇编可以直接访问全局变量
2、\n\t在此处的意义是实现换行对齐,这里体现不出来,只有在查看其汇编代码时才有效果
使用局部变量
普通的内联汇编只能操作全局变量,下面介绍一种可以操作局部变量的扩展的内联汇编
语法格式:
asm(“assembly code” : output : input : chagned registers);
assembly code:汇编代码
output:返回值
input:输入参数
chagned registers:在自动安排寄存器时被禁用的寄存器,感兴趣的可以参考《汇编语言程序设计·RICHARD》P298
try7.c
#include <stdio.h>
int main(){
int data1=10, data2=20, result;
asm( "imull %1, %2\n\t"
"movl %2, %0\n\t"
:"=r"(result)
:"r"(data1), "r"(data2)
:
);
printf("data1 * data2 = %d\n", result);
}
编译执行
解释
该内联汇编中前面两行就是正常的汇编语法
“=r”(result)意味着将一个寄存器绑定到result变量
“r”(data1)意味着将一个寄存器绑定到data1变量
“r”(data2)意味着将一个寄存器绑定到data2变量
按照上面的顺序
result绑定的寄存器可以用%0来引用
data1绑定的寄存器可以用%1来引用
data2绑定的寄存器可以用%2来引用
最后一行仅有一个冒号,说明没有禁用的寄存器