c语言调用汇编的方法

 更新时间:2013年11月15日 15:05:52   作者:  
在此记录一下c调用汇编的方法,汇编使用的是AT&T语法。例子很简单,就是在给一个整数用汇编转换成二进制

c部分很简单,文件名随便,如main.c:

复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>

void decToBin(long dec,char *b); //声明外部汇编函数
int main()
{
          long dec=254;
          char *bin=(char*)malloc(sizeof(char)*64);
          decToBin(dec,bin);
          printf("%s\n",bin);  
          free(bin);  
          return 0;  
}   

 本人使用的是mac 64位系统,所以64bit寄存器为r开头,如:rax、rbx等。

c调用的代码如下,保存的文件名随便,如decBin.S or decBin.s.

复制代码 代码如下:

.global _decToBin #下划线是必须的

_decToBin:
    pushq     %rbp
    movq    %rsp,%rbp

    movq     %rdi,-8(%rbp) #第一个参数
    movq     %rsi,-16(%rbp) #第二个参数

    movq    -8(%rbp),%rax
    movq    -16(%rbp),%rbx
    movq    $63,%rcx

A:
    rclq     $1,%rax
    jnc    B
    movb     $49,(%rbx)
    jmp C
B:
    movb     $48,(%rbx)
C:
    addq    $1,%rbx
    loop A

    popq     %rbp
    ret

AT&T语法的汇编网上有很多,俺就不介绍了。
在mac中使用的实际是clang编译器,这又牵扯到了LLVM项目,LLVM是构架编译器(compiler)的框架系统,Apple是LLVM计划的主要资助者。

cc链接的就是clang,Makefle文件:

复制代码 代码如下:

main:main.o decBin.o

main.o:main.c

decBin.o:decBin.s
    cc -c $<

clean:
    -rm main.o decBin.o main

相关文章

  • opencv3/C++轮廓的提取与筛选方式

    opencv3/C++轮廓的提取与筛选方式

    今天小编就为大家分享一篇opencv3/C++轮廓的提取与筛选方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • opencv3/C++实现光流点追踪

    opencv3/C++实现光流点追踪

    今天小编就为大家分享一篇opencv3/C++实现光流点追踪,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • mfc入门教程之通过控制变量制作计算器

    mfc入门教程之通过控制变量制作计算器

    这篇文章主要介绍了mfc入门教程之通过控制变量制作计算器,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • OpenCV实现车牌字符分割(C++)

    OpenCV实现车牌字符分割(C++)

    这篇文章主要为大家详细介绍了OpenCV实现车牌字符分割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C++之BOOST字符串查找示例

    C++之BOOST字符串查找示例

    这篇文章主要介绍了C++之BOOST字符串查找的方法,实例演示了boost针对字符串的查找、判定及替换等操作,具有一定的实用价值,需要的朋友可以参考下
    2014-10-10
  • MFC实现简单计算器

    MFC实现简单计算器

    这篇文章主要为大家详细介绍了MFC实现简单的计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C语言中进程信号集的相关操作函数详解

    C语言中进程信号集的相关操作函数详解

    这篇文章主要介绍了C语言中进程信号集的相关操作函数详解,包括sigismember函数和sigfillset函数以及sigemptyset函数的用法,需要的朋友可以参考下
    2015-09-09
  • 如何在C++中建立一个顺序表

    如何在C++中建立一个顺序表

    在使用顺序表之前,首先创建一个空的顺序表,也就是初始化顺序表。这里,在程序中只需设置顺序表的结点数量ListLen为0即可。这样,后面需要添加的数据元素将从顺序表的第一个位置存储
    2013-10-10
  • C++多重继承引发的重复调用问题与解决方法

    C++多重继承引发的重复调用问题与解决方法

    这篇文章主要介绍了C++多重继承引发的重复调用问题与解决方法,结合具体实例形式分析了C++多重调用中的重复调用问题及相应的解决方法,需要的朋友可以参考下
    2018-05-05
  • 详解C++句柄类

    详解C++句柄类

    本篇文章给大家详细分析了C++句柄类的相关知识点,对此有需要的朋友跟着学习参考下吧。
    2018-06-06

最新评论