X86指令集的内容有哪些?

X86指令集的内容有哪些?,第1张

x86汇编指令

数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.

1. 通用数据传送指令.

MOV传送字或字节.

MOVSX 先符号扩展,再传送.

MOVZX 先零扩展,再传送.

MOVSX reg16,r/m8 o16 0F BE /r [386]

MOVSX reg32,r/m8 o32 0F BE /r [386]

MOVSX reg32,r/m16 o32 0F BF /r [386]

MOVZX reg16,r/m8 o16 0F B6 /r [386]

MOVZX reg32,r/m8 o32 0F B6 /r [386]

MOVZX reg32,r/m16 o32 0F B7 /r [386]

PUSH把字压入堆栈.

POP把字d出堆栈.

PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.

POPA把DI,SI,BP,SP,BX,DX,CX,AX依次d出堆栈.

PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.

POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次d出堆栈.

BSWAP 交换32位寄存器里字节的顺序

XCHG交换字或字节.( 至少有一个 *** 作数为寄存器,段寄存器不可作为 *** 作数)

CMPXCHG 比较并交换 *** 作数.( 第二个 *** 作数必须为累加器AL/AX/EAX )

XADD先交换再累加.( 结果在第一个 *** 作数里 )

XLAT字节查表转换.

—— BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即

0-FFH)返回 AL 为查表结果. ( [BX+AL]->AL )

2. 输入输出端口传送指令.

IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )

OUTI/O端口输出. ( 语法: OUT {端口号│DX},累加器 )

输入输出端口由立即方式指定时, 其范围是 0-255由寄存器 DX 指定时,

其范围是 0-65535.

3. 目的地址传送指令.

LEA装入有效地址.

例: LEA DX,string 把偏移地址存到DX.

LDS传送目标指针,把指针内容装入DS.

例: LDS SI,string 把段地址:偏移地址存到DS:SI.

LES传送目标指针,把指针内容装入ES.

例: LES DI,string 把段地址:偏移地址存到ES:DI.

LFS传送目标指针,把指针内容装入FS.

例: LFS DI,string 把段地址:偏移地址存到FS:DI.

LGS传送目标指针,把指针内容装入GS.

例: LGS DI,string 把段地址:偏移地址存到GS:DI.

LSS传送目标指针,把指针内容装入SS.

例: LSS DI,string 把段地址:偏移地址存到SS:DI.

4. 标志传送指令.

LAHF标志寄存器传送,把标志装入AH.

SAHF标志寄存器传送,把AH内容装入标志寄存器.

PUSHF 标志入栈.

POPF标志出栈.

PUSHD 32位标志入栈.

POPD32位标志出栈.

二、算术运算指令

———————————————————————————————————————

ADD加法.

ADC带进位加法.

INC加 1.

AAA加法的ASCII码调整.

DAA加法的十进制调整.

SUB减法.

SBB带借位减法.

DEC减 1.

NEC求反(以 0 减之).

CMP比较.(两 *** 作数作减法,仅修改标志位,不回送结果).

AAS减法的ASCII码调整.

DAS减法的十进制调整.

MUL无符号乘法.

IMUL整数乘法.

以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),

AAM乘法的ASCII码调整.

DIV无符号除法.

IDIV整数除法.

以上两条,结果回送:

商回送AL,余数回送AH, (字节运算)

或 商回送AX,余数回送DX, (字运算).

AAD除法的ASCII码调整.

CBW字节转换为字. (把AL中字节的符号扩展到AH中去)

CWD字转换为双字. (把AX中的字的符号扩展到DX中去)

CWDE字转换为双字. (把AX中的字符号扩展到EAX中去)

CDQ双字扩展.(把EAX中的字的符号扩展到EDX中去)

三、逻辑运算指令

———————————————————————————————————————

AND与运算.

OR 或运算.

XOR异或运算.

NOT取反.

TEST测试.(两 *** 作数作与运算,仅修改标志位,不回送结果).

SHL逻辑左移.

SAL算术左移.(=SHL)

SHR逻辑右移.

SAR算术右移.(=SHR)

ROL循环左移.

ROR循环右移.

RCL通过进位的循环左移.

RCR通过进位的循环右移.

以上八种移位指令,其移位次数可达255次.

移位一次时, 可直接用 *** 作码. 如 SHL AX,1.

移位>1次时, 则由寄存器CL给出移位次数.

如 MOV CL,04

SHL AX,CL

四、串指令

———————————————————————————————————————

DS:SI 源串段寄存器 :源串变址.

ES:DI 目标串段寄存器:目标串变址.

CX 重复次数计数器.

AL/AX 扫描值.

D标志 0表示重复 *** 作中SI和DI应自动增量1表示应自动减量.

Z标志 用来控制扫描或比较 *** 作的结束.

MOVS串传送.

( MOVSB 传送字符.MOVSW 传送字.MOVSD 传送双字. )

CMPS串比较.

( CMPSB 比较字符.CMPSW 比较字. )

SCAS串扫描.

把AL或AX的内容与目标串作比较,比较结果反映在标志位.

LODS装入串.

把源串中的元素(字或字节)逐一装入AL或AX中.

( LODSB 传送字符.LODSW 传送字.LODSD 传送双字. )

STOS保存串.

是LODS的逆过程.

REP当CX/ECX<>0时重复.

REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.

REPNE/REPNZ当ZF=0或比较结果不相等,且CX/ECX<>0时重复.

REPC 当CF=1且CX/ECX<>0时重复.

REPNC 当CF=0且CX/ECX<>0时重复.

