OpenEuler 中C与汇编的混合编程

使用下面代码下载gcc32位库
sudo apt-get install gcc-multilib g++-multilib module-assistant

1.将C代码编译成汇编代码:

 

 

 

 C语言代码:

复制代码
#include <stdio.h>

extern int B();

int A(int x,int y)
{
    int d,e,f;
    d = 4;e = 5;f = 6;
    f = B(d,e);
}
复制代码

汇编代码:

 

 

 

 

 

 

2.用汇编语言实现函数

获取CPU寄存器

main.c

复制代码
#include <stdio.h>
extern int get_ebp();
extern int get_esp();
int main()
{
    int ebp, esp;
    ebp = get_ebp();
    esp = get_esp();
    printf("ebp=%8x     esp=%8x\n",ebp,esp);
}
复制代码

s.s

复制代码
    .section .text
    .global get_esp, get_ebp
get_esp:
    movl    %esp, %eax
    ret
get_ebp:
    movl    %ebp, %eax
    ret
复制代码

运行截图:

 

 

 

 

 3.用汇编编写mysum函数

mysum.s

复制代码
    .text
    .global mysum,printf
mysum:
    pushl %ebp
    movl %esp, %ebp

    movl 8(%ebp), %eax
    addl 12(%ebp), %eax

    movl %ebp, %esp
    pop  %ebp
    ret
复制代码

mysum.c

复制代码
#include <stdio.h>
extern int mysum(int a, int b);
int main()
{
    int a,b,c;
    a = 123; b = 456;
    c = mysum(a,b);
    printf("c = %d\n",c);
}
复制代码

运行截图:

 

 

 

 

 3.从汇编调用C函数

b.c

复制代码
#include <stdio.h>
int a,b;
extern int sub();
int main()
{
    a = 100; b = 200;
    sub();
}
复制代码

b.s

复制代码
    .text
    .global sub, a, b, printf
sub:
    pushl   %ebp
    movl    %esp, %ebp

    pushl   b 
    pushl   a 
    pushl   $fmt
    call    printf
    addl    $12, %esp

    movl    %ebp,%esp
    pop     %ebp
    ret

    .data
fmt:    .asciz  "a = %d  b = %d\n"
复制代码

运行截图:

 

posted @ 2021-12-05 20:01  sy20191325  阅读(75)  评论(0编辑  收藏  举报