用3个实例实现将变量a和变量b相乘,得到的值存在result中.
简单实例
asm表示使用内联汇编, volatile表示不对内联汇编进行优化,避免造成误删.
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__("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) |
实例
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等,这个编号称为占位符.
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;
}
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
ARM GCC 内联汇编参考手册
VC内联汇编资料 VC内联汇编资料 VC内联汇编资料 VC内联汇编资料
VB支持内联汇编的插件 VB支持内联汇编的插件
在Visual_C++中使用内联汇编 本文档主要详细介绍如何在c/c++代码内涵汇编代码,推荐给学习c/c++的同学们下载
vc内联汇编示例代码,介绍了VC++的一些被封装的汇编代码,有愿意深入了解VC++的人请进
在 Visual C++ 中使用内联汇编 在 Visual C++ 中使用内联汇编 在 Visual C++ 中使用内联汇编
易语言置入代码内联汇编源码,置入代码内联汇编,减法1,加法1,乘法1,除法1
在Visual C++中使用内联汇编 希望对学习VC++有所帮助
工程主要时C++内联汇编的示例,内部简单的用汇编实现了函数传参及调用,循环以及if语句的实现
Keil_内联汇编的设置问题。
x86平台转x64平台关于内联汇编不再支持的解决办法.
内联汇编2.rar
gcc 内联汇编官方手册最新版 ThisHOWTOexplainstheuseandusageoftheinlineassemblyfeatureprovidedbyGCC.
ibm-basics-inline-assembly,内联汇编介绍
在 Visual C++ 中使用内联汇编 VC内联ASM汇编 混合使用C和汇编代码的程序(用__asm写c函数)
在 Visual C++ 中使用内联汇编
GCC内联汇编, C语言嵌入汇编,AT&T Intel语法区别
易语言置入代码内联汇编源码。@易语言学习论坛。
本代码示范了如何在VC程序中内联汇编