五、程序转移指令

———————————————————————————————————————

1>无条件转移指令 (长转移)

JMP无条件转移指令

CALL过程调用

RET/RETF过程返回.

2>条件转移指令 (短转移,-128到+127的距离内)

( 当且仅当(SF XOR OF)=1时,OP1 JA/JNBE 不小于或不等于时转移.

JAE/JNB 大于或等于转移.

JB/JNAE 小于转移.

JBE/JNA 小于或等于转移.

以上四条,测试无符号整数运算的结果(标志C和Z).

JG/JNLE 大于转移.

JGE/JNL 大于或等于转移.

JL/JNGE 小于转移.

JLE/JNG 小于或等于转移.

以上四条,测试带符号整数运算的结果(标志S,O和Z).

JE/JZ 等于转移.

JNE/JNZ 不等于时转移.

JC 有进位时转移.

JNC无进位时转移.

JNO不溢出时转移.

JNP/JPO 奇偶性为奇数时转移.

JNS符号位为 "0" 时转移.

JO 溢出转移.

JP/JPE 奇偶性为偶数时转移.

JS 符号位为 "1" 时转移.

3>循环控制指令(短转移)

LOOPCX不为零时循环.

LOOPE/LOOPZCX不为零且标志Z=1时循环.

LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.

JCXZCX为零时转移.

JECXZ ECX为零时转移.

4>中断指令

INT中断指令

INTO溢出中断

IRET中断返回

5>处理器控制指令

HLT处理器暂停, 直到出现中断或复位信号才继续.

WAIT当芯片引线TEST为高电平时使CPU进入等待状态.

ESC转换到外处理器.

LOCK封锁总线.

NOP空 *** 作.

STC置进位标志位.

CLC清进位标志位.

CMC进位标志取反.

STD置方向标志位.

CLD清方向标志位.

STI置中断允许位.

CLI清中断允许位.

六、伪指令

———————————————————————————————————————

DW 定义字(2字节).

PROC定义过程.

ENDP过程结束.

SEGMENT 定义段.

ASSUME 建立段寄存器寻址.

ENDS段结束.

END程序结束.

七、寄存器

1. Register usage in 32 bit Windows

Function parameters are passed on the stack according to the calling conventions listed on

page 13. Parameters of 32 bits size or less use one DWORD of stack space. Parameters

bigger than 32 bits are stored in little-endian form, i.e. with the least significant DWORD at the

lowest address, and DWORD aligned.

Function return values are passed in registers in most cases. 8-bit integers are returned in

AL, 16-bit integers in AX, 32-bit integers, pointers, and Booleans in EAX, 64-bit integers in

EDX:EAX, and floating-point values in ST(0). Structures and class objects not exceeding

64 bits size are returned in the same way as integers, even if the structure contains floating

point values. Structures and class objects bigger than 64 bits are returned through a pointer

passed to the function as the first parameter and returned in EAX. Compilers that don\'t

support 64-bit integers may return structures bigger than 32 bits through a pointer. The

Borland compiler also returns structures through a pointer if the size is not a power of 2.

Registers EAX, ECX and EDX may be changed by a procedure. All other general-purpose

registers (EBX, ESI, EDI, EBP) must be saved and restored if they are used. The value of

ESP must be divisible by 4 at all times, so don\'t push 16-bit data on the stack. Segment

registers cannot be changed, not even temporarily. CS, DS, ES, and SS all point to the flat

segment group. FS is used for a thread environment block. GS is unused, but reserved.

Flags may be changed by a procedure with the following restrictions: The direction flag is 0

by default. The direction flag may be set temporarily, but must be cleared before any call or

return. The interrupt flag cannot be cleared. The floating-point register stack is empty at the

entry of a procedure and must be empty at return, except for ST(0) if it is used for return

value. MMX registers may be changed by the procedure and if so cleared by EMMS before

returning and before calling any other procedure that may use floating-point registers. All

XMM registers can be modified by procedures. Rules for passing parameters and return

values in XMM registers are described in Intel\'s application note AP 589 "Software

Conventions for Streaming SIMD Extensions". A procedure can rely on EBX, ESI, EDI, EBP

and all segment registers being unchanged across a call to another procedure.

2. Register usage in Linux

The rules for register usage in Linux appear to be almost the same as for 32-bit windows.

Registers EAX, ECX, and EDX may be changed by a procedure. All other general-purpose

registers must be saved. There appears to be no rule for the direction flag. Function return

values are transferred in the same way as under Windows. Calling conventions are the

same, except for the fact that no underscore is prefixed to public names. I have no

information about the use of FS and GS in Linux. It is not difficult to make an assembly

function that works under both Windows and Linux, if only you take these minor differences

into account.

八、位 *** 作指令,处理器控制指令

1.位 *** 作指令,8086新增的一组指令,包括位测试,位扫描。BT,BTC,BTR,BTS,BSF,BSR

1.1 BT(Bit Test),位测试指令,指令格式:

BT OPRD1,OPRD2,规则: *** 作作OPRD1可以是16位或32位的通用寄存器或者存储单元。 *** 作数OPRD2必须是8位立即数或者是与OPRD1 *** 作数长度相等的通用寄存器。如果用OPRD2除以OPRD1,假设商存放在Divd中,余数存放在Mod中,那么对OPRD1 *** 作数要进行测试的位号就是Mod,它的主要功能就是把要测试位的值送往CF,看几个简单的例子:

1.2 BTC(Bit Test And Complement),测试并取反用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位取反。

1.3 BTR(Bit Test And Reset),测试并复位,用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位复位(即清0)。

1.4 BTS(Bit Test And Set),测试并置位,用法和规则与BT是一样,但在功能有些不同,它不但将要测试位的值送往CF,并且还将该位置位(即置1)。

1.5 BSF(Bit Scan Forward),顺向位扫描,指令格式:BSF OPRD1,OPRD2,功能:将从右向左(从最低位到最高位)对OPRD2 *** 作数进行扫描,并将第一个为1的位号送给 *** 作数OPRD1。 *** 作数OPRD1,OPRD2可以是16位或32位通用寄存器或者存储单元,但OPRD1和OPRD2 *** 作数的长度必须相等。

1.6 BSR(Bit Scan Reverse),逆向位扫描,指令格式:BSR OPRD1,OPRD2,功能:将从左向右(从最高位到最低位)对OPRD2 *** 作数进行扫描,并将第一个为1的位号送给 *** 作数OPRD1。 *** 作数OPRD1,OPRD2可以是16位或32位通用寄存器或存储单元,但OPRD1和OPRD2 *** 作数的长度必须相等。

1.7 举个简单的例子来说明这6条指令:

AA DW 1234H,5678H

BB DW 9999H,7777H

MOV EAX,12345678H

MOV BX,9999H

BT EAX,8CF=0,EAX保持不变

BTC EAX,8CF=0,EAX=12345778H

BTR EAX,8CF=0,EAX=12345678H

BTS EAX,8CF=0,EAX=12345778H

BSF AX,BXAX=0

BSR AX,BXAX=15

BT WORD PTR [AA],4CF=1,[AA]的内容不变

BTC WORD PTR [AA],4CF=1,[AA]=1223H

BTR WORD PTR [AA],4CF=1,[AA]=1223H

BTS WORD PTR [AA],4CF=1,[AA]=1234H

BSF WORD PTR [AA],BX[AA]=0

BSR WORD PTR [AA],BX[AA]=15(十进制)

BT DWORD PTR [BB],12CF=1,[BB]的内容保持不变

BTC DWORD PTR [BB],12CF=1,[BB]=76779999H

BTR DWORD PTR [BB],12CF=1,[BB]=76779999H

BTS DWORD PTR [BB],12CF=1,[BB]=77779999H

BSF DWORD PTR [BB],12[BB]=0

BSR DWORD PTR [BB],12[BB]=31(十进制)

2.处理器控制指令

处理器控制指令主要是用来设置/清除标志,空 *** 作以及与外部事件同步等。

2.1 CLC,将CF标志位清0。

2.2 STC,将CF标志位置1。

2.3 CLI,关中断。

2.4 STI,开中断。

2.5 CLD,清DF=0。

2.6 STD,置DF=1。

2.7 NOP,空 *** 作,填补程序中的空白区,空 *** 作本身不执行任何 *** 作,主要是为了保持程序的连续性。

2.8 WAIT,等待BUSY引脚为高。

2.9 LOCK,封锁前缀可以锁定其后指令的 *** 作数的存储单元,该指令在指令执行期间一直有效。在多任务环境中,可以用它来保证独占其享内存,只有以下指令才可以用LOCK前缀:

XCHG,ADD,ADC,INC,SUB,SBB,DEC,NEG,OR,AND,XOR,NOT,BT,BTS,BTR,BTC

3.0 说明处理器类型的伪指令

.8086,只支持对8086指令的汇编

.186,只支持对80186指令的汇编

.286,支持对非特权的80286指令的汇编

.286C,支持对非特权的80286指令的汇编

.286P,支持对80286所有指令的汇编

.386,支持对80386非特权指令的汇编

.386C,支持对80386非特权指令的汇编

.386P,支持对80386所有指令的汇编

只有用伪指令说明了处理器类型,汇编程序才知道如何更好去编译,连接程序,更好地去检错。

九,FPU instructions(摘自fasm的帮助文档中,有时间我会反它翻译成中文的)

The FPU (Floating-Point Unit) instructions operate on the floating–point

values in three formats: single precision (32–bit), double precision (64–bit)

and double extended precision (80–bit). The FPU registers form the stack

and each of them holds the double extended precision floating–point value.

When some values are pushed onto the stack or are removed from the top,

the FPU registers are shifted, so st0 is always the value on the top of FPU

stack, st1 is the first value below the top, etc. The st0 name has also the

synonym st.

fld pushes the floating–point value onto the FPU register stack. The

operand can be 32–bit, 64–bit or 80–bit memory location or the FPU register,

it’s value is then loaded onto the top of FPU register stack (the st0 register)

and is automatically converted into the double extended precision format.

fld dword [bx] load single prevision value from memory

fld st2 push value of st2 onto register stack

fld1, fldz, fldl2t, fldl2e, fldpi, fldlg2 and fldln2 load the commonly

used contants onto the FPU register stack. The loaded constants are

+1.0, +0.0, log2 10, log2 e, pi, log10 2 and ln 2 respectively. These instructions

have no operands.

fild convert the singed integer source operand into double extended precision

floating-point format and pushes the result onto the FPU register stack.

The source operand can be a 16–bit, 32–bit or 64–bit memory location.

fild qword [bx] load 64-bit integer from memory

fst copies the value of st0 register to the destination operand, which can

be 32–bit or 64–bit memory location or another FPU register. fstp performs

the same operation as fst and then pops the register stack, getting rid of

st0. fstp accepts the same operands as the fst instruction and can also

store value in the 80–bit memory.

fst st3 copy value of st0 into st3 register

fstp tword [bx] store value in memory and pop stack

fist converts the value in st0 to a signed integer and stores the result

in the destination operand. The operand can be 16–bit or 32–bit memory

location. fistp performs the same operation and then pops the register

stack, it accepts the same operands as the fist instruction and can also store

integer value in the 64–bit memory, so it has the same rules for operands as

fild instruction.

fbld converts the packed BCD integer into double extended precision

floating–point format and pushes this value onto the FPU stack. fbstp

converts the value in st0 to an 18–digit packed BCD integer, stores the

result in the destination operand, and pops the register stack. The operand

should be an 80–bit memory location.

fadd adds the destination and source operand and stores the sum in the

destination location. The destination operand is always an FPU register,

if the source is a memory location, the destination is st0 register and only

source operand should be specified. If both operands are FPU registers, at

least one of them should be st0 register. An operand in memory can be a

32–bit or 64–bit value.

fadd qword [bx] add double precision value to st0

fadd st2,st0 add st0 to st2

faddp adds the destination and source operand, stores the sum in the destination

location and then pops the register stack. The destination operand

must be an FPU register and the source operand must be the st0. When no

operands are specified, st1 is used as a destination operand.

38 CHAPTER 2. INSTRUCTION SET

faddp add st0 to st1 and pop the stack

faddp st2,st0 add st0 to st2 and pop the stack

fiadd instruction converts an integer source operand into double extended

precision floating–point value and adds it to the destination operand.

The operand should be a 16–bit or 32–bit memory location.

fiadd word [bx] add word integer to st0

fsub, fsubr, fmul, fdiv, fdivr instruction are similar to fadd, have

the same rules for operands and differ only in the perfomed computation.

fsub substracts the source operand from the destination operand, fsubr

substract the destination operand from the source operand, fmul multiplies

the destination and source operands, fdiv divides the destination operand by

the source operand and fdivr divides the source operand by the destination

operand. fsubp, fsubrp, fmulp, fdivp, fdivrp perform the same operations

and pop the register stack, the rules for operand are the same as for the faddp

instruction. fisub, fisubr, fimul, fidiv, fidivr perform these operations

after converting the integer source operand into floating–point value, they

have the same rules for operands as fiadd instruction.

fsqrt computes the square root of the value in st0 register, fsin computes

the sine of that value, fcos computes the cosine of that value, fchs

complements its sign bit, fabs clears its sign to create the absolute value,

frndint rounds it to the nearest integral value, depending on the current

rounding mode. f2xm1 computes the exponential value of 2 to the power of

st0 and substracts the 1.0 from it, the value of st0 must lie in the range ?1.0

to +1.0. All these instruction store the result in st0 and have no operands.

fsincos computes both the sine and the cosine of the value in st0 register,

stores the sine in st0 and pushes the cosine on the top of FPU register

stack. fptan computes the tangent of the value in st0, stores the result in

st0 and pushes a 1.0 onto the FPU register stack. fpatan computes the

arctangent of the value in st1 divided by the value in st0, stores the result

in st1 and pops the FPU register stack. fyl2x computes the binary logarithm

of st0, multiplies it by st1, stores the result in st1 and pop the FPU

register stackfyl2xp1 performs the same operation but it adds 1.0 to st0

before computing the logarithm. fprem computes the remainder obtained

from dividing the

CPU扩展指令集指的是CPU增加的多媒体或者是3D处理指令,这些扩展指令可以提高CPU处理多媒体和3D图形的能力。著名的有MMX(多媒体扩展指令)、SSE(因特网数据流单指令扩展)和3DNow!指令集。CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。

基本概况

CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)、SEE3和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。通常会把CPU的扩展指令集称为"CPU的指令集"。SSE3指令集也是规模最小的指令集,此前MMX包含有57条命令,SSE包含有50条命令,SSE2包含有144条命令,SSE3包含有13条命令。[1]

