文章目录
- 一、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
【asm基础】asm函数和c++函数之间的相互调用
二、实例
- 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)
- 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
- 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.cpp 是 CPP 文件,所以需要加上 extern “C” 。
三、补充知识
1、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?)
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内联汇编
ARM官方汇编指令
链接脚本.lds(详细)总结附实例快速掌握
# 链接器内有个默认的链接脚本
ld -verbose
bootloader与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 关键字嵌入汇编语言代码
内嵌汇编(ARM64)
2、GNUC 汇编
x86汇编_指令集大全_笔记_6
x86 Assembly Language Reference Manual(AT&T syntax)
AT&T汇编