要想真正的了解计算机,首先要了解的便是CPU,CPU是计算机的核心部件,因为计算机的所有指令都是由CPU处理的,而CPU的核心部件之一就是寄存器。所以了解寄存器和寄存器是如何工作的才能真正明白计算机的工作原理。
计算机中最经典的指令就是移动指令,如:mov ecx,eax。这条指令的意思就是将eax寄存器的值移动到ecx寄存器中。
在32位操作系统中包含如下8个通用寄存器:eax,ecx,edx,ebx,esp,ebp,esi,edi。
mov指令可以任意移动这8个寄存器,在mov ecx,eax中,后面的是源,后面的是目标,中间是逗号,不区分大小写。寄存器之间可以相互的移动。
如果计算机只有移动指令的话,那么什么事也干不了了。
mov是操作码,两个寄存器是操作数,操作码除了mov之外还有很多,你可以替换:加(ADD)、减(SUB)、与(AND)、或(OR)、异或(XOR)、非(NOT)。
比如: add eax,ecx
当然了,操作码不仅仅只有这几个,还有很多很多,只要搞清楚操作数是任意两个寄存器,当然可以是同一个寄存器。
比如:or esi,esi指令的意思是将esi “或” esi并将结果赋给esi。操作数除了寄存器之外,还可以是一个立即数(imm),只要保证32即可。
由于历史原因,早期的计算机科学家在设计时,最早是运行在8位的操作系统中,为了保证其兼容性,所以8个寄存器是分段设计的。
比如算盘,我们可以只用一半,或者四分之一。
eax可以分成4个部分:eax共0~31(32位),其中0~7位叫作AL,8~15位叫作AH。整个0~15位又称为AX。
AL:low表示低位,AH:high表示高位。ecx,edx,ebx寄存器也是一样的,如图2-1所示:
图2-1:EAX寄存器
以上的四个寄存都可以分成三段。
ESP,EBP,ESI,EDI,这四个寄存器只分成两段,比如:ESP整体0~31位称为ESP,0~15位称为SP。
通过以下,我们可以看出,32位的寄存器有8个,分别是:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI,每个寄存器都有一个编号,分别是:0号,1号,2号,3号......如表2-2所示:
寄存器 | 编号(二进制) | 编号(十进制) | ||
---|---|---|---|---|
32位 | 16位 | 8位 | ||
EAX | AX | AL | 0000 | 0 |
ECX | CX | CL | 0001 | 1 |
EDX | DX | DL | 0010 | 2 |
EBX | BX | BL | 0011 | 3 |
ESP | SP | AH | 0100 | 4 |
EBP | BP | CH | 0101 | 5 |
ESI | SI | DH | 0110 | 6 |
EDI | DI | BH | 0111 | 7 |
32 位寄存器有自己的编号,16 位寄存器也有属于自己的独立的编号。当然,他们是重叠的,当改变了 32 位的寄存器,相应的 16 位寄存器也会跟着改变。
同样,也有 8 位的寄存器,第 0 号 AL,第 1 号,CL,DL,BL,AH,CH,DH,BH。顺序不能乱。当然还有两个寄存器:EIP 和 EFLAGS(又称为 EFL),8 号和 9 号寄存器,EIP 有 16 位,叫做 IP。EFL 的 16 位称为 FL。这两个寄存器使用相对较少。
Q:在使用DTDebug进行调试时,发现EIP的值不断在发生变化,我们不但要有命令去操作这些寄存器,还需要区别当前用的是哪一条命令,下一次再调用哪一条命令?
A:CPU具有判断指令长度和预处理指令的功能,每一条指令都有字节长度,EIP的计算方法是:下一条指令=当前指令地址+当前指令字节长度。
Q:为什么通用寄存的指令顺序是EAX,ECX,EDX,EBX......而不是EAX,EBX,ECX,EDX... ...,按顺序不是更容易记住吗?
A:其实从记忆的角度来看,确实按字母的顺序更方便于我们记忆,但是Intel的技术员不这么认为,他们就是这么定义寄存器的的顺序的。了解寄存的顺序和编号,对汇编指令和硬编码尤为重要。
通用寄存器即CPU常用的寄存器。Intel手册给出了通用寄存器的功能:通用目的寄存器(General-Purpose Register)主要实现逻辑和算术运算、地址计算和内存指针。
通用寄存器结构图如下:
图212:通用寄存器结构
为什么上图看上去比较奇怪,有的寄存器被分成一块一块?其实都是历史遗留问题,在早期的技术还没有现在成熟时,8 个通用寄存器宽度是 8 位(这里指的是二进制的 8 位):AL,AH,CL,CH,DL,DH,BL,BH。后来 cpu 技术逐渐发展,由 8 位发展成 16 位,于
是寄存器由 8 位演变成 16 位:AX,CX,DX,BX,SP,BP,SI,DI。但是为了兼容前面的 8 位技术,将之前的 8 个 8 位寄存器封装到 AX,CX,DX,BX 寄存器中。技术发展的脚步是不会停歇的,之后将16位寄存都扩充了一倍,于是32位寄存器又相继出现了,当然这里只截止32位,64位和128位寄存器留给大家思考。
32位通用目的寄存器的指定用途如下:
以上只是让大家对寄存器的缩写的含义了解一下,毕竟使用一样的东西,不明白其中的道理,实在太不高明,而且这东西是老外发明的,按中式逻辑很难猜测出来。
汇编就是”寄存器与寄存器“或者”寄存器与内存“之间来回移动数据。