编辑本段精简指令集的运用

在最初发明计算机的数十年里,随着计算机功能日趋增大,性能日趋变强,内部元器件也越来越多,指令集日趋复杂,过于冗杂的指令严重的影响了计算机的工作效率。后来经过研究发现,在计算机中,80%程序只用到了20%的指令集,基于这一发现,RISC精简指令集被提了出来,这是计算机系统架构的一次深刻革命。RISC体系结构的基本思路是:抓住CISC指令系统指令种类太多、指令格式不规范、寻址方式太多的缺点,通过减少指令种类、规范指令格式和简化寻址方式,方便处理器内部的并行处理,提高VLSI器件的使用效率,从而大幅度地提高处理器的性能。

编辑本段相关原理

CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)、SEE3、SEE4和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。我们通常会把CPU的扩展指令集称为”CPU的指令集”。SSE3指令集也是目前规模最小的指令集,此前MMX包含有57条命令,SSE包含有50条命令,SSE2包含有144条命令,SSE3包含有13条命令。目前SSE3也是最先进的指令集,英特尔Prescott处理器已经支持SSE3指令集,AMD会在未来双核心处理器当中加入对SSE3指令集的支持,全美达的处理器也将支持这一指令集。

编辑本段基本分类

从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。通常会把CPU的扩展指令集称为"CPU的指令集"。

