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


    20191218 2021-2022-1-diocs-OpenEuler中C与汇编的混合编程

    在X86_64架构下实践2.5中的内容

    1. 生成汇编代码

    2. 用汇编语言实现函数

    • 获取CPU寄存器
      首先编写hello.c、s.s以及makefile文件,make编译

      生成hello可执行文件

      运行结果

      清理

    • 用汇编语言编写mysum()函数
      编写mysum.s、main.c和makefile,make编译,运行结果

    • 从汇编中调用C函数
      首先编写sub.c、main.s、和makefile文件,make编译,运行结果

      清除

    在OpenEuler(X86_64架构)下实践2.5中的内容

    1. 生成汇编代码

    汇编代码a.s如下

    	.file	"a.c"
    	.text
    	.globl	A
    	.type	A, @function
    A:
    .LFB0:
    	.cfi_startproc
    	pushq	%rbp
    	.cfi_def_cfa_offset 16
    	.cfi_offset 6, -16
    	movq	%rsp, %rbp
    	.cfi_def_cfa_register 6
    	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)
    	nop
    	leave
    	.cfi_def_cfa 7, 8
    	ret
    	.cfi_endproc
    .LFE0:
    	.size	A, .-A
    	.ident	"GCC: (GNU) 7.3.0"
    	.section	.note.GNU-stack,"",@progbits
    

    生成汇编代码a.s

    	.arch armv8-a
    	.file	"a.c"
    	.text
    	.align	2
    	.global	A
    	.type	A, %function
    A:
    .LFB0:
    	.cfi_startproc
    	stp	x29, x30, [sp, -48]!
    	.cfi_def_cfa_offset 48
    	.cfi_offset 29, -48
    	.cfi_offset 30, -40
    	mov	x29, sp
    	str	w0, [sp, 28]
    	str	w1, [sp, 24]
    	mov	w0, 4
    	str	w0, [sp, 44]
    	mov	w0, 5
    	str	w0, [sp, 40]
    	mov	w0, 6
    	str	w0, [sp, 36]
    	ldr	w1, [sp, 40]
    	ldr	w0, [sp, 44]
    	bl	B
    	str	w0, [sp, 36]
    	nop
    	ldp	x29, x30, [sp], 48
    	.cfi_restore 30
    	.cfi_restore 29
    	.cfi_def_cfa_offset 0
    	ret
    	.cfi_endproc
    .LFE0:
    	.size	A, .-A
    	.ident	"GCC: (GNU) 10.3.1"
    	.section	.note.GNU-stack,"",@progbits
    
    

    2. 用汇编语言实现函数

    • 编写hello.c、s.s以及makefile


    • 编译运行

    在OpenEuler Raspberry(ARM架构)下实践2.5中的内容(尝试)

    1. 生成汇编代码

    2. 用汇编语言实现函数

    • 获取CPU寄存器
      首先编写s.s、hello.c和makefile文件

    由于树莓派是基于arm架构,x86中%esp对应SP(R13)寄存器,也就是栈顶寄存器;%ebp对FP(R11)应教材中所提供的是x86_32,于是改写代码hello.c

    x86中%eax对应arm中R0,改写代码s.s

    参考博客

  • 相关阅读:
    IMP本质上是一个通用的函数指针
    yourphp常用标签
    yourphp目录结构
    HTTP与HTTPS的区别
    https和http有什么区别
    如何把浏览器不信任的网址设置为可信任的网点
    ico图标在谷歌浏览器中如何显示?
    Yourphp是一款完全开源免费的.核心采用了Thinkphp框架
    No input file specified的解决方法apache伪静态
    一个服务器的吞吐率
  • 原文地址:https://www.cnblogs.com/20191218tangqiheng/p/15641371.html
Copyright © 2020-2023  润新知