OpenEuler中C与汇编混合编程

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位编程,暂时还未实现

posted @ 2021-12-07 10:23  20191231  阅读(51)  评论(0编辑  收藏  举报