一、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
二、实例
- 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位程序。
# 链接器内有个默认的链接脚本 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:附加数据段寄存器
1、GNUC C 语言嵌入汇编
Linux下C语言asm,linux下的C语言的asm内嵌式汇编
c语言关键字asm的用法,在 C语言中,如何通过 asm 关键字嵌入汇编语言代码
2、GNUC 汇编
x86 Assembly Language Reference Manual(AT&T syntax)