一步步编写操作系统 78 intel汇编与ATT汇编语法区别

本节咱们介绍下intel汇编语法和at&t汇编语法的区别。

 

 

以上表中未列出这两种语法在内存寻址方面的差异,个人觉得区别还是很大的,下面单独说说。

在Intel语法中,立即数就是普通的数字,如果让立即数成为内存地址,需要将它用中括号括起来,“[立即数]”这样才表示以“立即数”为地址的内存。

而AT&T认为,内存地址既然是数字,那数字也应该被当作内存地址,所以,数字被优先认为是内存地址,也就是说,操作数若为数字,则统统按以该数字为地址的内存来访问。这样,立即数的地位比较次要了,如果想表示成单纯的立即数,需要额外在前面加个前缀$。

无论是哪种汇编语言风格,都要有访问内存的能力,这就是内存寻址。

咱们之前学习了Intel汇编语法中的很多寻址方式,就内存寻址来说,有直接寻址,基址寻址,变址寻址,基址变址寻址。也可能是习惯了的原因,我个人觉得intel语法真的很直白,容易理解,尤其是在和AT&T的内存寻址相比较之后……

而在AT&T中的内存寻址还是挺独特的,它的内存寻址有固定的格式:

segreg(段基址):base_address(offset_address,index,size)

该格式对应的表达式为:

segreg(段基址):base_address+ offset_address+ index*size

此表达式的格式和intel 32位内存寻址中的基址变址寻址类似,intel的格式:

segreg:[base+index*size+offset]

不过与intel不同的是,AT&T地址表达式的值是内存地址,直接被当做是内存来读写,而不是普通数字。

看上去格式有些怪异,但其实这是一种“通用”格式,格式中短短的几个成员囊括了它所有内存寻址的方式,任意一种内存寻址方式,其格式都是这个通用格式的子集,都是格式中各种成员的组合。下面介绍下这些成员项。

base_address是基地址,可以为整数,变量名,可正可负。

offset_address是偏移地址,index是索引值,这两个必须是那8个通用寄存器之一。

size是个长度,只能是1、2、4、8(intel语法中也是只能乘以这4个数)。

下面看看内存寻址中有哪些方式,注意,这些方式都是上面通用格式的一部分。

直接寻址:此寻址中只有base_address项,即后面括号中的东东全不要,base_address便为内存啦,比如movl $255,0xc00008F0,或者用变量名:mov $6,var。

寄存器间接寻址:此寻址中只有offset_address项,即格式为(offset_address),要记得,offset_address只能是通用寄存器。寄存器中是地址,不要忘记格式中的圆括号。如mov (%eax), %ebx。

寄存器相对寻址:此寻址中有offset_address项和base_address项,即格式为base_address(offset_address)。这样得出的内存地址是基址+偏移地址之和。

各部分还是要按照格式填写,如movb -4(%ebx),%al,功能是将地址(ebx-4)所指向的内存复制1字节到寄存器al。

变址寻址:此类寻址称为变址的原因是含有通用格式中的变量Index。因为index是size的倍数,所以有index的地方就有size。既然是变址,只要有index和size就成了,base_address和offset_address可有可无,注意,格式中没有的部分也要保留逗号来占位。一共有4种变址寻址组合,下面各举个例子。

无base_address,无offset_address:

movl %eax,(,%esi,2)

功能是将eax的值写入esi*2所指向的内存。

无base_address,有offset_address:

movl %eax,(%ebx, %esi,2)

功能是将eax的值写入ebx+esi*2所指向的内存。

有base_address,无offset_address:

movl %eax,base_value(,%esi,2)

功能是将eax的值写入base_value+esi*2所指向的内存。

有base_address,有offset_address:

movl %eax,base_value(%ebx,%esi,2)

功能是将eax的值写入base_value+ebx+ esi*2所指向的内存。

好啦,AT&T就简单介绍到这,咱们重点是内联汇编。

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

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

相关文章

重读经典:《Masked Autoencoders Are Scalable Vision Learners》

MAE 论文逐段精读【论文精读】这一次李沐博士给大家精读的论文是 MAE,这是一篇比较新的文章,2021年11月11日才上传到 arXiv。这篇文章在知乎上的讨论贴已经超过了一百万个 view,但是在英文社区,大家反应比较平淡一点,R…

【Python学习日志】 - Numpy包

NumPy是什么? 使用Python进行科学计算的基础包,在数据分析的时候比较常用到矩阵计算。这时太多的Np属性不记得,所以方便自己使用把一些常用的Np属性汇总记录一下使用的时候方便查找。 ndarray.ndim 阵列的轴数(尺寸)…

SQL Server:触发器详解

SQL Server:触发器详解 1. 概述2. 触发器的分类3. Inserted和Deleted表4. 触发器的执行过程5. 创建触发器6. 修改触发器:7. 删除触发器:8. 查看数据库中已有触发器:9. “Instead of”相关示例:10. “After”触发器11. 参考资源 1…

详解协同感知数据集OPV2V: An Open Benchmark Dataset and Fusion Pipeline for Perception with V2V Communication

在《详解自动驾驶仿真框架OpenCDA: An Open Cooperative Driving Automation Framework Integrated with Co-Simulation》 一文中介绍了自动驾驶仿真框架 OpenCDA。本文将介绍论文作者另一篇最新工作 OPV2V,论文收录于 ICRA2022。 OPV2V 数据集主要 feature 有&…