编辑本段服务器CPU按指令集分类

CISC指令集

CISC指令集,也称为复杂指令集,英文名是CISC,(Complex Instruction Set Computer的缩写)。在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个 *** 作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。其实它是英特尔生产的x86系列(也就是IA-32架构)CPU及其兼容CPU,如AMD、VIA的。即使是新起的X86-64(也被成AMD64)都是属于CISC的范畴。X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加了X87芯片,以后就将X86指令集和X87指令集统称为X86指令集。 虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486直到过去的PII至强、PIII至强、Pentium 3,最后到Pentium 4系列、至强(不包括至强Nocona),但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel X86系列及其兼容CPU(如AMD Athlon MP、)都使用X86指令集,所以就形成了庞大的X86系列及兼容CPU阵容。x86CPU目前主要有intel的服务器CPU和AMD的服务器CPU两类。

RISC指令集

RISC是英文“Reduced Instruction Set Computing ” 的缩写,中文意思是“精简指令集”。它是在CISC指令系统基础上发展起来的,有人对CISC机进行测试表明,各种指令的使用频度相当悬殊,最常使用的是一些比较简单的指令,它们仅占指令总数的20%,但在程序中出现的频度却占80%。复杂的指令系统必然增加微处理器的复杂性,使处理器的研制时间长,成本高。并且复杂指令需要复杂的 *** 作,必然会降低计算机的速度。基于上述原因,20世纪80年代RISC型CPU诞生了,相对于CISC型CPU ,RISC型CPU不仅精简了指令系统,还采用了一种叫做“超标量和超流水线结构”,大大增加了并行处理能力。RISC指令集是高性能CPU的发展方向。它与传统的CISC(复杂指令集)相对。相比而言,RISC的指令格式统一,种类比较少,寻址方式也比复杂指令集少。当然处理速度就提高很多了。目前在中高档服务器中普遍采用这一指令系统的CPU,特别是高档服务器全都采用RISC指令系统的CPU。RISC指令系统更加适合高档服务器的 *** 作系统UNIX,Linux也属于类似UNIX的 *** 作系统。RISC型CPU与Intel和AMD的CPU在软件和硬件上都不兼容。在中高档服务器中采用RISC指令的CPU主要有以下几类:PowerPC处理器 、SPARC处理器、PA-RISC处理器、MIPS处理器、Alpha处理器。

