热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

X64指令前缀概览

目录1.遗留前缀(LegacyPrefixes)1.1操作数大小和地址大小前缀1.2段重写前缀1.3Lock前缀1.4重复前缀2.REX前缀(RegisterExten

目录

1. 遗留前缀(Legacy Prefixes)

1.1 操作数大小和地址大小前缀

1.2 段重写前缀

1.3 Lock前缀

1.4 重复前缀

2. REX前缀(Register Extension)

3. VEX前缀(Vector Extension)和XOP前缀(Extension Operand)



指令前缀占据1个字节,置于指令的操作确前,修改操作数或据作数集。指令前缀分3种类型:

(1) 遗留前缀(Legacy Prefixes)

(2) 寄存器扩展前缀或REX前缀(REX Prefixes)

(3) 扩展前缀(Extended Prefixes)

遗留前缀分为五组,在其中,每一个前缀都有一个唯一值。REX前缀使能在64位模式下AMD64寄存器扩展的用法,它单独被分为一组,在其中,前缀的值表示要启用的寄存器扩展功能的组合。扩展前缀提供了一种转义机制,可为具有新功能的指令打开全新的指令编码空间。目前,有两种扩展前缀——VEX和XOP。VEX前缀用于编码AVX指令,XOP用于编码XOP指令。


1. 遗留前缀(Legacy Prefixes)

    表1-1显示了遗留前缀。正如表的最左列所示,分为五组。每一个前缀都有一个唯一的十六进制值。遗留前缀可以以任何次序出现在指令中,但是在一个单一指令中只能使用这五组指令前缀每一组中的一个前缀,并未定义使用同一个组中的多个前缀的情况。

    关于前缀的用法,有几个限制。例如,地址大小重写前缀(67h)被用于改变单内存操作数在读取或写入访问时的地址大小, 并且仅用于紧随前缀之后的指令。当用于SSE或64位媒体指令时,改用66h前缀来修改操作码。重复前缀仅在某些字符串指令中引起重复。当用于SSE或64位媒体指令的编码时,前缀被重新用于修改操作码。锁定前缀(lock prefix)只能与少量通用指令一起使用。

    表1-1概括了指令前缀的功能。

表1-1


1.1 操作数大小和地址大小前缀

    操作数大小和地址大小前缀允许在逐条指令的基础上混合数据和指令的大小。通过使用 67h地址大小前缀,可以在任何操作模式下重写指令的默认地址大小。在64位模式下,大部分通用寄存器指令的默认操作数大小是32位,REX前缀指定指定64位操作数大小,66h前缀指定16位操作数大小。REX 前缀优先于66h前缀。

    在64位模式下,默认的地址大小是64位。地址大小可以重写为32位。64位模式不再支持16位地址。在兼容模式下,地址大小前缀的产生的作用与遗留X86架构一样。


1.2 段重写前缀

    数据段是大部分内存操作数的默认段。有很多指令允许使用这6个段前缀之一重写默认段。当在下列情况下访问数据时,系统会忽略数据段默认段重写前缀:

(1) 当栈被用于数据入栈或出栈时,总是使用SS段。

(2) 当字符串的操作目标是内存时,它总是使用ES段。

双CS段获取指令不能被重写。但是,CS段重写前缀可用于访问作为数据对象的指令以及访问存储在代码段中的数据。


1.3 Lock前缀

    Lock前缀引起某些读-修改-写指令以原子的方式执行。这种操作的机制是独立实现的(例如,这种机制可能涉及锁定包含引用内存操作数副本的数据高速缓存线,和/或总线上的总线信令或数据包消息传递)该前缀旨在让处理器在多处理器系统中独占使用共享内存操作数。此前缀只能与以下写入内存操作数的指令形式一起使用:ADC, ADD, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, DEC, INC, NEG, NOT, OR, SBB, SUB, XADD, XCHG, XOR。如果在其它指令上使用Lock前缀,将引发无效操作码异常。


1.4 重复前缀

    有两种重复前缀的字节编码,F3和F2。字节码F3更为通用,且通常被汇编器视为两条不同的指令。字节码F2 仅用于CMPSx SCASx指令:

(1) REP (F3h)——这是更为通用的重复前缀,重复执行与字符串操作相关的指令,重复次数由计数寄存器指定(rCX),直到rCX的值为0或零标识(ZF)0。此前缀与INS, LODS, MOVS, OUTS, 和STOS指令一起使用。

(2) REPE 或REPZ (F3h)——此版本的 REP 前缀按照计数器寄存器(rCX)中指定的次数重复其关联的字符串指令。当 rCX 中的值达到0或零标志(ZF)被置为0时,重复停止。前缀只能用于CMPSx和SCASx指令。

(3) REPNE 或REPNZ (F2h)——REPNE或REPNZ前缀将其关联的字符串指令重复计数器寄存器(rCX)中指定的次数。当rCX 中的值达到0或零标志(ZF)设置为1时,重复停止。前缀只能与CMPSx和SCASx指令一起使用。


2. REX前缀(Register Extension)

REX前缀仅能用于64位模式。它使能64位寄存器扩展。REX前缀指定了以下牲征:

(1) 使用扩展的通用寄存器。

(2) 使用护展的YMM/XMM寄存器。

(3) 使用64位(4字)操作数大小。

(4) 使用扩展控制和调试寄存器。

REX前缀的值介于40h到4Fh之间,具体取值取决于所期望的特定的扩展寄存器的组合。除了少数例外情况,REX前缀要求访问64位通用寄存器或扩展的通用寄存器XMM寄存器之一。有少数几个指令默认采用64位操作数大小并且在访问扩展通用寄存器时不需要指定REX前缀。

一条指令只能有一个REX前缀,而一个这样的前缀就是表达全部64位模式寄存器扩展功能选择所需的全部内容。如果使用前缀,则必须紧接在指令的第一个操作码字节之前。 REX前缀在其他任何位置都将被忽略。15字节的旧指令大小限制仍然适用于包含REX前缀的指令。


3. VEX前缀(Vector Extension)和XOP前缀(Extension Operand)

VEX和XOP 前缀扩展了REX前缀之外的指令编码和操作数规范能力。它们允许对新指令进行编码以及指定三个、四个或五个操作数。 VEX 前缀是C4h和C5h,XOP前缀是 8Eh。

注:对于更详细的指令前缀细节,请参考intel或amd开发文档的对应章节。

参考资料:

Intel和AMD开发文档


推荐阅读
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
author-avatar
yu诚_530
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有