OpenEuler中C与汇编混合编程
在X86_64架构下实践2.5中的内容,提交代码和实践截图
a.c
#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);
}
通过gcc -m32 -S a.c a.s
将a.c的汇编代码放入a.s中
a.s代码
.file "a.c"
.text
.globl A
.type A, @function
A:
.LFB0:
.cfi_startproc
endbr32
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
pushl %ebx
subl $20, %esp
.cfi_offset 3, -12
call __x86.get_pc_thunk.ax
addl $_GLOBAL_OFFSET_TABLE_, %eax
movl $4, -20(%ebp)
movl $5, -16(%ebp)
movl $6, -12(%ebp)
subl $8, %esp
pushl -16(%ebp)
pushl -20(%ebp)
movl %eax, %ebx
call B@PLT
addl $16, %esp
movl %eax, -12(%ebp)
nop
movl -4(%ebp), %ebx
leave
.cfi_restore 5
.cfi_restore 3
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size A, .-A
.section .text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
.globl __x86.get_pc_thunk.ax
.hidden __x86.get_pc_thunk.ax
.type __x86.get_pc_thunk.ax, @function
__x86.get_pc_thunk.ax:
.LFB1:
.cfi_startproc
movl (%esp), %eax
ret
.cfi_endproc
.LFE1:
.ident "GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
.section .note.GNU-stack,"",@progbits
.section .note.gnu.property,"a"
.align 4
.long 1f - 0f
.long 4f - 1f
.long 5
0:
.string "GNU"
1:
.align 4
.long 0xc0000002
.long 3f - 2f
2:
.long 0x3
3:
.align 4
4:
用汇编语言实现函数
mysum函数返回x和y的和
mysum.c
int main(){
int a,b,c;
a=123;b=456;
c=mysum(a,b);
printf("c=%d\n",c);
}
.text
.global mysum,printf
mysum:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
addl 12(%ebp),%eax
movl %ebp,%esp
pop %ebp
ret
运行结果:
在汇编中调用C函数
访问全局变量并调用printf
把2.5的内容在OpenEuler中重新实践一遍,提交相关代码和截图
因为openEuler中不支持32位编程,暂时还未实现