在计算机系统中,通常CPU执行两种不同性质的程序:一种是操作系统内核程序;另一种是用户自编程序(系统外层的应用程序,简称应用程序)。对操作系统而言,这两种程序的作用不同,前者是后者的管理者,因此“管理程序”要执行一些特权指令,而“被管理程序”(用户自编程序)出于安全考虑不能执行这些特权指令。
一、特权指令:是指不允许用户直接使用的指令。(只能在CPU处于内核态时执行)执行的操作通常会影响整个系统的硬件资源、全局状态或其他进程的运行环境。
1、I/O 指令
2、内存管理指令
3、中断和异常处理指令:CLI(清除中断标志-关中断)和STI(设置中断标志-开中断)
4、系统控制指令:HLT
(停机指令 - 停止CPU执行)
5、模式切换指令 (通常由特殊机制触发,但本身是特权操作):SYSCALL
/ SYSENTER
(从用户态快速进入内核态的系统调用指令-执行它们本身需要用户态权限,但实际切换操作在硬件层面是特权的)
IRET
/ SYSRET
/ SYSEXIT
(从中断/异常/系统调用返回到用户态 - 只能在特权态执行)
6、特定平台管理指令:如电源管理指令 (HLT
也可算作此类)、性能监控计数器访问指令等
二、 非特权指令:是只允许用户直接使用的指令(可以在CPU处于用户态和内核态时执行)它不能直接访问系统中的软硬件资源,仅限于访问用户的地址空间,这也是为了防止用户程序对系统造成破坏。
-
数据传送指令:
MOV
,PUSH
,POP
,LEA
,XCHG
(操作通用寄存器和用户态可访问内存)。 -
算术运算指令:
ADD
,SUB
,MUL
,DIV
,INC
,DEC
,CMP
。 -
逻辑运算指令:
AND
,OR
,XOR
,NOT
,TEST
,SHL
/SAL
,SHR
,SAR
,ROL
,ROR
。 -
控制转移指令 (在用户代码段内):
JMP
,Jcc
(条件跳转),CALL
,RET
,LOOP
。 -
字符串操作指令:
MOVS
,CMPS
,SCAS
,LODS
,STOS
(操作用户态可访问内存)。 -
标志操作指令:
CLC
,STC
,CMC
(操作进位标志等,不影响中断标志 IF)。 -
空操作指令:
NOP
。 -
浮点运算指令:
FADD
,FSUB
,FMUL
,FDIV
,FLD
,FST
等 (操作 FPU/SSE/AVX 寄存器)。 -
SIMD 指令:
PADDB
,PMULLW
,ADDPS
,MULPD
等 (操作 XMM/YMM/ZMM 寄存器)。