C 语言与嵌入汇编

简介: C 语言与嵌入汇编

一、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:附加数据段寄存器

image.png

image.png

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的汇编世界

加入bin编译

如何在嵌入式C工程中添加bin文件一块编译

ARM汇编伪指令介绍

目录
相关文章
|
7月前
|
存储 编译器 程序员
C语言之反汇编查看函数栈帧的创建与销毁(一)
C语言之反汇编查看函数栈帧的创建与销毁(一)
C语言之反汇编查看函数栈帧的创建与销毁(一)
|
编译器 Linux C语言
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)(上)
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)
|
2月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
48 0
|
7月前
|
Java C++
如何在JAVA代码中嵌入汇编
如何在JAVA代码中嵌入汇编
118 1
|
7月前
|
算法 C语言
约瑟夫环的C语言和86/88汇编非递归算法
约瑟夫环的C语言和86/88汇编非递归算法
77 0
|
7月前
|
存储 编译器 程序员
C语言之反汇编查看函数栈帧的创建与销毁(二)
C语言之反汇编查看函数栈帧的创建与销毁(二)
|
7月前
|
存储 缓存 Linux
C语言编译过程——预处理、编译汇编和链接详解
C语言编译过程——预处理、编译汇编和链接详解
|
7月前
|
存储 NoSQL 编译器
C语言的本质(二):汇编与C
C语言的本质(二):汇编与C
96 0
|
编译器 C语言
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)(下)
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)
|
C语言 C++
C语言实现反汇编【微机原理】
C语言实现反汇编【微机原理】
99 1