zoukankan      html  css  js  c++  java
  • 2.5 OpenEuler 中C与汇编的混合编程(选做)

    2.5 OpenEuler 中C与汇编的混合编程(选做)


    0.任务详情

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

    1.首先在x86_64kali中实践内容。

    1.1

    image-20211127213534928

    入口代码

    image-20211127215157320

    函数体代码

    image-20211127215251559

    退出代码

    image-20211127215338124

    1.2

    image-20211127215930987

    image-20211127222712201

    这里有点绕,得分两个文件进行编译,一个是s.s,另一个是s.c,将两份文件编译成.o文件再一起编译成可执行文件。

    1.3

    image-20211128114734035

    这里编译出现问题是因为编译环境应该是32位的,这里的pop和push产生的是32位,但是系统环境应该是64位的,所以类型不匹配,需要再过程中加上-m32。(或者将所有指令都换成xxxl是否可行?)

    参考博客:https://www.codenong.com/21245245/

    1.4

    image-20211128115644632

    这里问题与上面相同,编译加上-m32即可通过。

    代码链接:https://gitee.com/sister_ben/kali/tree/master/test2-5

    2.接下来在树莓派openeuler中完成。

    在openeuler中的源都没有有关32位库的安装包,无法安装32位编译环境,所以将32位编译代码改为64位代码。

    操作环境:openeuler

    2.5.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);
    }
    

    a.s file

    A:
    	pushq %rbp
    	movq %rsp, %rbp
    	subq $32, %rsp
    	movl %edi, -20(%rbp)
    	movl %esi, -24(%rbp)
    	movl $4, -4(%rbp)
    	movl $5, -8(%rbp)
    	movl $6, -12(%rbp)
    	movl -8(%rbp), %edx
    	movl -4(%rbp), %eax
    	movl %edx, %esi
    	movl %eax, %edi
    	movl $0, %eax
    	call B
    	movl %eax, -12(%rbp)
    	leave
    	ret
    

    2.5.2用汇编语言实现函数

    获取CPU寄存器

    s.s file

    .globl get_esp, get_ebp
    get_esp:
    	movq %rsp, %rax
    	ret
    get_ebp:
    	movq %rsp, %rax
    	ret
    

    print.c

    #include <stdio.h>
    int main(){
    	int ebp, esp;
    	ebp = get_ebp();
    	esp = get_esp();
    	printf("rbp=%8x rsp=%8x\n", ebp, esp);
    }
    

    运行截图

    用汇编语言编写mysum函数

    mysum.s

    	.text
    	.global mysum, printf
    mysum:
    
    	pushq %rbp  movq %rsp, %rbp
    	movl %edi, -4(%rbp) movl %esi, -8(%rbp)
    
    	movl -8(%rbp), %eax addl -4(%rbp), %eax
    
    	popq %rbp
    	ret
    

    sum.c

    #include <stdio.h>
    int main(){
    	int a, b, c;
    	a = 123;
    	b = 456;
    	c = mysum(a, b);
    	printf("c=%d\n",c);
    }
    

    编译截图

    image-20211205225145353

    2.5.3从汇编中调用C函数

    sub.s

    	.text
    	.global sub, a, d, printf
    sub:
    	pushq %rbp
    	movq %rsp, %rbp
    	movl b, %edx
    	movl a, %esi
    	movl $fmt, %edi
    	call printf
    	leave
    	ret
    	.data
    fmt: .asciz "a=%d b=%d\n"
    

    submain.c

    #include <stdio.h>
    	int a, b;
    	int main(){
    	a = 100;
    	b = 200;
    	sub();
    }
    

    编译运行截图

    image-20211205225125928

  • 相关阅读:
    Android sendToTarget
    OSI七层模型具体解释
    JAVA中字符串比較equals()和equalsIgnoreCase()的差别
    [Angular 2] ng-class and Encapsulated Component Styles
    [Angular 2] Passing data to components with @Input
    [Angular 2] Template property syntax
    [Angular 2] Adding a data model
    [Angular 2] Using ng-model for two-way binding
    [Angular 2] ngFor
    [Angular 2] Inject Service
  • 原文地址:https://www.cnblogs.com/sisterben/p/15615032.html
Copyright © 2011-2022 走看看