C 语言与嵌入汇编_函数调用


文章目录

  • 一、cmake构建汇编语言
  • 二、实例
  • 三、补充知识
  • 1、enable_language
  • 2、 汇编
  • 四、AT&T汇编
  • 1、GNUC C 语言嵌入汇编
  • 2、GNUC 汇编



一、cmake构建汇编语言

Linux下在CMakeLists中加入
ENABLE_LANGUAGE(ASM) # GAS(AT&T)

ENABLE_LANGUAGE(ASM_NASM) # NASM(Intel)
 
Windows下在CMakeLists中加入
ENABLE_LANGUAGE(ASM_MASM)

Linux下使用CMake构建含nasm汇编的C/C++项目

No CMAKE_ASM_NASM_COMPILER could be found
解决办法:
sudo apt install nasm

DCTNet 安装 libjpeg-turbo-2.0.3 报 no cmake_asm_nasm_compiler could be found

带有CPP和ASM的CMake项目

【asm基础】asm函数和c++函数之间的相互调用

二、实例

  1. CMakeLists.txt
// CMakeLists.txt
cmake_minimum_required(VERSION 3.24.2)
project(TestProject VERSION 0.1 LANGUAGES CXX ASM)
add_executable(TestProject main.cpp foo.s)
  1. foo.s
# foo.s
.text
.globl foo
foo:
add %esi, %edi #// add x and y
mov %edi, %eax #// move result to correct register for return value
ret
  1. main.cpp
// main.cpp
#include <iostream>
using namespace std;

extern "C" int foo(int x, int y);

int main() {
  int result = foo(100, 200);
  cout << result << endl;
}

    因为是 main.cppCPP 文件,所以需要加上 extern “C”

三、补充知识

1、enable_language

enable_language

SET(CMAKE_ASM_NASM_SOURCE_FILE_EXTENSIONS asm) # 设置NASM的文件扩展名为asm
ENABLE_LANGUAGE(ASM_NASM) # 让CMacke启用NASM的汇编
 

Supported languages are C, CXX (i.e. C++), CSharp (i.e. C#), CUDA, OBJC (i.e. Objective-C), OBJCXX (i.e. Objective-C++), Fortran, HIP, ISPC, Swift, ASM, ASM_NASM, ASM_MARMASM, ASM_MASM, and ASM-ATT

2、 汇编

ASM:MASM,NASM,FASM

ASM:MASM,NASM,FASM?(ASM: MASM, NASM, FASM?)

MASM (微软汇编)是Windows流行的汇编。 MASM为16位和32位应用程序( x86 )。 ML64是一个64个源( AMD64/x86-64 )
NASM (网际汇编器)是Linux的流行汇编,但可以用的Windows了。 NASM支持16位,32位和64个程序。
FASM (平汇编),可用于Windows和Linux。 FASM太支持32位和64位程序。

Intel 汇编 和 AT&T 汇编

AT&T汇编

gcc内联汇编与AT&T语法

GCC内联汇编

AT&T标准语法

GCC内联汇编



在Visual Studio2019中使用汇编语言编写程序



ARM官方汇编指令

链接脚本.lds(详细)总结附实例快速掌握

linux链接文件ld—目标文件

# 链接器内有个默认的链接脚本
ld -verbose

bootloader与linux中位置无关代码(PIC)的分析理解

深入理解 Linux 位置无关代码 PIC

四、AT&T汇编

8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp

8个16-bit寄存器 它们事实上是上面8个32-bit寄存器的低16位:
%ax,%bx,%cx,%dx,%di,%si,%bp,%sp

8个8-bit寄存器  %ah,%al,%bh,%bl,%ch,%cl,%dh,%dl
它们事实上是寄存器%ax,%bx,%cx,%dx的高8位和低8位

6个段寄存器   %cs(code),%ds(data),%ss(stack), %es,%fs,%gs

3个控制寄存器 %cr0,%cr2,%cr3; 

6个debug寄存器  %db0,%db1,%db2,%db3,%db6,%db7;

2个测试寄存器  %tr6,%tr7; 

8个浮点寄存器栈 %st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),%st(7)

16个逻辑上的通用寄存器 rax, rbx, rcx, rdx, rbp, rsp, rdi, rsi, r8~r15

以E开头的寄存器为32位
EAX(累加器,是算术运算的主要寄存器)
EBX(基址寄存器,在内存中寻址时存放基址)
ECX(计数器)
EDX(数据寄存器)
ESI(源变址)
EDI(目标变址)
ESP(堆栈指针)
EBP(基址指针)
EIP(程序计数器,存储的是将要执行的下一条指令放在内存中的地址)
EFLAGS(保存的是根据运算得到的结果设置的条件码ZF,CF,SF,OF)

段寄存器:
CS:代码段寄存器
SS:堆栈段寄存器
DS:数据段寄存器
ES、FS、GS:附加数据段寄存器

寄存器

是否有约束

惯例/用途

rax


1,系统调用时,调用号;

2,函数返回值;

3,除法运算中,存放除数、以及运算结果的商;

4,乘法运算中,存放被乘数、以及运算结果;

rbx

是,被调用者保存

1,在32位模式下,用来存放GOT的地址;

rcx


1,函数调用时,第4个参数;

2,有时用作counter;

rdx


1,函数调用时,第3个参数;

2,除法运算中,存放运算结果的余数;

3,乘法运算中,存放运算结果溢出的部分;

rbp

是,被调用者保存

frame pointer,存放当前函数调用时栈的基地址

rsp

是,被调用者保存

时时刻刻指向栈顶

rdi


1,函数调用时,第1个参数;

2, rep movsb中的目的寄存器;

rsi


1,函数调用时,第2个参数;

2, rep movsb中的源寄存器;

r8


1,函数调用时,第5个参数

r9


1,函数调用时,第6个参数

r10


r11


r12

是,被调用者保存

r13

是,被调用者保存

r14

是,被调用者保存

r15

是,被调用者保存

1、GNUC C 语言嵌入汇编

2.2.1 GNU C内嵌汇编语言

Linux下C语言asm,linux下的C语言的asm内嵌式汇编

c语言关键字asm的用法,在 C语言中,如何通过 asm 关键字嵌入汇编语言代码

C语言中嵌入汇编

内嵌汇编(ARM64)

2、GNUC 汇编

x86汇编语法基础(gnu格式)

x86汇编_指令集大全_笔记_6

x86 Assembly Language Reference Manual(AT&T syntax)

AT&T汇编

AT&T的汇编世界