汇编语言 arm与intel

不同汇编语言的对比 在学习汇编语言的过程中, 我们会听到很多很多关于汇编语言的名词, 比如NASM汇编, AT&T风格汇编, ARM汇编, 而大多国内教材教授的都是基于x86平台的MASM汇编语言, 由于缺少对其他汇编语言的介绍, 我们学习完教材后仍然对其他汇编语言的概念和名词不太了解, 导致见到这些名词时一头雾水, 本文旨在通过整理各种资料解释这些名词的含义及区别 阅读详情

引用网址
linux x86 的内联汇编
Linux 汇编语言开发指南

GNU 汇编程序简述

GNU汇编器(GNU assembler),是由GNU计划所使用的汇编器,一般称为gas,或依其可执行文件名称简称为as。它是GCC的默认后端。它用于汇编GNU操作系统、Linux内核以及其他各种软件。它是GNU Binutils包的一部分。

寄存器命名

寄存器名称有 % 前缀。即,如果必须使用 eax,它应该用作 %eax。

源操作数和目的操作数的顺序

在所有指令中,先是源操作数,然后才是目的操作数。这与将源操作数放在目的操作数之后的 Intel 语法不同。
mov %eax, %ebx, transfers the contents of eax to ebx.

Linux 汇编语法格式(AT&T,INTEL)

GCC采用的是AT&T的汇编格式, 也叫GAS格式(Gnu ASembler GNU汇编器), 而微软采用Intel的汇编格式.
绝大多数 Linux 程序员以前只接触过DOS/Windows 下的汇编语言,这些汇编代码都是 Intel 风格的。但在 Unix 和 Linux 系统中,更多采用的还是 AT&T 格式,两者在语法格式上有着很大的不同:
在 AT&T 汇编格式中,寄存器名要加上 ‘%’ 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如:

AT&T 格式 Intel 格式
pushl %eax push eax

在 AT&T 汇编格式中,用 ‘$’ 前缀表示一个立即操作数;而在 Intel 汇编格式中,立即数的表示不用带任何前缀。例如:

AT&T 格式 Intel 格式
pushl $1 push 1

AT&T 和 Intel 格式中的源操作数和目标操作数的位置正好相反。在 Intel 汇编格式中,目标操作数在源操作数的左边;而在 AT&T 汇编格式中,目标操作数在源操作数的右边。例如:

AT&T 格式 Intel 格式
addl $1, %eax add eax, 1

在 AT&T 汇编格式中,操作数的字长由操作符的最后一个字母决定,后缀’b’、’w’、’l’分别表示操作数为字节(byte,8 比特)、字(word,16 比特)和长字(long,32比特);而在 Intel 汇编格式中,操作数的字长是用 “byte ptr” 和 “word ptr” 等前缀来表示的。例如:

AT&T 格式 Intel 格式
movb val, %al mov al, byte ptr val

在 AT&T 汇编格式中,绝对转移和调用指令(jump/call)的操作数前要加上’*’作为前缀,而在 Intel 格式中则不需要。
远程转移指令和远程子调用指令的操作码,在 AT&T 汇编格式中为 “ljump” 和 “lcall”,而在 Intel 汇编格式中则为 “jmp far” 和 “call far”,即:

AT&T 格式 Intel 格式
ljump section, offset jmp far section:offset
lcall section, offset call far section:offset

与之相应的远程返回指令则为:

AT&T 格式 Intel 格式
lret $stack_adjust ret far stack_adjust

在 AT&T 汇编格式中,内存操作数的寻址方式是

section:disp(base, index, scale)

而在 Intel 汇编格式中,内存操作数的寻址方式为:

section:[base + index*scale + disp]

由于 Linux 工作在保护模式下,用的是 32 位线性地址,所以在计算地址时不用考虑段基址和偏移量,而是采用如下的地址计算方法:
disp + base + index * scale
下面是一些内存操作数的例子:

