Intel指令集
一凡stkeke
程序猿要非常勤奋地把自己变成一个懒货
展开
-
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(13/E) - FXSAVE/FXRSTOR指令
FXSAVE and FXRSTOR instructionsFXSAVE与FXRSTOR指令是从Pentium II处理器引入到IA-32架构上的,早于SSE指令集的引入。这两条指令的最初版本是用于快速保存/恢复x87执行环境(被称为x87状态)。指令在操作x87 FPU寄存器时,隐式地也保存/恢复了MMX寄存器,因为MMX其实是x87 FPU的子寄存器。注意:在技术上,FXSAVE与F...原创 2019-02-19 15:54:34 · 2132 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(7) - 混洗指令 & 解组合指令
SSE Shuffle and Unpack InstructionsSSE的混洗指令与解组合指令混洗shuffle或交错interleave单精度浮点操作数,并将结果保存到目标操作数。 指令 描述 SHUFPS 格式:xmm1, xmm3/m128, imm8 按照imm8的指示,从xmm1与xmm2/m128...原创 2019-02-01 14:31:40 · 868 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(6) - 逻辑指令 & 比较指令
SSE Logical InstructionsSSE的逻辑指令执行与,或,非,以及与非操作。操作数是组合的单精度浮点数。 指令 描述 ANDPS 格式:xmm1, xmm2/m128 对操作数执行按位“与”操作 指令操作: DEST[31:0] <-- DEST[31:0] B...原创 2019-02-01 13:44:49 · 2397 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(10/E) - 特殊指令格式(AVX & AVX-512)
Special Instruction FormatAVX Instruction FormatAVX-512 Instruction Format原创 2019-01-23 08:28:39 · 581 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(9) - 64位指令格式(通用格式)
64-bit Instruction Format基本上与32位指令格式相同,只是各字节宽度有所变化。原创 2019-01-23 08:28:23 · 1045 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(8) - 80386/32位指令前缀
下面详细讲解一下指令前缀。Pentium Pro处理器支持的前缀可以分成如下四组:组1: 封锁和重复执行前缀 指令前缀 (十六进制) 描述 F0 H Lock前缀,封锁总线 The LOCK prefix can be prepended only to the following instructions...原创 2019-01-22 14:24:15 · 803 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(7) - 80386/32位指令格式概述
32-bit Instruction Format从80386的指令格式可以看出,32位指令的操作码可以是1个字节或者2个字节,还新引入了SIB(即BYTE4)字节。地址位移量和操作数宽度也都升级为32比特位长。下图来自于Pentium Pro的PRM,严格意义来讲,指令前缀并不是指令的一部分,真正的指令总是从操作码字节开始。在Pentium Pro处理器上,操作码依然是1个或2个字节...原创 2019-01-22 14:21:31 · 1415 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(6) - 8086/16位指令位移量字节/立即数字节
第三~六字节(BYTE3~BYTE6)这4个字节是指令的可选字节,通常用来指示存储器操作数的位移量,和/或立即操作数的值。位移量字节可以是单字节或者双字节。只要有可能,程序语言翻译器(例如汇编器)总是试图生成单字节的位移量。MOD域指示后续有几个字节的位移量。遵循Intel的规范,如果是双字节位移量,则第3字节存储低位字节,第4字节存储高位字节,即低位字节存储在存储器的低地址处,高位字...原创 2019-01-22 14:17:20 · 1420 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(5) - 8086/16位指令寻址字节
第二字节(BYTE2)第二字节是ModR/M字节,基本用途是指示指令的两个操作数,以及该字节之后是否还有其他字节(位移量字节和立即数字节)。由于主要用于用于操作数寻址,所以又称为“寻址字节”。Mod域(即BYTE2[7:6],寻址模式域)有2个比特位,共4种组合,用于指示操作数的来源,即其中一个来自与存储器,或者两个都来自于寄存器。具体编码格式参见下表: Mod编码(二进制)...原创 2019-01-22 14:14:40 · 497 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(1) - 概述/历史/新数据类型/XMM寄存器组
SSE InstructionsSSE Overview & HistoryIntel SSE技术的全称是Streaming SIMD Extension,中文译作流式单指令多数据指令扩展。1999年,Intel在Pentium III处理器上引入了SSE指令集,包括了70条新指令,主要操作单精度浮点数据类型,用于增强浮点计算性能,面向于数字信号处理与图形处理市场。SSE完整的支持...原创 2019-01-27 17:55:07 · 1451 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(2) - SSE程序设计环境概述
SSE Programming Environment下图是IA-32处理器上的SSE程序设计环境,所有的SSE指令操作XMM寄存器,MMX寄存器,和/或存储器。XMM寄存器,8个,128位宽,存储组合的或标量的单精度浮点数据类型。这里标量指的是SSE指令只运算存储在XMM寄存器中的最低32位(双字)的单精度浮点数据类型。 MXCSR寄存器,32位宽,提供了SIMD浮点操作需要使用的状态...原创 2019-01-27 17:58:49 · 460 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(8) - 数据类型转换指令
SSE Conversion InstructionsSSE的转换指令支持组合的/标量的单精度浮点数与双字整型数(32字节)之间的数据类型转换。以下两条指令将整型数转换为浮点数。 指令 描述 CVTPI2PS 格式:CVTPI2PS xmm1, mm/m64 将mm/m64中的两个有符号双字整数转换为两个单精...原创 2019-02-01 15:34:01 · 985 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(11) - 数据可缓存性控制指令
Cacheability Control Instructions下面的3条指令允许使用“非时效存储提示non-tempral hint”将MMX/XMM寄存器中的数据写入到存储器中。非时效提示可以通知处理器将数据直接写回内存,并不会干扰各级高速缓存。下节会详细介绍时效操作与非时效操作的区别。 指令 描述 MOVNTQ ...原创 2019-02-12 13:36:40 · 516 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(5) - 算术指令
SSE Arithmetic InstructionsSSE算术指令执行加法,减法,乘法,除法,以及求倒数,平方根,平方根倒数,最大值/最小值操作,操作数可以是组合的或标量的单精度浮点数。 指令 描述 ADDPS 格式: ADDPS xmm1, xmm2/m128 将xmm2/m128中组合的单精度浮点数加到xm...原创 2019-01-30 15:53:07 · 906 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(12) - 预取指令与SFENCE指令
PREFETCHn InstructionsPREFETCHn指令使得程序可以提前让处理器预先即将访问的数据读入到指定的某级缓存中,这样当程序真正需要这些数据时,可以直接命中缓存。这些指令按照制定了时效局部性提示(temporal locality hint)读取对齐的32字节的数据行(或者更长的数据行,依赖于处理器实现),这个数据行包括了指令中指定的数据。详情可参看下表。 指令助记...原创 2019-02-15 14:34:24 · 957 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(4) - 数据传输指令
SSE Instruction Set SSE指令集大致可以分为4个功能组:组合的与标量的单精度浮点指令 数据传输指令 算术指令 逻辑指令 比较指令 混洗shuffle指令 转换指令 64位SIMD整型指令 状态管理指令 可缓存性控制指令,数据预取指令,以及访存排序指令SSE Data Movement InstructionsSSE数据传输指令将单精...原创 2019-01-29 15:41:09 · 542 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(1) - 概述 & 传输指令
MMX™ InstructionsIA-32架构引入了4个指令集扩展,使得IA-32处理器可以执行单指令多数据SIMD操作。这些扩展包括MMX技术,SSE扩展,SSE2扩展,SSE3扩展。MMX指令可以运行在支持MMX技术的Intel 64和IA-32处理器上。对MMX指令的支持可以通过CPUID查询。MMX技术的57条指令可以分为以下的子组:数据传输,转换,组合的算术,比较,逻辑,移...原创 2019-01-23 15:53:34 · 704 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(10) - MXCSR状态控制指令
MXCSR State Management InstructionsMXCSR状态管理指令,LDMXCSR与STMXCSR,用于控制MXCSR寄存器状态。LDMXCSR指令从存储器中加载MXCSR寄存器状态;STMXCSR指令将MXCSR寄存器状态保存到存储器中。 指令 描述 LDMXCSR 格式:LDMXCSR m3...原创 2019-02-03 10:46:53 · 1638 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解
MXCSR Control and Status Register32位宽的MXCSR寄存器(参看下图)包含了控制与状态标志位,适用于SSE,SSE2和SSE3 SIMD浮点操作。这些标志位包括:SIMD浮点异常的标志位与掩码位 SIMD浮点操作的舍入控制域 下溢清零标志位(flush-to-zero),控制当SIMD浮点操作出现下溢时的结果 非规格化数据作零标志位(denormal...原创 2019-01-28 15:13:25 · 4054 阅读 · 2 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(9) - 64位整型指令(MMX指令集扩展)
SSE 64-Bit SIMD Integer InstructionsSSE扩展增加了几条64位组合的整型指令,这些指令操作MMX寄存器和64位的存储器操作数,这些指令可以看作是对MMX指令集的扩展。当后来在IA-32处理器上引入SSE2扩展时,这些指令也被扩展位操作128位的XMM寄存器和128位的存储器操作数。 指令 描述 PAVGB...原创 2019-02-02 11:08:16 · 789 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(4) - 8086/16位指令操作码字节
第一字节(BYTE1)指令定义了处理器要执行的操作,例如ADD,XOR,HLT等。操作码通常位于第一字节,某些指令的操作码会扩展到第二字节(即ModR/M字节)的REG域,故有时候REG域也被称为REG/Opcode域,用来指出该域的两种用途。绝大多数的指令的第一字节的高6个比特位(即BYTE1[7:2])是操作码,BYTE1[1]是D标志位,指明操作的方向,BYTE1[0]是W标志位...原创 2019-01-22 14:12:31 · 2154 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(3) - 8086/16位指令前缀
指令前缀虽然没有明确的在上图中指明,8086处理器上16位实模式下,指令也可以带有下列前缀:Lock前缀,REPNE/REPNZ前缀,段跨越前缀。但是并没有操作数宽度前缀66H和地址宽度前缀67H,这两个前缀是32位保护模式下为了兼容16位数据访问引入的。段跨越前缀ES:26HCS: 2EHSS: 36HDS: 3EH封锁前缀Lock前缀: F0H重复前缀R...原创 2019-01-22 14:07:15 · 562 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(2) - 8086/16位指令格式概述
本节简单地介绍一下x86指令集的指令格式和特点,当优化文档偶尔提及指令格式时,可供参考。完整的指令集格式在Intel Software Developer’s Manual的第二卷Instruction Set Reference中有详细的讲解。通常连汇编程序员都无需特别关注这些格式,但是反汇编程序员是必须要熟悉二进制指令格式的,以后我们会开一个独立的专题专门讲述x86指令集格式。Intel ...原创 2019-01-22 12:46:10 · 1351 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 通用指令(9/E) - 比特位操控指令(BMI1 & BMI2)
Bit Manipulation Instructions (BMI1 & BMI2) 指令 描述 ANDN 格式: ANDN r32a, r32b, r/m32 第一源操作数(r32b)取反后与第二源操作数(r/m32)按位“与”操作,结果保存在目标操作数中。 BEXTR ...原创 2019-01-18 15:16:53 · 6761 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 通用指令(8) - 杂项指令 & 用户态扩展状态指令 & 随机数生成指令
Miscellaneous Instructions杂项指令包括的功能有:载入有效地址,执行“误操作”,以及侦测处理器标识信息等。 指令 描述 LEA 载入有效地址到目标寄存器 NOP 空指令 UD 产生未定义指令(即无效操作码)异常 ...原创 2019-01-18 15:13:17 · 657 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 通用指令(7) - 标志寄存器/标志控制指令 & 段寄存器指令
Flag Control (EFLAGS) Instructions下列指令用于控制(即修改)标志寄存器EFLAGS中的标志位。 指令 描述 STC 设置CF标志为1 CLC 清除CF标志为0 CMC 求补CF标志位(若原先为1,则修改为...原创 2019-01-18 15:10:37 · 366 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 通用指令(6) - 字符串指令/输入输出指令
String Instructions字符串指令操作字节构成的串,用来在内存中将字符串搬来搬去。MOVS/CMPS/SCAS/LODS/STOS指令在执行完一次操作后,都会按照标志寄存器中的DF标志的指示自动地更新ESI/EDI寄存器;这样就可以与REP(重复指令前缀)连用,执行系列的字符串操作。 指令 描述 MOVS/MOVSB ...原创 2019-01-18 15:08:41 · 538 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 通用指令(5) - 控制转移指令
Control Transfer Instructions控制转移指令支持无条件跳转jump,条件跳转conditional jump,循环loop,调用call与返回return操作,从而实现程序执行流控制。 指令 描述 JMP 无条件跳转;分为近跳转(段内跳转)和远跳转(段间跳转) JE/JZ ...原创 2019-01-17 16:40:39 · 701 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 通用指令(4) - 比特位设置指令/字节设置指令
Bit and Byte Instructions比特指令测试并修改操作数的某些比特位;字节指令设置字节操作数的值,用来指示EFLAGS标志寄存器的状态。 指令 描述 BT 测试比特位(将要测试的比特位送CF标志位) BTS 测试并设置比特位(将要测试的比特位送CF标志位后,设置...原创 2019-01-17 16:39:26 · 668 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 通用指令(3) - 逻辑指令/移位指令
Logical Instructions逻辑指令执行基本的“与、或、非、异或”操作,操作数可以是字节,单字和双子值。 指令 描述 AND 对操作数执行按位逻辑“与”操作 OR 对操作数执行按位逻辑“或”操作 XOR 对操作数执行按位逻辑“...原创 2019-01-17 10:36:48 · 785 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 通用指令(2) - 二进制算术指令/十进制算术指令
Binary Arithmetic Instructions二进制算术指令执行基本的二进制整型计算,操作数可以是字节,单字和双字整型数,位于存储器中,和/或通用寄存器中。 指令 描述 ADCX 带进位的无符号整数加法 ADOX 带溢出位的无符号整数加法 Intel C/C...原创 2019-01-17 10:35:04 · 757 阅读 · 0 评论 -
【C/C++】深入理解原子操作 & volatile i为什么不能保证i++的原子性
处理器支持的原子操作首先我们来讲一下处理器支持的原子操作以及为什么i++不是原子操作。从处理器层面上来讲,处理器保证基本的访存事务的原子性,例如当处理器读取存储器中的一个字节时,在读取过程未结束之前,其他的任何设备都不可以访问这个字节。这个保证对写入字节也成立。但是处理器自动能做的保护也就仅仅如此了。i++不是原子操作对于i++这样的操作,其实是分3步执行的,读取i的值,增加i的值,...原创 2019-01-18 17:00:17 · 3576 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(2) - 数据转换指令
MMX Conversion InstructionsMMX转换指令组合或拆分字节,单字,和双字。 指令 描述 PACKSSWB 格式:PACKSSWB mm1, mm2/m64 将mm1与mm2/m64中的4个组合的有符号单字组合成8个组合的有符号字节整数,使用有符号饱和算法 (参看下图)。 ...原创 2019-01-24 16:52:20 · 387 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器指令集 - CPUID (1) - 概述
CPUID指令Introduction of CPUID instruction根据Wikipedia,CPUID指令是x86处理器体系结构的补充指令,使得软件可以枚举当前运行的处理器的详细特性,包括处理的类型,支持的特性(例如MMX/SSE)等。CPUID指令最早是由Intel在1992年11月的486SL处理器上以及 1993年发布的Pentium引入的。CPUID指令长度是两个字...原创 2019-01-15 16:47:57 · 2755 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - 指令格式(1) - 概述
x86 Instruction Introduction指令用来指示处理器所要执行的操作,指令集就是某个处理器上可以执行的所有指令。通俗的说,指令可以有两种存在方式,一种是汇编程序员看到的汇编文本格式,可以保存在文本文件中, 另一种是编译后以二进制形式存在的格式,可以直接执行或者链接到其他程序中执行,我们称为机器格式指令。汇编文件可以通过汇编器转换成机器格式指令,机器格式指令可以通过反汇编程序...原创 2019-01-22 12:43:23 · 1004 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(8/E) - GCC内嵌/内置函数
File Instruction Set GCC v7.1 Intrinsic GCC v7.1 Intrinsic Declaration mmintrin.h sse2,mmx _mm_empty void _mm_empty (void) mmintrin.h sse2,mmx _m_empty void _m_empty (vo...原创 2019-01-27 14:25:28 · 658 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(7) - 状态清除指令 & 小结
MMX State Management InstructionsEMMS指令清除MMX寄存器中的MMX状态。 指令 描述 EMMS 清除MMX状态,即x87浮点单元的tag word设置为空。 操作如下: x87FPUTagWord ß FFFFH; Intel C/C++ Compi...原创 2019-01-27 14:15:55 · 360 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(6) - 移位与循环移位指令
MMX Shift and Rotate InstructionsMMX移位与循环移位指令对组合的单字,双字或四字做移位/循环移位操作。 指令 描述 PSLLW 组合的单字逻辑左移 PSLLD 组合的双字逻辑左移 PSLLQ 组合的四字逻...原创 2019-01-27 13:46:43 · 1011 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(5) - 逻辑指令
MMX Logical Instructions逻辑指令对64位操作数做按位逻辑操作,包括与,与非,或,异或运算。 指令 描述 PAND 按位逻辑与操作 PANDN 按位逻辑与非操作 POR 按位逻辑或操作 PXOR...原创 2019-01-27 13:07:11 · 307 阅读 · 0 评论 -
Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - MMX技术(4) - 比较指令
MMX Comparison Instructions 指令 描述 PCMPEQB 组合的字节整型数,比较是否相等(相等置FF,不相等置00H),参看下图 PCMPEQW 组合的单字整型数,比较是否相等(相等置FF,不相等置00H) PCMPEQD ...原创 2019-01-27 10:22:14 · 555 阅读 · 0 评论