C嵌入汇编
2015-11-09 16:18
183 查看
相信大家学C学汇编的时候老师都提到过,可以在C中嵌入汇编代码,然而,由于课时有限,很少有老师会深入讲述。当我们要在C中嵌入汇编的时候,上网搜索,很可能会发现按照网上说的方法去做却行不通。为啥呢?原来,对于不同的汇编器,汇编语言的格式不同,而在C中嵌入汇编的形式也不同。现在你可以体会到为什么在VC写的程序linux编译不了,linux下写的C程序windows下也经常编译不了,而老师却说C的可移植性好了吧。 为了尽量简单,我只对一个加法做转换。先看C程序:#include <stdio.h>int main(){ int a=4 , b = 5, c=0; c = a + b; printf("%d + %d = %d\n", a, b, c); return 0;} 首先,我们来看看tc/wintc是怎么嵌入的。/****************************************//* tasm3.0(tc/wintc) *//* 格式:asm asm_code *//* *//* 其他: *//* 1.仅支持16位汇编 *//* 2.变量名优先访问局部变量 *//* 如下面的程序输出:4 + 5 = 9 *//****************************************/#include <stdio.h>int a=3, b=5;int main(){ int a=4, c=0; asm push ax asm mov ax,a asm add ax,b asm mov c,ax asm pop ax printf("%d + %d = %d\n", a, b, c); getch(); return 0;} 相信大多数人初学C,老师推荐的都是TC,而自己却不屑于TC那简陋的编辑界面,找来notepad,UE,wintc甚至是VC来编写源程序。TC2.0/wintc使用的是Borland公司的tasm3.0,可以看到每个语句都要加个asm,极其不方便。我们再来看linux中是怎么实现的。/****************************************//* g++ *//* 格式:__asm__("asm_code"); *//* *//* 其他: *//* 1.直接用变量名来访问全局变量 *//* 2.用%加寄存器来访问寄存器 *//* 3.指令中ops在前,opd在后 *//* 4.汇编语句用\n分开,可用多个引号 */ /****************************************/#include <stdio.h>int a=4, b=5, c=0;int main(){ __asm__ ("push %eax \n""mov a,%eax \n""add b,%eax \n""mov %eax,c \n""pop %eax \n" ); printf("%d + %d = %d\n", a, b, c); return 0;}
相关文章推荐
- 在线汇编编写代码
- AVR使用范例--定时器实现PWM功能
- 控制全局变量初始化顺序 && #pragma详解
- 安装Matlab 7.0 步骤和常见问题
- Code Co-op 教程
- Ubuntu下编译C程序
- C经典书籍
- AVR中断详解
- JDBC
- android+string.xml;
- 第9周 项目3 - 稀疏矩阵的三元组表示的实现及应用
- AJAX文件上传插件
- iOS容易造成循环引用的三种场景
- 二叉树的链式存储及基本运算
- Qt 去除窗口阴影
- eclipse中LogCat有时不显示信息的简单解决办法
- eclipse中LogCat有时不显示信息的简单解决办法
- Oracle分区表drop和truncate partition索引失效问题
- WebView 加载数据时显示进度条,加载完后再把进度条取消并显示内容
- Android屏幕大小适配问题解决