服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - c语言调用汇编的方法

c语言调用汇编的方法

2021-01-09 15:06C语言教程网 C/C++

在此记录一下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

延伸 · 阅读

精彩推荐