OpenEuler 中C与汇编的混合编程(选做)
OpenEuler 中C与汇编的混合编程(选做)
作者:20191322wyl
任务详情:
- 在X86_64架构下实践2.5中的内容,提交代码和实践截图
- 把2.5的内容在OpenEuler中重新实践一遍,提交相关代码和截图
- 实验内容要经过答辩才能得到相应分数
X86_64架构下实践
本次实验环境为Kali系统2021.2版本
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;
d=B(d,e);
}
-
因为要使用指令
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里面的包复制出来
出了点问题,待解决