C 语言与嵌入汇编

news2025/1/13 7:45:52

在这里插入图片描述

文章目录

  • 一、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汇编

832-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp

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

88-bit寄存器  %ah,%al,%bh,%bl,%ch,%cl,%dh,%dl
它们事实上是寄存器%ax,%bx,%cx,%dx的高8位和低86个段寄存器   %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:附加数据段寄存器

寄存器是否有约束惯例/用途
rax1,系统调用时,调用号;
2,函数返回值;
3,除法运算中,存放除数、以及运算结果的商;
4,乘法运算中,存放被乘数、以及运算结果;
rbx是,被调用者保存1,在32位模式下,用来存放GOT的地址;
rcx1,函数调用时,第4个参数;
2,有时用作counter;
rdx1,函数调用时,第3个参数;
2,除法运算中,存放运算结果的余数;
3,乘法运算中,存放运算结果溢出的部分;
rbp是,被调用者保存frame pointer,存放当前函数调用时栈的基地址
rsp是,被调用者保存时时刻刻指向栈顶
rdi1,函数调用时,第1个参数;
2, rep movsb中的目的寄存器;
rsi1,函数调用时,第2个参数;
2, rep movsb中的源寄存器;
r81,函数调用时,第5个参数
r91,函数调用时,第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的汇编世界

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows逆向安全(一)之基础知识(十四)

指针 什么是指针 一般关于指针的解释都离不开地址。这里先暂且忘记这个概念 指针其实也是一种数据类型&#xff0c;和先前学习的int float等数据类型没有实质上的区别&#xff0c;只不过这个数据类型是在先前学习的所有数据类型后面加上若干个*号&#xff0c;如char *&#…

数字化时代,如何推动实体经济和数字经济的融合

实体经济是一国经济的立身之本和命脉所在&#xff0c;数字经济是当今世界科技革命和产业变革的阵地前沿&#xff0c;推动数字经济和实体经济融合发展&#xff0c;已经成为新形势下主动把握新机遇、打造新引擎、实现经济高质量发展的必然选择。 领域融合 真正能够成为现代社会…

Pyhon实现多线程 —— threading(含源码)

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

LRU扩展LRU-K、2Q算法实现分析

LRU算法的缓存污染如何解决&#xff1f; 一、LRU-K算法 1、算法思想 LRU-K中的K代表最近使用的次数&#xff0c;因此LRU可以认为是LRU-1。LRU-K的主要目的是为了解决LRU算法“缓存污染”的问题&#xff0c;其核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”…

【CocosCreator入门】CocosCreator组件 | PageView(页面视图)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的PageView组件是一种用于实现分页视图效果的重要组件。它可以让我们在游戏中实现各种分页视图效果&#xff0c;例如引导页、轮播图等。 目录 一、组件介绍 二、组件属性 三、组件使…

OpenCV算法加速的一些学习总结

一、概述 算法加速在实际软件层面应用来说 大数据和复杂计算的过程中 算法优化&#xff0c;指降低算法计算复杂度&#xff0c;设计新算法快速求解&#xff0c;比如Hungarian匹配算法。或牺牲一些内存&#xff0c;预计算一些重复计算的过程&#xff0c;减少程序层面的复杂度。 …

c语言实例练习笔记

本博文参考题目的地址看右边----》C 语言实例 | 菜鸟教程 以下为个人边练习边敲记录&#xff08;解法不一定和官方一样&#xff0c;会自己扩展一些&#xff0c;练习嘛&#xff0c;肯定是学到的都用上&#xff0c;算检验之前的学进去的是不是对的。&#xff09; C 语言实例 - …

【项目管理】ubuntu2204 图片合成视频

ubuntu 22.04 多张图片合成视频&#xff0c;多个视频合成一个大视频 环境&#xff1a; ubuntu 22.04 LTS 工具&#xff1a; ffmpeg ffmpeg 多张图片合成视频 在 ubuntu 下全选目录下的所有文件&#xff0c;右键 rename, 选择 1,2,3,4 即可&#xff1b;当然也可以使用其他命名方…

uni-app 中模拟器真机运行app

之前打包过app&#xff0c;调试方式是用usb连接电脑和手机&#xff0c;过程中也遇到了很多问题&#xff0c;忘记了怎么解决的&#xff0c;今天又遇到了打包app的项目&#xff0c;因为在开发app这方面经验不足&#xff0c;所以踩了很多坑&#xff0c;花了好几个小时才研究好app在…

学系统集成项目管理工程师(中项)系列06a_信息系统安全管理(上)

