①操作模式
一.实模式(Real Mode)
实模式实现的是早期Intel处理器的编程环境,内存寻址方式和8086相同,由16位段寄存器的内容乘以16(10H)当做栈基地址,再加上16位偏移地址形成20位的物理地址,最大寻址空间1MB,最大分段64KB。实模式下可以使用32位指令,且所有的段都是可读、可写和可执行的。
当CPU复位或加点,即电脑重启或开机时,CPU以实模式启动、工作。然而只有在CPU刚刚启动时为实模式,等到操作系统运行后便运行在保护模式下。
二.保护模式(Protected Mode)
保护模式为处理器的原生状态,在该模式下所有的指令和特性都是可用的。并且程序会被分配一个独立内存区域,称之为段,而处理器会阻止程序使用自身范围之外的内存。在保护模式下,段值虽然与实模式下相同而然为16位,但其意义发生了改变,它变成了一个索引,指向一个数据结构的表项,根据这个数据结构,保护模式获得了实模式下没有的强大的寻址能力(留坑,以后补充)。借此,保护模式寻址采用了32位段和偏移量,最大寻址空间4GB(P6处理器开始,最大物理内存空间增加到64GB),最大分段4GB(Pentium Pre及以后为64GB)。
三.虚拟8086模式(Virtual-8086 Mode)
在保护模式下,CPU可以在一个安全环境中直接运行实模式软件,如MS-DOS程序。严格来说,虚拟8086模拟可以看作是保护模式下的一个属性。虚拟8086模式的内存寻址方式、最大寻址空间和最大分段都与实模式相同,其主要作用便是为了在保护模式下兼容以前的实模式应用。现代操作系统可以同时执行多个独立的虚拟8086会话。
四.系统管理模式(System Management Mode)
SMM是一个对所有Intel处理器都同意的标准体系结构特性,该模式向操作系统提供了实现诸如电源管理和系统安全等功能的机制。通俗等讲,Intel在它的CPU中专门留了个模式叫SSM,该模式拥有最高权限,当SMM中断时,操作系统无法获知,而在该模式下Intel便可以对CPU进行Debug,从而修复BUG。
②基本寄存器
一.数据寄存器
32位CPU下有4个数据寄存器,分别是EAX、EBX、ECX和EDX。其中E的意思为扩展(Extended),对应的为8086中的16位寄存器,如AX、BX等。
EAX(Accumulator Register):常称为累加器,加法、乘除指令默认使用EAX,常用于存放各种计算结果,使用的频率非常高。
EBX(Base Register):称为基地址寄存器,用于内存寻址时存放基地址,也可用于存储器指针。
ECX(Count Register):CPU默认使用ECX为循环计数器,用于控制循环(Loop)次数。
EDX(Date Register):在进行乘除运算时,它可以作为默认的操作数参与运算,同时被用于保存乘法形成的部分结果或除法之前部分被除数。整数除法的余数也总是存放在EDX中。
二.变址寄存器
32位CPU下有两个变址寄存器,分别是ESI和EDI,对应16位中的SI和DI,但对低16位数据的存取等操作并不会影响高16位的数据内容。
ESI(Source Index):称为源变址寄存器,通常用于存放要处理的数据的内存地址。同时当进行例如循环一个数组求和时,ESI会充当指针用于遍历数组。
EDI(Destination Index):称为目的变址寄存器,通常用于存放处理后的数据的内存地址。
以下为实例代码:
.386 .model flat, stdcall .stack ExitProcess PROTO, dwExitCode:DWORD .data arrayD DWORD 10000h, 20000h, 30000h ;定义一个双字数组 .code main PROC mov eax, 0 ;将eax置零 mov esi, OFFSET arrayD ;获取arrayD的地址,并赋值给esi add eax, [esi] add esi, TYPE arrayD ;使esi指向下一个arrayD的元素 add eax, [esi] add esi, TYPE arrayD add eax, [esi] ;此时eax = 6000h,为arrayD数组中的和 INVOKE ExitProcess, 0 main ENDP END main
三.指针寄存器
32位CPU有两个指针寄存器,分别是EBP和ESP,对应16位中的SBP和SP。指针寄存器不同于AH,AL,不可被分割为8位寄存器。
EBP(Base Pointer && Frame Pointer):EBP用于引用堆栈中的函数参数和局部变量,指向当前活动记录的底部,通过EBP使得访问函数的参数变得很容易。任何函数调用后都需要保护调用者的帧指针,以便调用完成后可以恢复调用者的帧指针。
ESP(Stack Pointer):ESP用于堆栈指针,它指向当前堆栈的栈顶位置。
push ebp ;访问函数 mov esp ebp ... ;函数执行过程 mov ebp, esp pop ebp ;返回函数
四.段寄存器
32位CPU下有六个段寄存器,它们分别有不同的功能。
CS——代码段寄存器(Code Segment Register),其值为代码段的段值。
DS——数据段寄存器(Data Segment Register),其值为数据段的段值。
ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值。
FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
实地址模式下,16位段寄存器表示的是预先分配的内存区域的基址,要访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量,内存单元的逻辑地址为 “段值:偏移量”的形式。
保护模式下,段寄存器中保存的是段描述表指针。而一些段中存放着程序指令(.code段),一些段中存放着变量(.data段),还有一个堆栈段存放的是局部函数变量和函数参数。
五.指令寄存器
32位CPU下将指令寄存器扩展到了16位,对应16位中的IP,32位下的指令寄存器为EIP(Instruction Pointer)。EIP中包含下一条将要执行指令的地址,某些机器指令(如jmp)能够控制EIP,使得程序分支转到一个新位置。
六.标志寄存器
1.进位标志位(Carry Flag && CF):当无符号数的计算结果超出其范围时,CF被置为1, 否则CF被置为0。
2.溢出标志位(Overflow Flag && OV):当有符号数的计算结果超出其范围时,OV被置为1,否则OV被置为0。
3.符号标志位(Sign Flag && SF):算术或逻辑操作产生负结果时,SF被置为1,否则SF被置为0。
4.零标志位(Zero Flag && ZF):算数或逻辑结果产生的结果为零时,ZF被置为1,否则ZF被置为0。
5.辅助进位标志位(Auxiliary Carry Flag && AC):运算时若最低的四位产生了进位,那么AC被置为1,否则AC被置为0。
6.奇偶校验标志位(Parity Flag):目标操作数最低有效字节中的1的个数为偶数时,PF被置为1,否则PF被置为0。
七.EFLAGS(另外开坑)。