标签:汇编-内联
用3个实例实现将变量a和变量b相乘,得到的值存在result中.
asm表示使用内联汇编, volatile表示不对内联汇编进行优化,避免造成误删.
#include<stdio.h>
int a = 10;
int b = 20;
int result;
int main(){
__asm__ __volatile__(
"movl a, %eax\n\t"
"movl b, %ebx\n\t"
"imull %ebx, %eax\n\t"
"movl %eax, result\n\t"
);
printf("the answer is %d\n", result);
return 0;
}
在简单实例中,内联汇编只能使用C语言中的全局变量,其次寄存器和C语言中的变量不能进行交互传值.
为了解决以上实例中的局限性,提供了扩展的asm
__asm__("asm statements" : outputs : inputs : registers-modified);
其中outputs和inputs格式为:
"constraints" (variable)
约束 | 描述 |
---|---|
“m”、”v”、”o” | 内存单元 |
“r” | 任何寄存器 |
“q” | 寄存器eax、ebx、ecx、edx之一 |
“i”、”h” | 直接操作数 |
“E”和”F” | 浮点数 |
“g” | 任意 |
“a”、”b”、”c”、”d” | 分别表示寄存器eax、ebx、ecx和edx |
“S”和”D” | 寄存器esi、edi |
“I” | 常数(0至31) |
实例
#include<stdio.h>
int main(){
int data1 = 10;
int data2 = 20;
int result;
__asm__ __volatile__(
"imull %%ebx, %%eax\n\t"
"movl %%ecx, %%eax"
: "=a"(result)
: "d"(data1), "c"(data2)
);
printf("the answer is %d\n", result);
return 0;
}
在扩展asm中,引用寄存器要用”%%”. “=”表示写入操作数.在这里是指将eax寄存器的值写入到result中.
可以将寄存器出现的顺序从0开始编号,比如%0和%1等,这个编号称为占位符.
#include<stdio.h>
int main(){
int data1 = 10;
int data2 = 20;
int result;
__asm__ __volatile__(
"imull %1, %2\n\t"
"movl %2, %0"
: "=r"(result)
: "r"(data1), "r"(data2)
);
printf("the answer is %d\n", result);
return 0;
}
标签:汇编-内联
原文地址:http://blog.csdn.net/csujiangyu/article/details/46357079