2.5 OpenEuler 中C与汇编的混合编程

2.5 OpenEuler 中C与汇编的混合编程

  • 任务详情
    1. 在X86_64架构下实践2.5中的内容,提交代码和实践截图
    2. 把2.5的内容在OpenEuler中重新实践一遍,提交相关代码和截图
    3. 实验内容要经过答辩才能得到相应分数

2.1

/**********a.c file********/
#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);
}

汇编代码

.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.4.0-1ubuntu1~20.04) 9.4.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:

2.2

代码:

#include <stdio.h>
extern int get_ebp();
extern int get_esp();
int main()
{
    int ebp, esp;
    ebp = get_ebp();
    esp = get_esp();
    printf("ebp=%8x     esp=%8x\n",ebp,esp);
}
  • 汇编代码:
    .section .text
    .global get_esp, get_ebp
get_esp:
    movl    %esp, %eax
    ret
get_ebp:
    movl    %ebp, %eax
    ret

2.3

  • 代码:
#include <stdio.h>
extern int mysum(int a, int b);
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

2.4

  • 代码:
int a,b;
int main()
{
	a = 100;b = 200;
	sub();
}
  • 汇编代码:
	.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"

posted @ 2021-12-05 19:32  20191302董佳帅  阅读(30)  评论(0编辑  收藏  举报
/* 看板娘 */