AT&T 格式 Intel 格式
movl -4(%ebp), %eax mov eax, [ebp - 4]
movl array(, %eax, 4), %eax mov eax, [eax*4 + array]
movw array(%ebx, %eax, 4), %cx mov cx, [ebx + 4*eax + array]
movb $4, %fs:(%eax) mov fs:eax, 4

操作数大小

根据操作数是字节 (byte)、字 (word) 还是长型 (long),指令的后缀可以是 b、w 或 l。这并不是强制性的;GCC 会尝试通过读取操作数来提供相应的后缀。但手工指定后缀可以改善代码的可读性,并可以消除编译器猜测不正确的可能性。

movb %al, %bl – Byte move
movw %ax, %bx – Word move
movl %eax, %ebx – Longword move

立即操作数

通过使用 $ 指定直接操作数。

movl $0xffff, %eax – will move the value of 0xffff into eax register.

间接内存引用

任何对内存的间接引用都是通过使用 ( ) 来完成的。

movb (%esi), %al – will transfer the byte in the memory
pointed by esi into al
register

内联汇编

GCC 为内联汇编提供特殊结构,它具有以下格式:
GCG 的 “asm” 结构

asm ( assembler template

output operands (optional)

input operands (optional)

list of clobbered registers (optional)

);

本例中,汇编程序模板由汇编指令组成。输入操作数是充当指令输入操作数使用的 C 表达式。输出操作数是将对其执行汇编指令输出的 C 表达式。
内联汇编的重要性体现在它能够灵活操作,而且可以使其输出通过 C 变量显示出来。因为它具有这种能力,所以 “asm” 可以用作汇编指令和包含它的 C 程序之间的接口。
一个非常基本但很重要的区别在于 简单内联汇编只包括指令,而 扩展内联汇编包括操作数。要说明这一点,考虑以下示例:

{
    int a=10, b;
    asm ("movl %1, %%eax;

movl %%eax, %0;"
        :"=r"(b)  /* output */    
        :"r"(a)       /* input */
        :"%eax"); /* clobbered register */
}

在上例中,我们使用汇编指令使 “b” 的值等于 “a”。请注意以下几点:
“b” 是输出操作数,由 %0 引用,”a” 是输入操作数,由 %1 引用。
“r” 是操作数的约束,它指定将变量 “a” 和 “b” 存储在寄存器中。请注意,输出操作数约束应该带有一个约束修饰符 “=”,指定它是输出操作数。
要在 “asm” 内使用寄存器 %eax,%eax 的前面应该再加一个 %,换句话说就是 %%eax,因为 “asm” 使用 %0、%1 等来标识变量。任何带有一个 % 的数都看作是输入/输出操作数,而不认为是寄存器。
第三个冒号后的修饰寄存器 %eax 告诉将在 “asm” 中修改 GCC %eax 的值,这样 GCC 就不使用该寄存器存储任何其它的值。
movl %1, %%eax 将 “a” 的值移到 %eax 中, movl %%eax, %0 将 %eax 的内容移到 “b” 中。
因为 “b” 被指定成输出操作数,因此当 “asm” 的执行完成后,它将反映出更新的值。换句话说,对 “asm” 内 “b” 所做的更改将在 “asm” 外反映出来。

汇编程序模板

汇编程序模板是一组插入到 C 程序中的汇编指令(可以是单个指令,也可以是一组指令)。每条指令都应该由双引号括起,或者整组指令应该由双引号括起。每条指令还应该用一个定界符结尾。有效的定界符为新行 (\n) 和分号 (;)。 ‘\n’ 后可以跟一个 tab(\t) 作为格式化符号,增加 GCC 在汇编文件中生成的指令的可读性。 指令通过数 %0、%1 等来引用 C 表达式(指定为操作数)。
如果希望确保编译器不会在 “asm” 内部优化指令,可以在 “asm” 后使用关键字 “volatile”。如果程序必须与 ANSI C 兼容,则应该使用 asm 和 volatile,而不是 asm 和 volatile。

