GCC内联汇编

GCC 内联汇编语法 阅读详情

一.基本内联汇编的格式是:
__asm__ __volatile__("Instruction List");

1. __asm__
__asm__是GCC 关键字asm 的宏定义:
#define __asm__ asm
__asm__或asm 用来声明一个内联汇编表达式,所以任何一个内联汇编表达式都是以它开头的,是必不可少的。

2. Instruction List
Instruction List 是汇编指令序列。它可以是空的,比如:__asm__ __volatile__(""); 或
__asm__ ("");都是完全合法的内联汇编表达式,只不过这两条语句没有什么意义。但并非所有Instruction List 为空的内联汇编表达式都是没有意义的,比如:__asm__ ("":::"memory");
就非常有意义,它向GCC 声明:“内存作了改动”,GCC 在编译的时候,会将此因素考虑进去。
当在"Instruction List"中有多条指令的时候,可以在一对引号中列出全部指令,也可以将一条
或几条指令放在一对引号中,所有指令放在多对引号中。如果是前者,可以将每一条指令放在一行,如果要将多条指令放在一行,则必须用分号(;)或换行符(/n)将它们分开.
综上述:(1)每条指令都必须被双引号括起来 (2)两条指令必须用换行或分号分开。
例如:
__asm__("movl %eax, %ebx; sti/n/t"
"popl %edi; subl %ecx, %ebx");

3. __volatile__
__volatile__是GCC 关键字volatile 的宏定义
#define __volatile__ volatile
__volatile__或volatile 是可选的。如果用了它,则是向GCC 声明不允许对该内联汇编优化,否则当
使用了优化选项(-O)进行编译时,GCC 将会根据自己的判断决定是否将这个内联汇编表达式中的指令优化掉。

在基本内联汇编里可以使用全局变量

二.扩展的内联汇编格式为
__asm__ __volatile__("Instruction List"
: Output
: Input
: Clobber/Modify);

这4 个部分都不是必须的,任何一个部分都可以为空,其规则为:
(1)如果Clobber/Modify 为空,则其前面的冒号(:)必须省略。比如
__asm__("mov %%eax, %%ebx" : "=b"(foo) : "a"(inp) : )就是非法的写法;
而__asm__("mov %%eax, %%ebx" : "=b"(foo) : "a"(inp) )则是正确的。
(2)如果Instruction List 为空,则Input,Output,Clobber/Modify 可以不为空,也可以为空。
比如__asm__ ( " " : : : "memory" );和__asm__(" " : : );都是合法的写法。
(3)如果Output,Input,Clobber/Modify 都为空,Output,Input 之前的冒号(:)既可以省略,
也可以不省略。如果都省略,则此汇编退化为一个基本内联汇编,否则,仍然是一个扩展的内联汇编,
此时"Instruction List"中的寄存器写法要遵守相关规定,比如寄存器前必须使用两个百分号(%%),而不是像基本汇编格式一样在寄存器前只使用一个百分号(%) 。
比如__asm__( " mov %%eax,%%ebx" : : );
__asm__( " mov %%eax, %%ebx" : )和__asm__( " mov %eax, %ebx" )都是正确的写法,
而__asm__( " mov %eax, %ebx" : : );__asm__( " mov %eax,%ebx" : );
__asm__( " mov %%eax, %%ebx" )都是错误的写法。
(4) 如果Input,Clobber/Modify 为空,但Output 不为空,Input 前的冒号(:)既可以
省略,也可以不省略。比如__asm__( " mov %%eax, %%ebx" : "=b"(foo) : );
__asm__( " mov %%eax, %%ebx" : "=b"(foo) )都是正确的。
(5)如果后面的部分不为空,而前面的部分为空,则前面的冒号(:)都必须保留,否则无
法说明不为空的部分究竟是第几部分。比如, Clobber/Modify,Output 为空,
而Input 不为空,则Clobber/Modify 前的冒号必须省略(前面的规则),而Output
前的冒号必须为保留。如果Clobber/Modify 不为空,而Input 和Output 都为空,
则Input 和Output 前的冒号都必须保留。比如__asm__( " mov %%eax, %%ebx" : :
"a"(foo) )和__asm__( " mov %%eax, %%ebx" : : : "ebx" )。
总之不能有歧义.

