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
参考博客
- ARM汇编基础教程——数据类型和寄存器(强烈推荐先看这个,快速找到arm和x86的对应关系)
- 解析ARM的几个关键寄存器
- EBP 和 ESP 详解
- arm中在代码中获取寄存器的值
- arm指令集汇总
- ARM寄存器及功能介绍