|
gcc采用的是AT&T的汇编格式,MS采用Intel的格式.
一 基本语法 语法上主要有以下几个不同. ★ 寄存器命名原则 AT&T: %eax Intel: eax ★源/目的操作数顺序 AT&T: movl %eax,%ebx Intel: mov ebx,eax ★常数/立即数的格式 AT&T: movl $_value,%ebx Intel: mov eax,_value 把_value的地址放入eax寄存器 AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d ★ 操作数长度标识 AT&T: movw %ax,%bx Intel: mov bx,ax ★寻址方式 AT&T: immed32(basepointer,indexpointer,indexscale) Intel: [basepointer + indexpointer*indexscale + imm32) Linux工作于保护模式下,用的是32位线性地址,所以在计算地址时 不用考虑segment:offset的问题.上式中的地址应为: imm32 + basepointer + indexpointer*indexscale 下面是一些例子: ★直接寻址 AT&T: _booga ; _booga是一个全局的C变量 注意加上$是表示地址引用,不加是表示值引用. 注:对于局部变量,可以通过堆栈指针引用. Intel: [_booga] ★寄存器间接寻址 AT&T: (%eax) Intel: [eax] ★变址寻址 AT&T: _variable(%eax) Intel: [eax + _variable] AT&T: _array(,%eax,4) Intel: [eax*4 + _array] AT&T: _array(%ebx,%eax,8) Intel: [ebx + eax*8 + _array] 二 基本的行内汇编 基本的行内汇编很简单,一般是按照下面的格式 asm("statements"); 例如:asm("nop"); asm("cli"); asm 和 __asm__是完全一样的. 如果有多行汇编,则每一行都要加上 "nt" 例如: asm( "pushl %eaxnt" "movl $0,%eaxnt" "popl %eax"); 实际上gcc在处理汇编时,是要把asm(...)的内容"打印"到汇编 文件中,所以格式控制字符是必要的. 再例如: asm("movl %eax,%ebx"); asm("xorl %ebx,%edx"); asm("movl $0,_booga); 在上面的例子中,由于我们在行内汇编中改变了edx和ebx的值,但是 由于gcc的特殊的处理方法,即先形成汇编文件,再交给GAS去汇编, 所以GAS并不知道我们已经改变了edx和ebx的值,如果程序的上下文 需要edx或ebx作暂存,这样就会引起严重的后果.对于变量_booga也 存在一样的问题.为了解决这个问题,就要用到扩展的行内汇编语法. 三 扩展的行内汇编 扩展的行内汇编类似于Watcom. 基本的格式是: asm ( "statements" : output_regs : input_regs : clobbered_regs); clobbered_regs指的是被改变的寄存器. 下面是一个例子(为方便起见,我使用全局变量): int count=1; int value=1; int buf[10]; void main() { asm( "cld nt" "rep nt" "stosl" : : "c" (count), "a" (value) , "D" (buf[0]) : "%ecx","%edi" ); } 得到的主要汇编代码为: movl count,%ecx movl value,%eax movl buf,%edi #APP cld rep stosl #NO_APP cld,rep,stos就不用多解释了. 这几条语句的功能是向buf中写上count个value值. 冒号后的语句指明输入,输出和被改变的寄存器. 通过冒号以后的语句,编译器就知道你的指令需要和改变哪些寄存器, 从而可以优化寄存器的分配. 其中符号"c"(count)指示要把count的值放入ecx寄存器 类似的还有: a eax b ebx c ecx d edx S esi D edi I 常数值,(0 - 31) q,r 动态分配的寄存器 g eax,ebx,ecx,edx或内存变量 A 把eax和edx合成一个64位的寄存器(use long longs) 我们也可以让gcc自己选择合适的寄存器. 如下面的例子: asm("leal (%1,%1,4),%0" : "=r" (x) : "0" (x) ); 这段代码实现5*x的快速乘法. 得到的主要汇编代码为: movl x,%eax #APP leal (%eax,%eax,4),%eax #NO_APP movl %eax,x 几点说明: 1.使用q指示编译器从eax,ebx,ecx,edx分配寄存器. 使用r指示编译器从eax,ebx,ecx,edx,esi,edi分配寄存器. 2.我们不必把编译器分配的寄存器放入改变的寄存器列表,因为寄存器 已经记住了它们. 3."="是标示输出寄存器,必须这样用. 4.数字%n的用法: 数字表示的寄存器是按照出现和从左到右的顺序映射到用"r"或"q"请求 的寄存器.如果我们要重用"r"或"q"请求的寄存器的话,就可以使用它们. 5.如果强制使用固定的寄存器的话,如不用%1,而用ebx,则 asm("leal (%%ebx,%%ebx,4),%0" : "=r" (x) : "0" (x) ); 注意要使用两个%,因为一个%的语法已经被%n用掉了 |
相关推荐
银河麒麟系统安装redis【亲测可行】
架构:Linux 5.10.0-9-generic x86_64 GNU/Linux。redis版本:redis-6.2.3.tar.gz。然后在执行make install,结束;OS:银河麒麟V10(SP1)未激活。cpu:I5-10代;
gcc编译实践
各个编译命令的含义 gcc -E test.c -o test.i 编译预处理,生成.i文件 gcc -S test.i -o test.s 汇编生成.s文件,其中可以使用-O -O2 -O3编译优化选项(稍后讨论) gcc -c test.s -o test.o 汇编生成目标文件(.o) gcc test.o -o test.exe 链接生成可执行文件 不同编译选项的作用 编译预处理 在...
锐捷交换机堆叠配置举例
一、组网需求: 1)四台S2628G进行堆叠; 2)设备在堆叠前先设置好优先级; 3)使用光口堆叠的设备如RG-S2928G-E相关配置 二、组网拓扑 三、配置要点: 普通堆叠设备不需要配置,只要把堆叠模块和线缆连接好即可 堆叠模块不支持热插拔,即插在模块连上线缆后不能立即生效,需要重启设备才生效。 如果拔掉堆叠插槽后,想再插上模块堆叠,那么必须重启设备才生效 设备堆叠需要协商参数,时间会比较久,请耐心等待 堆叠时设备建议是...
AT&T(GAS)汇编指令小集
GAS中每个操作都是有一个字符的后缀,表明操作数的大小。 C声明 GAS后缀 大小(字节) char b 1 short w 2 (unsigned) int / long / char* l 4 float s 4 double l 8 long double t 10/12 注意:GAS使用后缀“l”同时表示4字节整数和8字节双精度
从分立到集成:深入解析Buck电路的核心模块与设计权衡
本文深入解析Buck电路的核心模块与设计权衡,从分立到集成方案的优缺点对比。详细探讨Buck电路的高效能量转换、小型化设计及灵活电压调节能力,并结合实际案例分享分立方案中的PWM生成、反馈环路设计及保护电路优化经验,为工程师提供实用设计参考。
52页PPT智慧矿山数字化工业大数据平台建设方案
致力于为煤炭企业构建“全”、“统”、“通”、”智”的(大数据平台/数据中台)体系,基于“数字新基建”时代的数据价值思考,构建全域数字化矿区共享能力中心,助力煤炭企业实现数字化转型,打通底层系统之间数据壁垒,加强公司整体管理和安全生产系数,为运营提供数据统筹模型,实现重点数据实时监控和数据共享开放服务。综上所述,智慧矿山数据治理是一个系统性的工程,需要煤炭企业内各部门连同行业和政府监管部门通力协作,制定数据标准和管理规范,重塑煤炭企业数据架构和数据传输链路,打通智慧矿山数据壁垒,保障数据质量和数据安全。
GNU内联汇编
汇编语言---GCC内联汇编 GCC支持在C/C++代码中嵌入汇编代码,这些代码被称作是"GCC Inline ASM"(GCC内联汇编); 一、基本内联汇编 GCC中基本的内联汇编非常易懂,格式如下: __asm__ [__volatile__] ("instruction list"); 其中, 1.__asm__: 它是GCC定义的关键字asm的宏定义(#define __
MATLAB不能识别已安装的visual studio 2015解决方法
首先,对于MATLAB识别已经安装的vs版本通过命令: mex -setup 下图为本电脑下同时安装的两个visual studio 如果搞清楚MATLAB识别电脑上安装vs的过程,可通过命令: mex -setup -v MATLAB输出识别编译器的整个过程。其中HKLM和HKCU分别是注册表中的HKEY_CURRENT_USER,HKEY_LOCAL_MA…的缩写,MATLAB没有找到对应编译器是由于注册表里没有对应信息(主要是文件路径,C++编译器的路径),或者在注册表里存在该信息,但是找不到
gcc中的内嵌汇编语言(Intel i386平台)
gcc中的内嵌汇编语言(Intel i386平台) 一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中 还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇 编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc 的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内 嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们 能够更
带隙基准电路实战:温度补偿与流片调优全解析
带隙基准(BGR)是模拟芯片中实现高精度、低温漂电压参考的核心电路,其本质是利用硅材料禁带宽度的物理稳定性,通过PTAT(正温度系数)与CTAT(负温度系数)电压的加权叠加抵消温度影响。原理上需兼顾一阶线性补偿与二阶曲率校正,技术价值在于支撑ADC/DAC/LDO等关键模块的精度与可靠性。典型应用场景涵盖车规级MCU、工业传感器和高精度电源管理芯片。工程落地难点集中于工艺偏差、运放失调、寄生效应及版图热电耦合——这正是‘带隙基准设计’与‘带隙基准调优’的根本分野。本文聚焦真实流片经验,深入拆解Widlar架
Unity3D实战:用EasyAR4.0稀疏空间地图打造AR导航应用(附完整代码)
本文详细介绍了如何使用Unity3D和EasyAR4.0的SparseSpatialMap功能构建AR导航应用。通过稀疏空间地图技术,开发者可以创建室内导航系统,解决传统GPS在室内环境中的局限性。文章包含完整代码示例,涵盖环境配置、地图构建、导航实现及性能优化等关键步骤,助力开发者快速掌握AR导航开发技巧。
AT&T汇编语言与GCC内嵌汇编简介
http://lcuc.org.cn/node/7 AT&T汇编语言与GCC内嵌汇编简介周二, 2006-09-19 11:23 — lostleaf 版本 0.1时间04/3/30EMAIL: chforest_chang@hotmail.com1 AT&T 与INTEL的汇编语言语法的区别1.1大小写1.2操作数赋值方向1.3前缀1.4间
【Unity Shader】Special Effects(十二)Glow 外发光(UI)
Properties_GlowColor ("外发光颜色", Color) = (0, 0, 0, 1)_GlowIntensity("外发光强度", Range(0, 1)) = 1参数详解:_GlowColor:外发光颜色,指定外发光的显示颜色。_GlowIntensity:外发光强度,指定外发光的显示强度,0为不可见,1为最强强度。
GCC中的内嵌汇编语言
GCC中的内嵌汇编语言
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
IEM模型,地表粗糙度模拟
利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟
GCC内嵌汇编语言
GCC内嵌汇编语言作者:肖文鹏 临江仙 整理:杨小华绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同。汇编基本语法简介在 AT&T 汇编格式中,寄存器名要加上 % 作为前缀;而在 Intel 汇编格式中,寄存
SIMATIC S7-1200, S7-1500 PID 控制[手册]
SIMATIC S7-1200, S7-1500 PID 控制[手册]
linux smp lock 锁总线 内嵌汇编,gcc中的内嵌汇编语言(Inteli386平台)
gcc中的内嵌汇编语言(Intel i386平台)一.声明虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们能够更快的入手。写这...
对 《gcc中的内嵌汇编语言》一文的补充说明
对 《gcc中的内嵌汇编语言》一文的补充说明- - 对 《gcc中的内嵌汇编语言》一文的补充说明欧阳光 ouyangguang@263.net 1999.10.13 初次接触到AT&T格式的汇编代码,看着那一堆莫名其妙的怪符号,真是有点痛不欲生的感觉,只好慢慢地去啃gcc文档,在似懂非懂的状态下
3338



被折叠的 条评论
为什么被折叠?