IA-64

EPIC(Explicitly Parallel Instruction Computers,精确并行指令计算机)是否是RISC和CISC体系的继承者的争论已经有很多,单以EPIC体系来说,它更像Intel的处理器迈向RISC体系的重要步骤。从理论上说,EPIC体系设计的CPU,在相同的主机配置下,处理Windows的应用软件比基于Unix下的应用软件要好得多。 Intel采用EPIC技术的服务器CPU是安腾Itanium(开发代号即Merced)。它是64位处理器,也是IA-64系列中的第一款。微软也已开发了代号为Win64的 *** 作系统,在软件上加以支持。在Intel采用了X86指令集之后,它又转而寻求更先进的64-bit微处理器,Intel这样做的原因是,它们想摆脱容量巨大的x86架构,从而引入精力充沛而又功能强大的指令集,于是采用EPIC指令集的IA-64架构便诞生了。IA-64 在很多方面来说,都比x86有了长足的进步。突破了传统IA32架构的许多限制,在数据的处理能力,系统的稳定性、安全性、可用性、可观理性等方面获得了突破性的提高。 IA-64微处理器最大的缺陷是它们缺乏与x86的兼容,而Intel为了IA-64处理器能够更好地运行两个朝代的软件,它在IA-64处理器上(Itanium、Itanium2 ……)引入了x86-to-IA-64的解码器,这样就能够把x86指令翻译为IA-64指令。这个解码器并不是最有效率的解码器,也不是运行x86代码的最好途径(最好的途径是 直接在x86处理器上运行x86代码),因此Itanium 和Itanium2在运行x86应用程序时候的性能非常糟糕。这也成为X86-64产生的根本原因。

X86-64 (AMD64 / EM64T)

AMD公司设计,可以在同一时间内处理64位的整数运算,并兼容于X86-32架构。其中支持64位逻辑定址,同时提供转换为32位定址选项;但数据 *** 作指令默认为32位和8位,提供转换成64位和16位的选项;支持常规用途寄存器,如果是32位运算 *** 作,就要将结果扩展成完整的64位。这样,指令中有“直接执行”和“转换执行”的区别,其指令字段是8位或32位,可以避免字段过长。 x86-64(也叫AMD64)的产生也并非空穴来风,x86处理器的32bit寻址空间限制在4GB内存,而IA-64的处理器又不能兼容x86。AMD充分考虑顾客的需求,加强x86指令集的功能,使这套指令集可同时支持64位的运算模式,因此AMD把它们的结构称之为x86-64。在技术上AMD在x86-64架构中为了进行64位运算,AMD为其引入了新增了R8-R15通用寄存器作为原有X86处理器寄存器的扩充,但在而在32位环境下并不完全使用到这些寄存器。原来的寄存器诸如EAX、EBX也由32位扩张至64位。在SSE单元中新加入了8个新寄存器以提供对SSE2的支持。寄存器数量的增加将带来性能的提升。与此同时,为了同时支持32和64位代码及寄存器,x86-64架构允许处理器工作在以下两种模式:Long Mode(长模式)和Legacy Mode(遗传模式),Long模式又分为两种子模式(64bit模式和Compatibility mode兼容模式)。该标准已经被引进在AMD服务器处理器中的Opteron处理器。 而推出了支持64位的EM64T技术,再还没被正式命为EM64T之前是IA32E,这是英特尔64位扩展技术的名字,用来区别X86指令集。Intel的EM64T支持64位sub-mode,和AMD的X86-64技术类似,采用64位的线性平面寻址,加入8个新的通用寄存器(GPRs),还增加8个寄存器支持SSE指令。与AMD相类似,Intel的64位技术将兼容IA32和IA32E,只有在运行64位 *** 作系统下的时候,才将会采用IA32E。IA32E将由2个sub-mode组成:64位sub-mode和32位sub-mode,同AMD64一样是向下兼容的。Intel的EM64T将完全兼容AMD的X86-64技术。Nocona处理器已经加入了一些64位技术,Intel的Pentium 4E处理器也支持64位技术。 应该说,这两者都是兼容x86指令集的64位微处理器架构,但EM64T与AMD64还是有一些不一样的地方,AMD64处理器中的NX位在Intel的处理器中将没有提供。[2]