大模型备案避坑指南:如何设计符合TC260标准的评估测试题集? 本文深入探讨了如何设计符合TC260标准的大模型评估测试题集,以顺利通过备案。文章从解构标准核心逻辑出发,详细阐述了题集设计的工程化流程、核心原则与常见误区,并提供了模拟真实对抗的高阶测试策略与度量分析方法,旨在帮助企业构建一套能真实反映模型安全水位、有效规避风险的评估体系。 阅读详情

相关推荐

SSD盘符漂移导致OSD down场景模拟与恢复

运维团队反馈一个问题,现象是:某个OSD对应的cache分区发生了变化,比如原来cache使用的分区是/dev/sde,后来还是这块盘,但分区信息不知何故,变成了/dev/sdf(产品OSD设备并不是根据分区名称来map,而是根据partlabel),最终的现象是这个OSD down了,没法启动.接到这个现象的反馈后,记录一下这个问题在lab的复现方法。

Gavin Blog 938

Arm和intel的区别

Itanium系列,AMD造的amd64.IA64已经被放弃了,intel用的就是amd64;d)64位计算:intel没有开发64位版本的x86指令集,新64位处理器项目叫IA64-f)异构计算:arm特有的,意思是处理器可以是不同类型的,核可以又不同的性能。和功耗,当正常运行时,使用低功耗核,当运行复杂游戏时,使用高性能核+e)armV8 64位架构两种执行模式(牛逼在于可以无缝切换),a)intel-x86是复杂指令集。c)工艺:arm更低,拥有温控效果+arm和 intel的区别+

qq_14872005的专栏 774

U8-固定资产月末结账报错:BOF或EOF中有一个是真

度了下,发现此问题一般是由于fa_Vtsobject表缺少对应月份的记录导致,补上即可,但是查看发现此表记录正常。 跟踪后发现定位到以下语句: select * from AccInformation where cSysID = N'FA' and cName =N'bVoucherApply'上述语句执行后没有任何记录显示,但是在正常的账套执行是有记录的,那有可能就是记录丢失导致,执行以下

guizhouakun的博客 5916

inter,amd,arm公司以及x86,arm,mips等架构关系

inter,amd,arm以及x86,arm,mips关系 先简单通俗的说一下三者主要业务,便于分辨 1.arm公司的前身是英国的Acorn计算机公司,1991年剥离ARM部门,成为如今的arm-嵌入式芯片设计公司 市场:微处理器(单片机等),手机移动市场处理器(cotex-a77等)和gpu mail,主要以出售芯片技术授权(高通,华为) 2.amd: pc市场的cpu,和显卡 3.inter:电脑cpu 注:arm总是分不清,记一下 arm 公司 arm公司设计的arm架构,类似x86架构 基于arm

qq_42733641的博客 4711

2025最新正版Autodesk 3ds Max 2022安装教程:从下载到中文环境配置全流程解析

Autodesk 3ds Max 2022是一款专业的三维建模、动画和渲染软件,广泛应用于影视制作、游戏开发、建筑可视化等领域。

waicsdn_haha的博客 1万+

MySQL根据idb文件恢复数据

恢复前提 MySQL 5.* 和 8.* 的恢复方式大同小异,最基本的区别是8.* 中,不再有表结构frm文件,所以要恢复 8.* 的数据,就必须要有完整的建表语句。 而恢复 5.* 的数据,就需要idb文件和 frm文件,当然,如果有完整的建表语句的话,不用frm文件也行。 恢复步骤 需要注意的是,以下操作需要选定数据库后执行。 5.* 恢复表结构 确定表列数 首先创建一张 与需要恢复数据的表 的名字相同的新表,如果已知原表的字段数量的话,就按照原表字段数建表,字段名和类型都不用考虑,如果不知道数量的话,

