X86指令集的内容有哪些?
x86
通用寄存器少,64位架构下只有16个。32位的只有8个。而且很多指令隐形的依赖或修改通用寄存器。8个使用有严格的限制,8个可以自由使用。这造成为了遵守这些寄存器使用规则,经常需要将寄存器之间的数据互相移动。
因为有限的通用寄存器数量以及其中还有限制使用规则,为指令分配使用的寄存器时,经常会出现一些指令本没有依赖关系,现在共用同一个寄存器而出现了依赖关系。
这对于处理器流水线技术来说非常不友好,因为指令之间存在依赖关系时,后一个指令需要等待前一个指令执行完毕才能执行。这不能发挥流水线的优点了。而为了实现高性能,则需要添加寄存器重命名技术,将指令之间虚拟的依赖关系取出。
x86指令可变长度,而且是其中最糟糕的一种,确定一条指令有多少字节,需要从指令第一个字节逐个检测。现有x86指令结构最长15个字节,内部结构最多可划分成七八个部分。前一个部分确定了,才能确定下一个部分,直至确定指令末尾。
这种复杂结构,对处理器指令解码模块非常不好,需要很多数量晶体管实现解码功能。
而MIPS结构指令长度固定的,32位,4个字节。也就是说解码无须了解指令内部特征,就可以快速知道下一个指令的位置。指令地址+4就可以了。而且MIPS指令内部结构也非常简单。同样的解码模块使用很少 的晶体管就可以是实现解码了。
8086实现为了提供20位地址空间,1兆字节的能力,设计了一个分段机制,因为16位通用寄存器只有16位地址访问能力。所以专门设计了一组段寄存器。每次访问内存时,都用段寄存器内的段基地址加上通用寄存器内的地址,得到一个20位地址。
到了32位时代,其实这种分段机制可以彻底去掉,因为32位通用寄存器就有32位地址访问能力,4G字节内存。但是x86依然保留了这种分段机制,而且结果比原来的段寄存器还更复杂了。可是实际的操作系统不管WINDOWS还是LINUX都没有使用这种分段机制。这些操作系统通过对段寄存器以及相关结构通过合理设置,使得段基地址值为0。在软件层面相当于没有使用分段机制。但是处理器却必须实现这个分段机制。每次指令访问内存时,都需要段基地址加上通用寄存器内的地址,哪怕段基地址为0。实际上处理器上实现分段机制的模块完全多余,但是x86必须实现该功能。
x86有很多种寻址机制。有几种寻址方式极少使用,结构也非常复杂,对于处理器设计有非常不友好。为了实现寻址机制,也需要大量的处理器设计。
x86中有很多为了减少程序中指令数量而设计的指令,就是将多条指令的功能合并到一条指令上。虽然在效果上它们是相等的。但是这种超级指令,也对处理器设计增加了负担。
x86到目前为止指令总数非常大,处理器内对指令的解码和执行指令的功能,相关的晶体管数量需要很大数量。其实x86中很多指令都可以拆解成多个功能更基本的指令。
虽然现在的x86内部采取了RISC精简指令的设计思想,内部使用少量基本的指令表示。x86指令被解码器处理后可能拆解成多个x86内部RISC指令,再做后续处理。但是这本身还是需要一定复杂的结构实现它的。
总之,指令结构复杂,增加了解码模块的负担。指令数量多,增加功能执行模块的负担。
X86是一个cpu的结构体系
是早年的ibmpersonalcomputer 上的intel处理器体系结构
是ibm和intel联合制定的80386就是第一个cpu
80386 80486 80586 都是86结尾的
所以没有x87
只有的处理器叫做pentium 他是今天处理器的雏形,是里程碑的产品
因为他里面加入了指令集的概念,sse1、2、3、4还有x64都是
而这也是借鉴了risc处理器的体征
risc的处理器主要是ibm power g系列和sun的ultraSPARC
x86应该是cisc主要区别就是指令的长度和处理方式
现在的处理器我看大有向risc发展了因为现在处理器有点过于复杂
同时手持设备也逐渐兴起risc也得到了广大应用
东西比较多 搜索以下吧
搜索内容比较多,都看一遍因为有很多冲突的地方需要理解
risc cisc x86 , arm mips这连个是里程碑的公司了解一下他的产品
ps我也想买个ipad,可是无奈与兼容问题atom似乎太不给力了
还好现在传出了Ontario就是不知道什么时候上
数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.
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 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
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} )
OUT I/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位标志入栈.
POPD 32位标志出栈.
二、算术运算指令
———————————————————————————————————————
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>循环控制指令(短转移)
LOOP CX不为零时循环.
LOOPE/LOOPZ CX不为零且标志Z=1时循环.
LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.
JCXZ CX为零时转移.
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,8;CF=0,EAX保持不变
BTC EAX,8;CF=0,EAX=12345778H
BTR EAX,8;CF=0,EAX=12345678H
BTS EAX,8;CF=0,EAX=12345778H
BSF AX,BX;AX=0
BSR AX,BX;AX=15
BT WORD PTR [AA],4;CF=1,[AA]的内容不变
BTC WORD PTR [AA],4;CF=1,[AA]=1223H
BTR WORD PTR [AA],4;CF=1,[AA]=1223H
BTS WORD PTR [AA],4;CF=1,[AA]=1234H
BSF WORD PTR [AA],BX;[AA]=0;
BSR WORD PTR [AA],BX;[AA]=15(十进制)
BT DWORD PTR [BB],12;CF=1,[BB]的内容保持不变
BTC DWORD PTR [BB],12;CF=1,[BB]=76779999H
BTR DWORD PTR [BB],12;CF=1,[BB]=76779999H
BTS DWORD PTR [BB],12;CF=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 stack; fyl2xp1 performs the same operation but it adds 1.0 to st0
before computing the logarithm. fprem computes the remainder obtained
from dividing the
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
把字弹出堆栈.
PUSHA
把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA
把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD
把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD
把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
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}
)
OUT
I/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
;把段地址:偏移地
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条命令。目前SSE3也是最先进的指令集,英特尔Prescott处理器已经支持SSE3指令集,AMD会在未来双核心处理器当中加入对SSE3指令集的支持,全美达的处理器也将支持这一指令集。
指令集:
(1) X86指令集要知道什么是指令集还要从当今的X86架构的CPU说起。X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器则另外使用X87指令,以后就将X86指令集和X87指令集统称为X86指令集。虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486直到今天,但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel X86系列及其兼容CPU都使用X86指令集,所以就形成了今天庞大的X86系列及兼容CPU阵容。
(2) RISC指令集RISC指令集是以后高性能CPU的发展方向。它与传统的CISC(复杂指令集)相对。相比而言,RISC的指令格式统一,种类比较少,寻址方式也比复杂指令集少。当然处理速度就提高很多了。而且RISC指令集还兼容原来的X86指令集。
CPU表面的字写2.00GH2\/512\/800\/86是什么意思
2.00GH2指CPU的主频,主频越高CPU性能越好 512KB是指CPU的二级缓存,二级缓存越大,CPU性能更强劲,我们一般简称为L2 800指CPU前端总线同样也是越大越好,但是一般都是根据主板来选择的。单位是MHz,意为兆赫 86指64位CPU
为什么32位也叫×86?
所以都属于X86家族.这里的64位技术是相对于32位而言的,这个位数指的是CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集就是运行64位数据的指令,也就是说处理器一次可以运行64bit数据。64bit处理器并非现在才有的,在高端的RISC(Reduced Instruction Set Computing,精简...
电脑86位是什么意思
纠正一下,只有32和64位,没有86位,你说的86应该是X86,这个是cpu的指令集,属于32位指令集的一种,所以如果说是x86的系统的话,那么就是32位的。除非特殊注明是x86-64,这个是64位的,属于x86的64位扩展,通过这种指令集扩展可以支持64位指令,并可以运行64位的操作系统。一般日常娱乐和办公使用...
介绍一下CPU的历史
Pentium M处理器可提供高达1.60GHz的主频速度,并包含各种效能增强功能,如:最佳化电源的400MHz系统总线、微处理作业的融合(Micro-OpsFusion)和专门的堆栈管理器(Dedicated Stack Manager),这些工具可以快速执行指令集并节省电力。2005年Intel推出的双核心处理器有Pentium D和Pentium Extreme Edition,同时推出945\/955\/965\/...
硬科技:为何x86的虚拟化这么难搞(中)
这也是x86指令集到了80386支援分页式虚拟记忆体和虚拟86模式,才足以支撑高效能多工作业系统条件的理由。大多数人一谈到x86指令集的历代重大扩充,多半第一时间只会想到从MMX、SSE、SSE2、SSE3、SSE4到AVX这些让理论运算效能变得比较好看的SIMD指令,但满足「作业系统生存基本需要」才是真正的举足轻重,而...
win10*86是什么意思
win10x86是32位系统、x86简介:x86泛指一系列基于Intel 8086且向后兼容的中央处理器指令集架构。最早的8086处理器于1978年由Intel推出,为16位微处理器。Intel在早期以80x86这样的数字格式来命名处理器,包括Intel 8086、80186、80286、80386以及80486,由于以“86”作为结尾,因此其架构被称为“x86”。由...
硬件工程师培训教程(三)
指令内置:x 86 指令集、x 86 译码器、80 位浮点单元 接口类型:Socket 7 早期的Pentium 处理器(主要是Pentium 60 和Pentium 66)存在浮点运算错误的问题,Intel 为此 花4 亿美元回收了大批有问题的CPU,这在当时是十分冒险的行为,但Intel 的这一做法最终赢得了用 户的信任,P e n t i um 再度...
CPU的基础知识
3、每个CPU都有一套自己可以执行的专门的指令集(注意,这部分指令是CPU提供的,CPU-Z软件可查看)。 正是因为不同CPU架构的指令集不同,使得__86处理器不能执行ARM程序,ARM程序也不能执行__86程序。(Intel和AMD都使用__86指令集,手机绝大多数使用ARM指令集)。 注:指令集的软硬件层次之分:硬件指令集是硬件层次...
64位电脑和86位的有什么区别?
第三,运算速度不同。64位CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集可以运行64位数据指令,也就是说处理器一次可提取64位数据(只要两个指令,一次提取8个字节的数据),比32位(需要四个指令,一次提取4个字节的数据)提高了一倍,理论上性能会相应提升1倍。第四,...
win764和86有什么区别?
64位CPU GPRs的数据宽度为64位,64位指令集可以运行64位数据指令,也就是说处理器一次可提取64位数据(只要两个指令,一次提取8个字节的数据),比32位(需要四个指令,一次提取4个字节的数据)提高了一倍,理论上性能会相应提升1倍。第四,寻址能力不同。64位处理器的优势还体现在系统对内存的控制上。
贲茂思泰: 你说的应该是机器指令. CPU扩展指令集CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统.指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一.从现阶段的主流...
李沧区17188352930: CPU指令集intel AMD - ?
贲茂思泰: 1、Intel主要有x86,EM64T,MMX,SSE,SSE2,SSE3,SSSE3 (Super SSE3),SSE4A,SSE4.1,SSE4.2,AVX,AVX2,AVX-512,VMX,AVX 2.0等指令集. 2、AMD主要是x86,x86-64,3D-Now!,MMX(+),3DNOW!(+),SSE,SSE2,SSE3,SSE4A指令集.
李沧区17188352930: X86指令集是什么? - ?
贲茂思泰: X86指令集是Inter为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加了X87芯片,以后就将X86指令集统称为X86指令集.
李沧区17188352930: CPU的主要技术参数是多少? - ?
贲茂思泰: 二级缓存运行速度与主频相同,而外部的二级缓存则只有主频的一半.L2高速缓存容量也会影响CPU的性能,原则是越大越好,现在家庭用CPU容量最大的是512KB,而服务器和工作站上用CPU的L2高速缓存更高达1MB-3MB.(6)CPU扩展指...
李沧区17188352930: CPU的指令集有哪些? - ?
贲茂思泰: (1)CISC指令集 CISC指令集,也称为复杂指令集,英文名是CISC,(Complex Instruction Set Computer的缩写).在CISC微处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的.顺序执行的优点是控制简...
李沧区17188352930: x86和x64平台是什么意思?有什么区别? - ?
贲茂思泰: x86是指令集: X86指令集要知道什么是指令集还要从当今的X86架构的CPU说起.X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,IBM1981年推出的世界第一台PC机中的CPU—i808...
李沧区17188352930: 指令集是什么??? - ?
贲茂思泰: 每一种处理器都有自己可以识别的一整套指令,称为指令集.一个 JVM 指令由两部分组成,第一部分是一个字节(one-byte)的操作码,第二部分是 0 个或多个提供参数或数据的操作数,许多指令都只有第一部分. JVM 指令集中的大部分指...
李沧区17188352930: 什么是X86技术??
贲茂思泰: X86指令集是美国Intel公司为其第一块16位CPU(i8086)专门开发的,美国IBM公司1981年推出的世界第一台PC机中的CPU— i8088(i8086简化版)使用的也是X86指令,同时电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器则另...
李沧区17188352930: 电脑是如何利用CPU处理文件的. - ?
贲茂思泰: CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统.指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一.从现阶段的主流体系结构讲,指令集可分为复杂指令集和...
李沧区17188352930: 谁知道什么是x86 - 64指令集 - ?
贲茂思泰: 64位的x86系列CPU指令代码.x86系列的CPU就是我们常用的CPU,包括早期的Intel的8086、80286、80386、80486、80586(奔腾)、奔腾II、奔腾III、奔腾IV、AMD的同类系列等.因为最早的是8086(第一款16位的CPU),以后的CPU都和它兼容,所以把这类CPU称为x86系列,而x86系列又分为16位、32位和64位的,和8086同时代的8088则是8位的CPU.