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