编辑本段扩展指令集

综述

对于CPU来说,在基本功能方面,它们的差别并不太大,基本的指令集也都差不多,但是许多厂家为了提升某一方面性能,又开发了扩展指令集,扩展指令集定义了新的数据和指令,能够大大提高某方面数据处理能力,但必需要有软件支持。

MMX 指令集

MMX发布于1997年,一共57条指令,除了emms、movd和movq这3个指令,其他所有的MMX指令都以字母p开头。MMX指令与FPU(浮点运算器)使用同样的8个通用寄存器,准确说是借用了FPU每个寄存器的前64位,这样MMX指令一次最多可以处理8个字节或者4个字节或者2个双字节或者1个4字节的数据,理论上可以将运算速度最高提高8倍。 MMX与FPU共用寄存器证明了Intel的短视,因为如果FPU要使用寄存器,MMX这时必须暂时退出,等FPU用完之后才能恢复原状。加上早期Intel处理器具有很强的浮点运算能力,游戏开发者都喜欢采用浮点运算,冲突的结果就是MMX的作用大打折扣,甚至有时还会造成性能的瞬间剧降。 Intel没有沿用MMX的称呼,1999年的Pentium Ⅲ处理器上指令集改称SSE。SSE采用了单独的寄存器,解决了与FPU冲突的问题。8个128位单独的SSE寄存器,支持同时处理 4 个单精度浮点数,能够同时处理的数据比64位的MMX翻了一番。SSE一共有70条指令,进一步提升了CPU多媒体处理能力。也从这时开始,SSE的名称固定了下来。MMX指令集Intel代表处理器:Pentium MMX

SSE指令集

SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来"KNI"指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的"MMX2"则完全是硬件评论家们和媒体凭感觉和印象对"KNI"的 评价,Intel公司从未正式发布过关于MMX2的消息。 而最终推出的SSE指令集也就是所谓胜出的"互联网SSE"指令集。SSE指令集包括了70条指令,其中包含提高3D图形运算效率的50条SIMD(单指令多数据技术)浮点运算指令、12条MMX 整数运算增强指令、8条优化内存中连续数据块传输指令。理论上这些指令对目前流行的图像处理、浮点运算、3D运算、视频处理、音频处理等诸多多媒体应用起到全面强化的作用。SSE指令与3DNow!指令彼此互不兼容,但SSE包含了3DNow!技术的绝大部分功能,只是实现的方法不同。SSE兼容MMX指令,它可以通过SIMD和单时钟周期并行处理多个浮点数据来有效地提高浮点运算速度。 SSE指令集Intel代表处理器:Pentium III

SSE2指令集

SSE2(Streaming SIMD Extensions 2,Intel官方称为SIMD 流技术扩展 2或数据流单指令多数据扩展指令集 2)指令集是Intel公司在SSE指令集的基础上发展起来的。相比于SSE,SSE2使用了144个新增指令,扩展了MMX技术和SSE技术,这些指令提高了广大应用程序的运行性能。随MMX技术引进的SIMD整数指令从64位扩展到了128 位,使SIMD整数类型 *** 作的有效执行率成倍提高。双倍精度浮点SIMD指令允许以 SIMD格式同时执行两个浮点 *** 作,提供双倍精度 *** 作支持有助于加速内容创建、财务、工程和科学应用。除SSE2指令之外,最初的SSE指令也得到增强,通过支持多种数据类型(例如,双字和四字)的算术运算,支持灵活并且动态范围更广的计算功能。SSE2指令可让软件开发员极其灵活的实施算法,并在运行诸如MPEG-2、MP3、3D图形等之类的软件时增强性能。Intel是从Willamette核心的Pentium 4开始支持SSE2指令集的,而AMD则是从K8架构的SledgeHammer核心的Opteron开始才支持SSE2指令集的。 SSE2指令集Intel代表处理器:老Pentium 4

SSE3指令集

SSE3(Streaming SIMD Extensions 3,Intel官方称为SIMD 流技术扩展 3或数据流单指令多数据扩展指令集 3)指令集是Intel公司在SSE2指令集的基础上发展起来的。相比于SSE2,SSE3在SSE2的基础上又增加了13个额外的SIMD指令。SSE3 中13个新指令的主要目的是改进线程同步和特定应用程序领域,例如媒体和游戏。这些新增指令强化了处理器在浮点转换至整数、复杂算法、视频编码、SIMD浮点寄存器 *** 作以及线程同步等五个方面的表现,最终达到提升多媒体和游戏性能的目的。Intel是从Prescott核心的Pentium 4开始支持SSE3指令集的,而AMD则是从2005年下半年Troy核心的Opteron开始才支持SSE3的。但是需要注意的是,AMD所支持的SSE3与Intel的SSE3并不完全相同,主要是删除了针对Intel超线程技术优化的部分指令。 SSE3指令集Intel代表处理器:基于Prescott核心新Pentium 4

3D Now!(3D no waiting)指令集

