内联汇编使用简介
2015-06-04 10:31
204 查看
用3个实例实现将变量a和变量b相乘,得到的值存在result中.
在简单实例中,内联汇编只能使用C语言中的全局变量,其次寄存器和C语言中的变量不能进行交互传值.
其中outputs和inputs格式为:
[thead]
实例
在扩展asm中,引用寄存器要用”%%”. “=”表示写入操作数.在这里是指将eax寄存器的值写入到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__("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; }
相关文章推荐
- ca-bundle.crt to java truststore(e.g. trustStore.jks)
- mac os 利用ssh 搭建git server服务器详细教程,以及git基本用法
- java socket 通信实例
- MySQL高可用架构之MHA
- linux定时任务crontab详解
- 二维数组中的查找
- powershell 枚举远程主机登录会话 [PowerQuinsta]
- POJ3262 Protecting the Flowers(贪心)
- 黄聪:wordpress如何添加自定义文章快速编辑按钮
- Error: Cannot run program "/home/xxx/android_developer_tools/android-ndk-r8/ndk-build.cmd": Unknown reason
- PHP几种抓取网络数据的常见方法
- WinForm程序开发
- Android自己主动化測试——CTS測试
- edmx
- 关于iWebOffice中使用变量插入到Office书签里面
- 一次业务数据处理的设计图
- Winows 10 build 10136最新截图曝光! Edge浏览器图标正式使用
- 运维常用软件
- mac pro nginx配置
- linux移植过程中近日遇到问题汇总贴