weixin_45121446的博客 5447

ARM、Intel、MIPS处理器啥区别?看完全懂了

安卓支持三类处理器(CPU):ARM、Intel和MIPS。ARM无疑被使用得最为广泛。Intel因为普及于台式机和服务器而被人们所熟知,然而对移动行业影响力相对较小。MIPS在32位和64位嵌入式领域中历史悠久,获得了不少的成功,可目前Android的采用率在三者中最低。 总之,ARM现在是赢家而Intel是ARM的最强对手。那么ARM处理器和Intel处理器到底有何区别?为什么ARM如此

guoduhua的专栏 3349

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 445

汇编语言的种类

汇编语言的种类 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令。不同架构的CPU指令并不相同,如x86,powerpc,arm各有各的指令系统;甚至同一种架构的CPU有几套指令集,典型的如arm除了有32位的指令集外,还有一套16位的thumb指令集。但是作为开发语言的汇编,本质上是一套语法规则和助记符的集合,它可以包容不同的指令集。如果从CPU体系来划分,常见的汇编有两...

ye1223的博客 1万+

注意力机制模块:二次创新:CBAM 与 ECA 融合形成 CECA 模块,参数量减少 40%

文章摘要: 本文提出一种轻量化注意力模块CECA,通过融合CBAM和ECA的优势解决模型部署中的精度与速度矛盾。CBAM虽具备通道和空间双重注意力,但参数量大;ECA轻量但缺乏空间注意力。CECA采用ECA的一维卷积替换CBAM的通道注意力部分,保留其空间注意力模块,在保持双注意力能力的同时减少40%参数量。实验表明该方案在边缘设备部署中能维持精度并提升推理速度,特别适用于YOLO等目标检测模型的轻量化改进。文章详细拆解了架构设计、代码实现及参数量优化原理,为算法工程师和嵌入式开发者提供了实用解决方案。

ZXSXJ的博客 236

支付宝域名如何加入白名单(扫码老是弹窗)

支付宝扫码之后,遇到非支付宝官方网页,请确认是否继续访问弹窗,问题解决办法。本章教程提供解决办法,亲测有效。

猿小白的博客 9185

ARM和x86/x64(inter,AMD)CPU总结

ARM和x86/x64CPU区别概要ARM和x86/x64的总结 概要 在提到处理器(CPU,Central Processor Unit)的时候,一定会出现“ARM”和“x86”“x64”这样的词汇。 大概总结一下两者的区别,让我们一起迎接WWDC2020的到来吧! ARM和x86/x64的总结 处理器体系结构的类型 ARM x86/x64 架构开发公司 ARM Intel /AMD 处理器制造公司 Intel,Freescale Semiconductor,Renesas Elect

编程老王 3554

锂电池寿命预测 | Python实现基于LSTM长短期记忆神经网络的锂电池寿命预测

锂电池寿命预测 | Python实现基于LSTM长短期记忆神经网络的锂电池寿命预测

算法如诗的博客 1901

GNU ARM 汇编

http://www.cnblogs.com/hicjiajia/archive/2012/05/22/2513999.html GNU ARM 汇编 转自:http://blog.chinaunix.net/uid-23193900-id-3179709.html   GNU ARM 汇编 GNU:维基百科上说:GNU,一个类UN

yongbudl2012的专栏 749

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

经常听说AT&T汇编、Intel汇编,还能听到ARM汇编,这个ARM汇编与前两个有什么关联?

origin: https://zhidao.baidu.com/question/424592744355848412.html AT&T汇编和Intel汇编,是两种不同汇编语言格式,与具体CPU关系不大,只是Intel汇编格式基本只用在自家的x86系列CPU上,而AT&T汇编格式在多种CPU上都可以使用(x86,power,VAX等等)。两者的区别主要是CPU指令、寄存器、立即数、寻址方式等

