• 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位可执行程序

  • 相关阅读:
    Hadoop书籍介绍
    WeakReference,SoftReference 和 PhatomReference 浅析
    如何在Java中定义常量(Constant)
    也谈谈Java的垃圾收集(garbage collection)
    csdn的新家
    安装和使用Oracle Instant Client 和 SQLPlus
    Perl中的grep和map
    用Devel::NYTProf 优化perl脚本性能
    DataBase
    Linux下配置listener和tns
  • 原文地址:https://www.cnblogs.com/DKYcaiji/p/15615610.html
Copyright © 2020-2023  润新知