【Python学习】 - 如何在Spyder中弹出plot绘图窗口而不是在Console中绘图

依次选择这几项: 点击ok确认。 注意:点击ok之后不会立即生效,重启Spyder之后才会生效

mysql系列:加深对脏读、脏写、可重复读、幻读的理解

关于相关术语的专业解释,请自行百度了解,本文皆本人自己结合参考书和自己的理解所做的阐述,如有不严谨之处,还请多多指教。 **不可重复读的重点是修改: **同一事务,两次读取到的数据不一样。 幻读的重点在于新增或者…

重读经典(点云深度学习开山之作):《Deep learning on point clouds for 3D scene understanding》(持续更新中)

本文介绍的是 PointNet 作者的博士论文:3D场景理解中的点云深度学习。从上图可以看到,整个博士论文主要贡献有两块:一是点云深度学习的网络架构(PointNet 和 PointNet);二是在3D场景理解中的应用&#xff0…

【Python学习】 - plt画图时,添加标题的中英文问题

默认是只能用中文,如果添加了中文标题,则会输出一堆乱码,解决方法就是加上下面这两行代码。 plt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False

Coursera自动驾驶课程第17讲:An Autonomous Vehicle State Estimator

在第16讲《Coursera自动驾驶课程第16讲:LIDAR Sensing》我们学习了自动驾驶目前常用的3D 传感器,激光雷达,了解了激光雷达的工作原理,掌握了对点云数据的操作以及如何使用点云配准方法来进行汽车定位。 回顾一下,在本…

!何为脏读、不可重复读、幻读

2.0、前言 事务的隔离性是指多个事务并发执行的时候相互之间不受到彼此的干扰的特性,隔离性是事务ACID特性中的I,根据隔离程度从低到高分为Read Uncommitted(读未提交),Read Committed(读已提交&#xff0…

【Python学习】 - 解决DataFrame占用内存过大问题

这篇文章原文出自kaggle,文中给出了reduce_mem_usage方法可以用来自动缩减dataframe占用空间 这篇notebook展示了通过使用更合理的数据类型来减少dataframe的内存使用量 方法如下: 迭代每一个column 检查column是否为数字型 检查column是否可以用inte…

【转】JPA、Hibernate和Mybatis区别和总结

很多人都用过java的数据库连接池C3P0,但官方没有说明名称的由来。 据传闻:连接池作者是《星球大战》迷,C3P0就是其中的一个机器人,并且这个名称中包涵connection 和pool的单词字母。因此叫这个名字(根据网友提醒&…

详解3D物体检测模型: Voxel Transformer for 3D Object Detection

本文介绍一个新的的3D物体检测模型:VoTr,论文已收录于ICCV 2021。 这是第一篇使用 voxel-based Transformer 做3D 主干网络,用于点云数据3D物体检测。由于有限的感受野,传统的 3D 卷积网络检测器(voxel-based&#xff…

【Python学习】 - Pandas包,对于describe函数和mean函数求平均值的效率问题

经测验,describe函数要快很多,不知道是不是当做一个属性直接存储起来,然后调用函数的时候O1输出? 对于30000*288的数据,describe是秒出结果,但是调用mean函数则需要10秒左右。 对于300000*3左右数据量的数…

一步步编写操作系统 65 标准调用约定stdcall 汇编实战

因为c语言遵循的调用约定是cdecl,咱们也自然要遵守cdecl约定了。不过为了起到对比的作用,除了介绍cdecl外,也会介绍下stdcall。 既然咱们用的是调用约定是cdecl,那对它的介绍最好让它离下一节的内容近一些,所以先说一…

Coursera自动驾驶课程第18讲:The Planning Problem

在第17讲《Coursera自动驾驶课程第17讲:An Autonomous Vehicle State Estimator》 我们学习了如何使用多传感器融合进行自车定位,以及传感器的内外参标定和时间同步,我们还讨论了在实际应用中常遇到的问题。 从本讲开始我们将学习一个新的模…

BI中事实表,维度表和数据集市,数据仓库的理解

维度表(dimension)存放着一些维度属性,例如时间维度:年月日时;地域维度:省份,城市;年龄维度:老年,中年,青年;职称维度:高&…

【Python学习】 - 如何将Pandas包中的groupby分组类型转换成DataFrame(一步就足够了)

输入:df_Grp,类型是pandas.core.groupby.generic.DataFrameGroupBy 我们先来学习一下如何将分组后的其中一个分组给转换成DataFrame类型: tmp dict(list(df_Grp)) tmpname[] tmpname [i for i,j in df_Grp] #下面这行代码其实就转化成Dat…

详解3D物体检测模型:Focal Sparse Convolutional Networks for 3D Object Detection

用于3D目标检测的焦点稀疏卷积神经网络【CVPR2022】【3D检测】本文介绍一篇新的 3D 物体检测模型:Focals Conv,论文收录于 CVPR2022。在 3D 检测任务中,点云或体素数据不均匀地分布在3维空间中,不同位置的数据对物体检测的贡献是不…

地平线:面向规模化量产的自动驾驶感知研发与实践

导读 4月27日,地平线智能驾驶感知研发部负责人苏治中就 《面向规模化量产的自动驾驶感知研发与实践》 这一主题进行了直播讲解。 本次课程内容分为4个部分: 1、地平线自动驾驶环境感知量产实践 2、软硬协同的自动驾驶感知算法设计 3、实现规模化量产的“…