1. Output
Output 用来指定当前内联汇编语句的输出
2. Input
Input 域的内容用来指定当前内联汇编语句的输入
Output和Input中,格式为形如“constraint”(variable)的列表(逗号分隔)
3. Clobber/Modify
Clobber/Modify 声明当前内联汇编在Instruction List中对某些寄存器或内存进行修改。不能有Input或Output中限制的寄存器

===================================================================================
Constraint Description
a Use the %eax, %ax, or %al registers.
b Use the %ebx, %bx, or %bl registers.
c Use the %ecx, %cx, or %cl registers.
d Use the %edx, %dx, or $dl registers.
S Use the %esi or %si registers.
D Use the %edi or %di registers.
r Use any available general-purpose register.
q Use either the %eax, %ebx, %ecx, or %edx register.
A Use the %eax and the %edx registers for a 64-bit value.
f Use a floating-point register.
t Use the first (top) floating-point register.
u Use the second floating-point register.
m Use the variable’s memory location.
o Use an offset memory location.
V Use only a direct memory location.
i Use an immediate integer value.
n Use an immediate integer value with a known value.
g Use any register or memory location available.
gcc 内联汇编用法介绍 前言大部分内容翻译提取自某国外HOW-TO文档,原地址: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html AT&T汇编语法gcc内联汇编语法采用AT&T格式,主要不同有五个方面 1. 源操作数和目标操作数的位置与intel格式不同 2. 寄存器命名,AT&T在寄存器前加百分号(%) 3. 字面值前加美元符号($ 阅读详情

相关推荐

DPDK gcc内联汇编

dpdk 内联汇编

fengcai_ke的博客 505

Gcc内联汇编1

GCC Inline ASMGCC支持在C/C++代码中嵌入汇编代码,这些汇编代码被称作GCC InlineASM——GCC内联汇编。这是一个非常有用的功能,有利于我们将一些C/C++语法无法表达的指令直接潜入C/C++代码中,另外也允许我们直接写C/C++代码中使用汇编编写简洁高效的代码。1.基本内联汇编基本内联汇编的格式是__asm__ __

木马屠城 1194

五本CPP经典书籍&gcc源代码地址

svn://gcc.gnu.org/svn/gcc/trunk这个是GCC源代码的地下SVN的。 1.The C++ Programming Language Special 3rd Edition.pdf 2.Addison.Wesley.Effective.C.Plus.Plus.55.Specific.Ways.to.Improve.Your.Programs.and.Designs.3rd.Edition.May.2005.eBook-DDU.chm 3.Addison-Wesley - Design Patterns @ Elements of Reusable Object-Oriented Software.pdf 4.ISO 14882 C++2003.pdf 5.Addison.Wesley.Modern.C++.Design-.Generic.Programming.and.Design.Patterns.Applied.pdf

GCC-内联汇编

认识GCC内联汇编,读懂GCC内联汇编

m0_46929878的博客 1366

python实现RsaWithSHA256签名以及国密Sm3WithSm2签名

【代码】python实现RsaWithSHA256签名以及国密Sm3WithSm2签名。

weixin_45005677的博客 3352

从IMC层到应力点:手把手教你用SEM/EDS给BGA焊点做一次‘体检’

本文详细介绍了如何使用SEM/EDS技术对BGA焊点进行全面失效分析,从样品制备到SEM观察、EDS分析,再到综合诊断,手把手教你识别焊点的微观特征和成分异常。文章特别强调了IMC层分析在BGA焊接失效诊断中的关键作用,并提供了实用的实验室技巧和常见失效模式对照表,帮助工程师快速定位问题根源。

weixin_42685438的博客 379

gcc 内联汇编简介

啊 啊 在内联汇编中,标识寄存器的一个%变成了两个% 啊 如图是内联汇编的模板 assembler template 是汇编代码 output operands TODO input operands TODO clobbers TODO 啊 如图,这个内联汇编的含义是: 1. 把 cr0 寄存器的内容读入到变量 uint32_t cr0 中 2. 对变量 uint32_t cr0 进行...

shimly123456的博客 253

AI Agent开发第84课-paddleocr-vl全网唯一最全本地化布署教程

本文详解 PaddleOCR-VL 本地化布署全过程,指出为何在真实生产环境中 PaddleOCR-VL 更稳定、更易部署、更贴近工程落地。同时还会详细比较与 DeepSeek-OCR 的核心差异,为全网独家介绍paddleocr-vl的本地部署实战指南。

打造全国最全的AI Agent开发知识领域的博客 5966

GCC内联汇编基础

GCC内联汇编基础 (为了方便阅读,做成了pdf 格式,有目录: http://download.youkuaiyun.com/source/903658)     GCC内联汇编基础 Sandeep.S (原作者)v0.1, 01 March 2003.  翻译:fancylea 版权所有,禁止用作商业用途。 http://blog.youkuaiyun.com/fancylea

※旅程※ 1840

VSCode 中搭建 Python 开发环境

**验证安装**:打开终端(CMD/PowerShell/终端),输入 `python --version`(Windows)或 `python3 --version`(macOS/Linux),显示版本号即成功。- **下载地址**:[Python 官网](https://www.python.org/downloads/)(选择对应系统的最新稳定版,推荐 3.8+)- **调试**:通过 `launch.json` 配置,设置断点后按 `F5` 启动,使用 `F10/F11` 控制流程。

寒寒豆豆软件公司的博客 2534

【图像增强】论文精读:Correlation Matching Transformation Transformers for UHD Image Restoration(UHDformer)

论文题目:Correlation Matching Transformation Transformers for UHD Image Restoration —— 用于UHD图像恢复的相关匹配变换变压器AAAI 2024!本文提出了一种用于超高清(UHD)图像恢复的通用变压器UHDformer。UHDformer包含两个学习空间:(a) 高分辨率空间中的学习,(b)低分辨率空间中的学习。前者学习多层次的高分辨率特征,融合低层特征,重建残差图像,后者从高分辨率特征中学习更多的代表性特征,以促进更好的恢复。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 289

GCC 内联汇编

LINUX 下GCC 汇编

海鲨数据库架构师 1304

基于FPGA的BP神经网络Verilog设计与Matlab仿真

BP(Backpropagation)神经网络是一种常见且广泛应用的神经网络类型,通过反向传播算法实现训练和学习。本文将介绍如何使用Verilog语言在FPGA上设计一个简易的BP神经网络,并使用Matlab进行仿真验证。BP神经网络由输入层、隐藏层和输出层组成。在上述Verilog代码中,我们定义了BP神经网络的输入层、隐藏层和输出层的神经元数量,并声明了相应的信号和参数。在上述Verilog代码中,我们定义了BP神经网络的输入层、隐藏层和输出层的神经元数量,并声明了相应的信号和参数。

2301_79326254的博客 559

riscv下的GCC内联汇编

GCC内联汇编 文章目录GCC内联汇编语法规则输入操作数与输出操作数可能影响的寄存器或存储器Example汇编中调用C/C++函数 语法规则 asm volatile( 汇编指令列表 ∶输出操作数 //非必需 ∶输入操作数 //非必需 ∶可能影响的寄存器或存储器 1/非必需 ); Explanation asm 是GCC的关键字,表示内联汇编操作,注 __asm__ 是GCC中asm的宏定义,也可以使用 volatile 或者 __volatile__ 是可选的,表示不进行任何优化,否则某些

m0_52050582的博客 6163

【STK】手把手教你利用STK进行弹道导弹和运载火箭发射仿真的相关方法全过程解析

写这个系列主要是这几年做了一些弹道导弹和运载火箭发射的相关仿真项目,stk软件由于其专业性在国内比较小众,相关的教程和书籍、经验贴都不是很多,因此新手在进行开发中容易遇到较多困难,把自己的一些经验体会写下来,一方面供自己总结回顾,另一方面也希望对大家有所帮助。这个系列计划分几篇文章写完,每章的内容结构相似,都分为①如何确定发射场位置和发射轨迹、②导入导弹和运载火箭模型、③设计模型分段动作、④飞行参数分析和相关应用这四个部分,每篇文章争取完整描述1-2个实际项目的操作过程。

weixin_44184852的博客 5985

YOLOv8-pose姿态估计模型从训练到RK3588部署:让边缘端骨骼识别速度突破60FPS

本教程从“模型训练-转换-边缘部署”全链路拆解了YOLOv8-pose姿态估计方案在RK3588上的落地过程,每一步都经过实战验证。无论是智能健身的动作实时纠正,还是工业设备的关键部件姿态检测,这套流程都能让你以最低成本实现高精度、高实时性的姿态估计应用。如果你在实践中遇到模型转换报错、部署性能不达标等问题,可聚焦某一环节深入优化——毕竟,让AI在边缘端“精准捕捉每一个关键点”,才是技术驱动场景创新的核心。

know_F0727的博客 189

GCC内联汇编教程

 原文链接:https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html ,此文为我的中文翻译,转载请标明出处! GCC-Inline-Assembly-HOWTO Sandeep.S   本HOWTO解释了GCC提供的内联汇编功能的使用方法。阅读本文只有两个先决条件,是x86汇编语言和C的基本知识。   1. 简介 ...

lwx62的专栏 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

linux gcc 内联汇编入门

目录 2. 概览(Overview of the whole thing.) 3、GCC汇编语法(GCC Assembler Syntax.) 3.1. 源-目标顺序(Source-Destination Ordering) 3.2. 寄存次命名(Registry Naming) 3.3. 立即操作数(Immediate Operands) 3.4. 操作数大小(Operand Siz...

whatday的专栏 866

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【转贴】GCC内联汇编基础

原文作者 Sandeep.S英文原文 [https://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html] 本文将介绍GCC编译环境下,在C语言代码中嵌入汇编代码的基本方法。阅读本文需要您具备80X86汇编语言和C语言的基础知识。为了使中文描述更加清楚自然,翻译过程中加入了稍许解释和意译部分。 简介 版权/反馈/勘误/...

weixin_30443813的博客 424

gcc 内联汇编

gcc 内联汇编 文章目录gcc 内联汇编前言一、GCC asm 声明小例子二、优化C代码三、MORE内嵌汇编作为预处理宏C 桩函数替换C变量的符号名替换C函数的符号名强制使用特定的寄存器临时使用寄存器寄存器的用途Common pitfalls 前言 gcc 内联汇编介绍,转载 https://blog.youkuaiyun.com/lhf_tiger/article/details/32343851 对于基于ARM的RISC处理器,GNU C编译器提供了在C代码中内嵌汇编的功能。这种非常酷的特性提供了C代码没有的

yanzhongqian的博客 961

arm下的gcc内联汇编

arm下的gcc内联汇编 __asm__ __volatile__内嵌汇编用法简述 在阅读C/C++原码时经常会遇到内联汇编的情况,下面简要介绍下__asm__ __volatile__内嵌汇编用法。 带有C/C++表达式的内联汇编格式为: __asm__ __volatile__("Instruction List" : Output : Input : Clobber/Modif

格物致知 1865

gcc内联汇编

 有时为了高效,有时为了直接控制硬件,有些模块我们不得不直接用汇编语言来编写,并且对外提供调用的接口,隐藏细节,这其实就是内联汇编。如何使用内联汇编?我们就以 GCC 为例,一窥其中奥秘! 一、关键字     如何让 GCC 知道代码中内嵌的汇编呢? 借助关键字!来看下面的例子:     __asm__ __volatile__("hlt");   __asm__ 表示后面的代码为内嵌汇编,a

Make Progress Everyday! 1087
上一篇: C中的参数个数可变函数
下一篇: 复杂指针解析
trunk0813
博客等级 码龄18年 7粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值