OpenEuler 中C与汇编的混合编程

OpenEuler 中C与汇编的混合编程

20191331 lyx

实践任务

1. 在X86_64架构下实践2.5中的内容,提交代码和实践截图
2. 把2.5的内容在OpenEuler中重新实践一遍,提交相关代码和截图
3. 实验内容要经过答辩才能得到相应分数

一、在X86_64架构下实践2.5中的内容,提交代码和实践截图

1.用汇编代码编程

代码:

#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);
}

入口代码

函数体代码

函数B

退出代码

2.用汇编语言实现函数

s.s

        .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

sum.c

int main()
{
  int a,b,c;
  a = 123; b = 456;
  c = mysum(a, b);
  printf("c=%d\n", c);
}

这里出现错误是因为 32位寄存器在64位体系结构中无法与堆栈进行交互

所以这里编译时加上 -m32

从汇编中调用C函数

sub.s

        .text
        .global sub, a, b, printf
sub:
        pushl  %ebp
        movl   %esp,%ebp
        pushl  b
        pushl  a
        pushl  $fmt        # push VALUE (address) of fmt
        call   printf      # printf(fmt,a,b);
        addl   $12, %esp
        movl   %ebp,%esp
        popl   %ebp
        ret
        .data
fmt:   .asciz   "a=%d b=%d\n"

sub.c

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

代码已托管:https://gitee.com/DKY2019/xxaqxt/tree/master/2.5

二、在OpenEuler中实现

1.环境

实践结果

64位openeuler操作系统无法执行32位可执行程序

posted @ 2021-12-05 21:12  20191331liyu  阅读(43)  评论(0编辑  收藏  举报