3DNow!是AMD公司开发的SIMD指令集,可以增强浮点和多媒体运算的速度,并被AMD广泛应用于其K6-2 、K6-3以及Athlon(K7)处理器上。3DNow!指令集技术其实就是21条机器码的扩展指令集。 与Intel公司的MMX技术侧重于整数运算有所不同,3DNow!指令集主要针对三维建模、坐标变换 和效果渲染等三维应用场合,在软件的配合下,可以大幅度提高3D处理性能。后来在Athlon上开发了Enhanced 3DNow!。这些AMD标准的SIMD指令和Intel的SSE具有相同效能。因为受到Intel在商业上以及Pentium III成功的影响,软件在支持SSE上比起3DNow!更为普遍。Enhanced 3DNow!AMD公司继续增加至52个指令,包含了一些SSE码,因而在针对SSE做最佳化的软件中能获得更好的效能。 一个指令,同时处理多个数据的好创意,其他CPU当然也不会放过。AMD看到Intel MMX,眼红之下在K6 CPU里搞出了一个类似的3DNow!因为MMX与浮点数混用时性能会有下降的情况,支持浮点数并行处理的3DNow!找着了机会。其实是AMD占了Intel的便宜,因为很多程序员把3DNow!作为MMX的一个补充,处理整数的时候用MMX,处理浮点数的时候用3DNow!。 1999年的时候,AMD在Athlon处理器上又添加了几个指令,这就是3DNow!+,又被称为3DNow!2。不过看到大势已去,AMD终于放弃了在多媒体指令集上的抵抗,转而支持Intel SSE,这样双方一直到SSE3都相安无事。统一的标准其实是一件好事,要是一个软件分别有SSE版本和3DNow!+版本,开发者和用户很快都会不堪其扰。 但是最近AMD和Intel在多媒体指令集上又开始大打出手,大有分道扬镳的势头。与Intel SSE4.1针锋相对,AMD Phenom只支持SSE4A指令集,并且AMD在去年8月抢先放出了SSE5的风声,而Intel则断然拒绝支持AMD的SSE5,直到现在双方还相持不下。

SSE4指令集

SSE4指令集是Conroe架构所引入的新指令集。这项原本计划应用于NetBurst微架构Tejas核心处理器之上的全新技术也随着它的夭折最终没能实现,这不能不说是个遗憾,但是SSE4指令集出现在了Conroe上又让我们看到了希望。 SSE4指令集共包括16条指令,不过虽然扣肉处理器推出已经有一些时日,但目前英特尔仍没有公布SSE4指令集的具体资料。这相当令人感到纳闷。也许英特尔是基于特殊的考虑,仅让少数合作软件厂商取得数据,只是这种作法实在很没有说服力就是了,天底下没有哪家处理器厂商,希望自己新增的指令越少人用越好。 不过,从Intel Core微架构针对SSE指令所作出的修改被称之为“Intel Advanced Digital Media Boost”技术来看,未来SSE4将更注重针对视频方面的优化,我们认为SSE4主要改进之处可能将针对英特尔的Clear Video高清视频技术及UDI接口规范提供强有力的支持。这两项技术基于965芯片组,Intel的官方把Clear Video技术定义为:支持高级解码、拥有预处理和增强型3D处理能力。 值得一提的是,在SSE4中另一个重要的改进就是提供完整128位宽的SSE执行单元,一个频率周期内可执行一个128位SSE指令。Conroe中SSE的ADDPS(4D 32bit共128bit,单精度加法)、MULPS(4D 32bit共128bit,单精度乘法)和SSE2的ADDPD(2D 64bit共128bit,双精度加法)、MULPD(2D 64bit共128bit,双精度乘法),这四条重要SSE算术指令的吞吐周期都降低到1个周期,真正做到了英特尔宣称的每个周期执行一条128位向量加法指令和一条128位向量乘法指令的能力。 据Intel指出,在应用SSE4指令集后,Penryn增加了2个不同的32Bit向量整数乘法运算支持,引入了8 位无符号 (Unsigned)最小值及最大值运算,以及16Bit 及32Bit 有符号 (Signed) 及无符号运算,并有效地改善编译器效率及提高向量化整数及单精度代码的运算能力。同时,SSE4 改良插入、提取、寻找、离散、跨步负载及存储等动作,令向量运算进一步专门化。 SSE4加入了6条浮点型点积运算指令,支持单精度、双精度浮点运算及浮点产生 *** 作,且IEEE 754指令 (Nearest, -Inf, +Inf, and Truncate) 可立即转换其路径模式,大大减少延误,这些改变将对游戏及 3D 内容制作应用有重要意义。 此外,SSE4加入串流式负载指令,可提高以图形帧缓冲区的读取数据频宽,理论上可获取完整的快取缓存行,即每次读取64Bit而非8Bit,并可保持在临时缓冲区内,让指令最多可带来8倍的读取频宽效能提升,对于视讯处理、成像以及图形处理器与中央处理器之间的共享数据应用,有着明显的效能提升。 据Intel资深工程师兼 Penryn 微架构主管 Stephen Fischer 表示,全新 DivX Alaph 内部测试版本已完全支持SSE4指令集, 1颗 3.33G Hz 的Yorkfield的运算效能,相比上代Intel Core 2 Duo QX6800快约105% ,其中约7成的增益来自SSE4指令集,效果令人满意。

SSSE3指令集

