汇编语言
$0(0000)、$1(0001)、$2(0010)、$3(0011)、$4(0100)、$5(0101)、$6(0110)、$7(0111 )
$8(1000)、$9(1001)、$A(1010)、$B(1011)、$C(1100)、$D(1101)、$E(1110)、$F(1111)
esp定律指的也是堆栈平衡原理,esp是x86用于保存栈顶指针的寄存器
```
```
通用寄存器 |16位 |32位 |64位
---------------------------
累加寄存器 |AX |EAX |RAX
基址寄存器 |BX |EBX |RBX
计数寄存器 |CX |ECX |RCX
数据寄存器 |DX |EDX |RDX
堆栈基指针 |BP |EBP |RBP
变址寄存器 |SI |ESI |RSI
堆栈顶指针 |SP |ESP |RSP
指令寄存器 |IP |EIP |RIP
```
```
8位的半寄存器(通用寄存器)AH、AL、BH、BL、CH、CL、DH、DL
16位指针寄存器:IP
32位指针寄存器:EIP
16位段寄存器:CS、DS、SS、ES(FS、GS)
标识寄存器:flags/eflags
16位段寄存器,主要功能是将其用于存储段地址 eax,ebx,ecx,edx;ax,bx,cx,dx;ah,al,bh,bl,ch,cl,dh,dl
```
```
IP和EIP专用指针寄存器,存储当前代码段中下一条即将执行的机器指令的偏移地址
```
```
一般寄存器:AX、BX、CX、DX
AX:累积暂存器,BX:基底暂存器,CX:计数暂存器,DX:资料暂存器
索引暂存器:SI、DI
SI:源索引暂存器,DI:目的索引暂存器
```
```
指针寄存器: 堆栈指针寄存器SP、stack pointer; 基数指针寄存器BP、base pointer
值寄存器包括: 源变址寄存器SI、source index; 目的变址寄存器DI、destination index
4个寄存器都是16位寄存器,这些寄存器在运算过程中也可以用来存放操作数(只能以字为单位),但经常的用途是在段内寻址时提供[偏移地址]
SP,BP一般与段寄存器SS联用,以确定堆栈寄存器中某一单元的地址,SP用以指示栈顶的[偏移地址],而BP可作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。
SI,DI一般与段寄存器DS联用,以确定数据段中某一存储单元的地址,SI,DI具有自动增量和自动减量的功能,这一点使在串操作指令中用做变址非常方便,SI作为隐含的源变址DS联用,DI作为隐含的目的变址和ES连用,从而达到在数据段和附加段中寻址的目的
```
```
ESP 专门用作堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。
EBP 是"基址指针"(BASE POINTER), 它最经常被用作高级语言函数调用的"框架指针"(frame pointer). 在破解的时候,经常可以看见一个标准的函数起始代码:
ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
EBP:基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
esp:寄存器存放当前线程的栈顶指针
ebp:寄存器存放当前线程的栈底指针
eip:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。
```
```
4个数据寄存器(EAX、EBX、ECX和EDX)
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
```
```
eax是32位寄存器,ax是16位寄存器,al(ah)是八位寄存器。那么eax存储的数据就是ax的两倍,ax是al(ah)的两倍。
eax可以存储的是DWORD(双字)ax存储的是WORD(字)AL(AH)存储的是BYTE(字节),那么为什么又有AH和AL呢,我们可以这样理解,AX=AH+AL,AH存储的是AX的高8位数据,AL存储的是AX的低八位数据。H这里就是HIGH,L就是LOW.
```
```
位:数据的最小单元是一位、一位只能表示两个不同的数值(0或1),
半字节:是4位一组的数据类型、
字节(byte):一个字节由8位组成、是最小可编址数据单元、8086的主存和I/O地址都是字节地址、
字(word):是一个16位的组、2个字节
双字(dword):是一个32位的组、由两个字组成、
四字(qword):是一个64位的组、由四个字组成、
长字(lword):是一个128位的组、由八个字组成、
```
```
与运算、或运算、异或运算、非运算
计算机只会一种运算、那就是位运算
```
```
movb(8位)、movw(16位)、movl(32位)、movq(64位)
寄存器寻址: movl %eax, %edx
```
```
mov指令种类:1.普通的mov指令 2.做符号扩展的movs 3.做零扩展的movz
```