C嵌入汇编

   相信大家学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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值