zoukankan      html  css  js  c++  java
  • OpenEuler 中C与汇编的混合编程(选做)

    OpenEuler 中C与汇编的混合编程(选做)

    作者:20191322wyl

    任务详情:

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

    X86_64架构下实践

    本次实验环境为Kali系统2021.2版本

    2.5.1用汇编代码编程

    1. 代码:
    #include<stdio.h>
    
    extern int B();
    
    int A(int x,int y)
    {
    	int d,e,f;
    	d =4; e =5; f=6;
    	d=B(d,e);
    }
    
    1. 因为要使用指令gcc -m32 -S指令进行编译,有的系统可能需要提前使用命令

      sudo apt-get install gcc-multilib g++-multilib module-assistant下载gcc32位库

      我这个系统不用下载就可以用

    2.5.2用汇编语言实现函数

    示例2.2

    s.s代码:

    		.global get_esp,get_ebp
    get_esp:
    		movl %esp,%eax
    		ret
    get_ebp:
    		movl %ebp,%eax
    		ret
    

    s.c代码:

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

    汇编指令:gcc -m32 s.s s.c -o s.out

    示例2.3

    mysum.s

    	.text
    	.global mysum,printf
    mysum:
    #(1)Entry:
    	pushl $ebp
    	movl %esp,%ebp
    #(2)Function Body code
    	movl 8(%ebp),%eax
    	addl 12(%ebp),%eax
    #(3)Exit Code
    	movl %ebp,%esp
    	pop %ebp
    	ret
    

    mysum.c

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

    运行结果:

    2.5.3从汇编中调用C函数

    示例2.4

    prt.c

    int a,b;
    int main()
    {
    	a = 100;b = 200;
    	sub();
    }
    

    prt.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
    	popl %ebp
    	ret
    	
    	
    	    .data
    fmt:	.asciz "a=%d b=%d\n"
    

    运行结果:

    OpenEuler中实践

    使用uname -m发现还是x86_64架构的

    先用2.1的例子试一下,发现了出现这个问题

    发现缺少gcc32位库

    使用命令yum install glibc-devel.i686 libstdc++-devel.i686

    但是显示找不到软件包,但是我已经用的是华为的官方源了

    所以采取另一种方式,将kali里面的包复制出来

    出了点问题,待解决

  • 相关阅读:
    文件操作回顾
    数据类型回顾
    面向对象三大特性之封装与多态
    面向对象之继承
    轮播图
    jQuery事件操作
    jQuery动画效果
    jQuery篇
    文档对象模型
    javascript
  • 原文地址:https://www.cnblogs.com/BillGreen/p/15642075.html
Copyright © 2011-2022 走看看