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里面的包复制出来

出了点问题,待解决

posted @ 2021-12-04 15:08  20191322  阅读(72)  评论(0编辑  收藏  举报