(Supplemental Streaming SIMD Extensions 3)内置于Intel公司微处理器中的多媒体关联的扩张指令集。是扩张了SSE3的产品,于2006年7月首次装载在Core 2 Duo处理器中。 SSE3装载了用一个命令一口气处理复数个数据的「SIMD」的处理方式,特别在处理语音和动画关联上能够高速地发挥力量。SSSE3是在 SSE3命令的基础上又添加了32个新命令的产品,其原名为TNI,是SSE4指令集的子集,包含有13条命令。目前SSSE3也是最先进的指令集,增强了CPU的多媒体、图形图象和Internet等的处理能力。 SSSE3指令集Intel代表处理器:65nm 酷睿2

SSE4.2指令集

在Nehalem架构的Core i7处理器中,SSE4.2指令集被引入,加入了STTNI(字符串文本新指令)和ATA(面向应用的加速)两大优化指令。SSE4.2新加入的几条新指令有两类。第一类是字符串与文本新指令STTNI,STTNI包含了四条具体的指令。STTNI指令可以对两个16位的数据进行匹配 *** 作,以加速在XML分析方面的性能。据Intel表示,新指令可以在XML分析方面取得3.8倍的性能提升。 第二类指令是面向应用的加速指令ATA。ATA包括冗余校验的CRC32指令、计算源 *** 作数中非0位个数的POPCNT指令,以及对于打包的64位算术运算的SIMD指令。CRC32指令可以取代上层数据协议中经常用到的循环冗余校验,据Intel表示其加速比可以达到6.5~18.6倍;POPCNT用于提高在DNA基因配对、声音识别等包含大数据集中进行模式识别和搜索等 *** 作的应用程序性能。 Intel也公布了支持新指令集的开发工具。这些工具涵盖了主流的编译开发环境。目前已明确支持SSE4.2的开发环境包括:Intel C++ Compiler 10.X、微软的Visual Studio 2008 VC++、GCC 4.3.1、Sun Studio Express等。程序员可以直接使用高级编程语言编程,编译器会自动生成优化结果。当然程序员也可以用内嵌汇编的方式来达到目的。

AMD64位技术

AMD的athlon 64系列处理器的64位技术是在X86指令集的基础上加入了X86-64的64位扩展X86指令集,这就使得athlon 64系列处理器可兼容原来的32位的X86软件,并同时支持X86-64的扩展64位计算,并且具有64位的寻址能力,使得它成为真正的64位X86构架处理器。在采用X86-64架构的Athlon 64处理器中,X86-64指令集中新增了几组处理器寄存器,它能够提供更加快速的执行效率。寄存器是处理器用来创建和储存CPU运算结果和其他运算结果的地方,标准的X86构架中包括8组通用寄存器,而在AMD的X86-64架构中又增加了8组,将通过寄存器的数目提高到了16组。在这基础之上,X86-64指令集还另外增加了8组128位的XMM寄存器,也叫做SSE寄存器。它能够给单指令多数据流技术(SIMD)运算提供更多的存储空间,这些128位的寄存器能够提供在矢量和标量计算模式下进行128位双精度处理,这也为3D数据处理、矢量分析和虚拟技术提供了良好的硬件基础。由于提供了更多的寄存器,按照X86-64标准生产的处理器可以更有效率的处理数据,在一个时钟周期内能够传输更多的信息。

EM64T技术

EM64T(Extended Memory 64 Technology)也就是Intel公司开发的64位内存扩展技术。它实际上就是Intel IA-32构架体系的扩展,既IA-32E(Intel Architectur-32 Extension)。Intel的IA-32处理器通过加入EM64T技术便可在兼容IA-32软件的情况下,允许软件程序利用更多的内存地址空间,并且允许程序进行32 位线性地址写入。Intel的EM64T所强调的是32位技术与64位技术的兼容性,为采用EM64T的处理器增加了8个64位通用寄存器,并将原有的32位通用寄存器全部扩展为64位,这样也提高了处理器的整数运算能力。另外增加的8个SEE寄存器也提供了对SSE、SSE2和SSE3指令的支持。 Intel的主流桌面处理器共有两个模式,传统的IA-32模式和IA-32E模式。在可支持EM64T指令的处理器内有一个扩展功能激活寄存器(Extended Feature Enable Register),称为IA-32_EFER的部件,它控制处理器的EM64T是否被激活。在普通情况下,处理器会作为一颗标准的IA-32处理器,如果在运行64位的软件或程序时,EM64T就会被激活,那么处理器便会在IA-32E扩展模式下运行。

编辑本段指令展望

AMD表示,SSE5指令集的使命之一是增强高性能计算应用,并充分发挥多核心、多媒体的并行优势。SSE5将把以往只存在于高性能特殊架构里的功能引入到x86平台中,以此最大化每条指令的输出能力,并增强代码库。 SSE5是128-bit指令集,一共有170条指令,其中基础指令64条,新增的最重要的有两条: 首先是“三 *** 作数指令”(3-Operand InstrUCtions)。x86指令以往只能处理双 *** 作数,而SSE5会提高到三 *** 作数,达到RISC架构的水平,从而把多个简单的指令集整合到更高效的一个单独指令中,提高执行效率。 然后是“熔合乘法累积”(Fused Multiply Accumulate,FMACxx)。该技术可以把乘法和其他算法结合起来,保证之用一条指令就能完成迭代运算,从而简化代码、提高效率,适用于真实图形着色、快速照相渲染、空间化音频、复向量(矢量)数学等场合。 除此之外还有整数乘法累积指令(IMAC,IMADC)、置换与条件移动指令、向量比较与测试指令、精度控制舍入与变换指令等等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7110494.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-01
下一篇 2023-04-01

发表评论

登录后才能评论

评论列表(0条)

保存