zoukankan      html  css  js  c++  java
  • 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"
    

  • 相关阅读:
    tbusers
    Dism解决win 10访问服务器共享问题,共享需要过时的SMB1协议,安装时错误代码:0x800736B3
    &【03】Python 变量与数据类型概览
    & 【01】 Spring源码编译
    &【02】Python 基础语法
    linux出现 -bash: fork: Cannot allocate memory 问题
    并发编程-15 ThreadPoolExecutor线程池
    Spring事务嵌套问题记录
    多线程笔试题记录
    & IDEA Debug启动失败或启动慢
  • 原文地址:https://www.cnblogs.com/dongjiashuai/p/15646809.html
Copyright © 2011-2022 走看看