yazhouren的专栏 3092

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

初学汇编;

初学汇编的记录;

tmz的博客 199

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

汇编语言概论

为什么写这篇文章,我想还是要说一说的,俗话说好记性不如烂笔头,作为一个嵌入式行业开发者,汇编不可谓不重要,不管是大学的基于x86架构程序设计还是工作后的基于ARM的嵌入式软件设计,汇编都扮演了及其重要的重要,而且汇编可以说是最底层的语言,为什么?在这里编程最重要的是稳定,因此程序用汇编编写,另外就是速度,这个速度是程序运行的速度,要确保用最少的指令完成最好的工作,如果一个导弹程序在锁定目标后还有较大的延时这将是不可接受的,因为这个程序要精确的运行时间和实时性,这部分程序只能是由汇编语言设计。

weixin_43773869的博客 317

汇编语言的Intel格式和AT&T格式

汇编语言的种类 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令。不同架构的CPU指令并不相同,如x86,powerpc,arm各有各的指令系统;甚至同一种架构的CPU有几套指令集,典型的如arm除了有32位的指令集外,还有一套16位的thumb指令集。但是作为开发语言的汇编,本质上是一套语法规则和助记符的集合,它可以包容不同的指令集。如果从CPU体系来划分,常见的汇编有两种...

qq_34279254的博客 1435

汇编语言风格

摘要: 对arm汇编、x86汇编各自风格的探究

wood的博客 2947

32位汇编语言helloworld_ARM汇编语言入门

序言看到一个比较好的ARM汇编入门教程。上不了班,闲着没事翻译了一下。原址:https://azeria-labs.com/writing-arm-assembly-part-1/ARM 汇编语言入门(一)Part1:ARM汇编介绍处理器arm VS. intelARM与Intel有诸多不同,最主要的区别是指令集。Intel是复杂指令集(CISC:Complex Instruction Set C...

weixin_39575212的博客 232

ARM 汇编语言入门

win10 arm 汇编环境 Windows 平台下搭建ARM汇编集成环境:https://jingyan.baidu.com/article/4b52d70288bfcdfc5c774ba5.html Ubuntu ARM汇编环境搭建:ARM汇编学习(一)搭建ARM汇编模拟环境 https://www.veryarm.com/65170.html ARM汇编语言入门:https://zhuanlan.zhihu.com/p/109057983 ARM汇编语言入门(二):h...

freeking101的博客 3420

汇编语言资源集

Intel The Art Of Assembly Language Intel架构软件开发者手册: Volume 1: Basic Architecture Volume 2A: Instruction Set Reference, A-M Volume 2B:

Purpleendurer@优快云 1804

汇编语言的分支理解

前言 汇编语言是面向机器的程序设计语言,可以将其看成是各种 CPU 的机器指令的助记符集合。程序员可以使用汇编代码直接控制硬件系统工作,而且用汇编语言编写的程序具备执行速度快和占用内存少等优点。 在 Apple 平台上主流的汇编语言有 x86 汇编 和 ARM 汇编, 在移动设备上使用的是 ARM 汇编 这主要是因为 ARM 采用的是 R...

weixin_34194702的博客 873

linux内核中的汇编语言

Intel 和AT&T 汇编语言源代码主要采用两种语法:AT&T语法和Intel语法,尽管它们都属于第二代语言,但是二者的语法却存在巨大的差异。AT&T汇编语法以%作为所有寄存器名称的前缀,以$作为文字常量(也叫做立即操作数)的前缀。它这样对操作数排序:源操作数位于左边,目的操作数位于右边,使用AT&T语法,GNU汇编器(Gas)和许多其他GNU工具(如gcc和g...

金溪的博客 659
上一篇: 关于安卓手机 的调试
下一篇: Android Studio中Make Project,Clean Project,Rebuild Project区别
forevertingting
博客等级 码龄12年 6粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值