1. 信息安全 1.1. 保护信息的保密性、完整性、可用性 1.2. 另外也包括其他属性&#xff0c;如&#xff1a;真实性、可核查性、不可抵赖性和可靠性 2. 信息安全属性及目标 2.1. 保密性(Confidentiality&#xff09; 2.1.1. 信息不被泄露给未授权的个人、实体和过程或不被其…

【python】统计代码行数 | 统计当前文件夹里所有代码文件的行数

背景 写了一堆.cs文件 想看看一共写了多少行 代码 import os import chardet# Check if a file has the given extension def has_extension(file, extension):return os.path.splitext(file)[1] extension# Count the number of non-empty lines in a file def count_line…

拍照时脸背光怎么办?拍摄的逆光人像照如何修复才能更好看?

拍摄逆光人像会产生迷人的轮廓光&#xff0c;发丝看起来会很美丽&#xff0c;并可能拍到好看的星芒&#xff0c;但是&#xff01;直接拍摄很可能经常会对不上焦&#xff0c;或者会拍出大黑脸&#xff0c;这时就需要很多技巧啦。 完成一张好的逆光照片需要前期拍摄和后期修图相…

生成式模型与辨别式模型

分类模型可以分为两大类:生成式模型与辨别式模型。本文解释了这两种模型类型之间的区别&#xff0c;并讨论了每种方法的优缺点。 辨别式模型 辨别式模型是一种能够学习输入数据和输出标签之间关系的模型&#xff0c;它通过学习输入数据的特征来预测输出标签。在分类问题中&…

Revit相关问题:符号线,转转问题,生成三维视图

一、Revit符号线如何画粗一些?如何自定义符号线子类别? 1、Revit在族里面符号线的粗细、显示颜色、显示线型为符号线的子类别控制! 你可以通过&#xff0c;管理选项卡新建子类别&#xff0c;然后在画符号线的时候应用该子类别! 新建符号线对象样式 应用子类别 二、Revit三维模…

YOLOv7+单目跟踪

YOLOv7单目跟踪 1. 目标跟踪2. 测距模块2.1 设置测距模块2.2 添加测距 3. 实验效果 相关链接 1. YOLOv5单目测距&#xff08;python&#xff09; 2. YOLOv7单目测距&#xff08;python&#xff09; 3. 具体效果已在Bilibili发布&#xff0c;点击跳转 1. 目标跟踪 用yolov7实现…

Moviepy模块之视频添加图片水印

文章目录 前言视频添加图片水印1.引入库2.加载视频文件3.加载水印图片4.缩放水印图片大小5.设置水印的位置5.1 相对于视频的左上角5.2 相对于视频的左下角5.3 相对于视频的右上角5.4 相对于视频的右下角5.5 相对于视频的左中位置5.6 相对于视频的正中位置5.7 相对于视频的右中位…

【设计模式】23种设计模式之结构型模式

一、适配器设计模式 1、是什么&#xff1f; 1、适配器模式将某个类的接口转换成客户端期望的另一个接口表示&#xff0c;主要的目的是兼容性&#xff0c;让原本因接口不匹配不能一起工作的两个类可以协同工作 2、适配器模式属于结构型模式 3、主要分为三类&#xff1a;类适配…

【机器学习】EM原理和K-mean聚类

一、教程说明 EM算法就是expect maxmise算法&#xff0c;就是“期望最大化”的缩写。本篇首先提出&#xff1a;1 什么是期望&#xff1f; 2 期望最大化是个啥意思&#xff1f;k-mean聚类中如何用EM算法&#xff1f; 所涉及的概念&#xff1a; 期望 期望的加权平均理解 概率…

工业网关开发:IxCahriot测试吞吐量

吞吐量测试可以确定被测试设备或被测试系统在不丢弃包的情况下&#xff0c;设备或系统能够接受并转发的最大有效数据。在测试中以一定的速率发送一定数量的帧&#xff0c;并计算待测设备接收的帧&#xff0c;如果发送的帧与接受的帧数量相等&#xff0c;那么就将发送速率提高并…

ASEMI代理ADA4940-1ACPZ-R7原装ADI车规级ADA4940-1ACPZ-R7

编辑&#xff1a;ll ASEMI代理ADA4940-1ACPZ-R7原装ADI车规级ADA4940-1ACPZ-R7 型号&#xff1a;ADA4940-1ACPZ-R7 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;LFCSP-16 批号&#xff1a;2023 引脚数量&#xff1a;16 安装类型&#xff1a;表面贴装型 ADA4940-1ACPZ-…