C/C++中内联汇编
来源:互联网 发布:午夜视频聊天软件 编辑:程序博客网 时间:2024/06/05 03:25
最近在做一个课程设计,做的很是纠结和恼火,进展缓慢,不过还是有收获的。我想先抱怨一下,在中文环境中找点有用的资料真的是很困难,各种论坛里的回答也都根本对解决问题没有帮助,很多人完全没有考虑到新手的知识限制(或许),就我这次寻找C中内联汇编的经历来看,像我一样的菜鸟很难很快的找到入门的指导,所以我决定写一下自己的一些关于内联汇编的新学到的东西。
我们以两个数的加法为例来说,首先声明一下,内联汇编与使用的编译器以及机器有关,我用的编译器是MinGW(IDE是CFREE),也就是windows下的gcc,机器是intel的奔4
#include <stdio.h>int main(){int a = 1,b = 1,c;__asm__("add %1,%0\n\t"//这里说明下,目的操作数是后面的%0 "mov %0,%2\n\t"//同上,目的操作数是后面的%2 :"=r"(a) //这一行是将汇编中的代码对应到C代码中,同样按照顺序对应%2,%3等 :"r"(b),"r"(a) //这一行是将C代码中的数据输入到汇编的代码中,按照先后顺序依次对应%0(b),%1(a)等 ); printf("%d\n",a);}
程序运行截图:
(即1+1=2)
为了进一步说明汇编代码中的最后两行(当初我最困惑的部分),下面对上面的程序稍加扩展:
#include <stdio.h>int main(){int a = 1,b = 1,c=-1;__asm__("add %1,%0\n\t""mov %0,%2\n\t""sub $1,%1\n\t" //这里将a(此时为2)减一 "mov %1,%3" //然后将a赋给c(此时为1) :"=r"(a),"=r"(c) //这一行是将汇编中的代码对应到C代码中,同样按照顺序对应%2(a),%3(c)等 :"r"(b),"r"(a) //这一行是将C代码中的数据输入到汇编的代码中,按照先后顺序依次对应%0(b),%1(a)等 ); printf("a=%d\nc=%d\n",a,c);}
参考资料:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s4
- C/C++中内联汇编
- 在C中使用内联汇编
- 在C中使用内联汇编
- C/C++中使用内联汇编
- 在C程序中内联汇编
- C内联汇编
- C 内联汇编
- c/c++内联汇编
- C内联汇编
- C内联汇编
- Linux C内联汇编
- linux C 内联汇编
- Linux C内联汇编用法
- C中的内联汇编学习
- 汇编与C/C++内联嵌入汇编
- 在Visual C 中使用内联汇编(_emit)(精华)
- Visual C 中 Inline ASM 内联汇编的使用
- VC中使用C内联汇编小例子
- 封装相关知识(不断补充中)
- 电脑硬盘坏道如何屏蔽
- PHP缓存应用:PHP MEMCACHE 详解
- ORA-01090: shutdown in progress - connection is not permitted
- 浮点数的二进制表示学习
- C/C++中内联汇编
- liunx ubuntu下 Eclipse卸载ADT的方法
- utunbu安装7z解压工具
- 浅谈android线程的优先级
- float C#数据类型
- 【Android 开发教程】LinearLayout线性布局
- HTTP协议详解
- 使用asp.net模板生成html静态页面的五种方案
- Tiny6410 ——LED 驱动程序设计