一、32位通用寄存器(EAX,ECX,EDX,EBP,ESP,EBP,ESI,EDI)
二、十六位通用寄存器(AX,CX,DX,BX,SP,BP,SI,DI)
三、八位通用寄存器(AH,AL,CH,CL,DH,DL,BH,BL)
四、32位,16位,8位寄存器之间的关系
1.寄存器都是高位在前,低位在后。
2.都是包含关系,32位寄存器之中包含了16位寄存器,16位寄存器之中包含了8位寄存器。
关系如下:
五、32位的含义
一位只能放0或1,32位就意味着能放32个0或1。
所以32位最小取值为00000000000000000000000000000000=0x00000000
最大取值为11111111111111111111111111111111=0xFFFFFFFF
0x00000000到0xFFFFFFFF,寻址范围是0xFFFFFFFF+1=0x10000000(这里为什么要+1? 因为从0x00000000--0xFFFFFFFF,就好比0-9一共有多少位数,9-0=9再加上0本身占了一位,所以要加1)。
0x10000000换算为10进制=4294967296(Byte) 4294967296/1024=4194304(KB) 4194304/1024 =4096(MB) 4096/1024=4(GB)
由此可知,32位计算机最大寻址空间为4GB,也就是32位计算机最大能识别内存大小为4GB(注:这里只是针对正常计算机而已,其实也能通过补丁的方式强行修改计算机寻址范围)。
六、OD中EIP的含义:EIP指向了当前CPU运行到的指令地址。双击EIP的值,可以在CPU窗口中回到EIP指向的地址。
七、汇编常见指令及其用法
A、Mov指令
定义:拷贝源操作数到目标操作数
语法定义:Mov 目标操作数,源操作数
语法规定:
a、源操作数可以使立即数,通用寄存器,段寄存器,或者内存单元
b、目标操作数可以是通用寄存器,段寄存器,或者内存单元
c、操作数的宽度必须一样
d、源操作数和目标操作数不能同时为内存单元
B、ADD指令
定义:加法指令,两数相加
C、SUB指令
定义:减法指令,两数相减
D、AND指令
定义:与指令,两个数都是1,结果才是1
E、OR指令
定义:或指令,两个数只要有一个为1,结果就是1.
F、XOR指令
定义:异或指令,两个数不相同,结果才是1
G、NOT指令
定义:非指令,当被此运算符修饰时,每位取反
H、LEA指令
定义:取内存地址指令
例:LEA EAX,DWORD PTR DS:[0xFFFFFFFF],最后EAX的结果是0xFFFFFFFF
八、汇编中内存地址的表示方法
当一个立即数被[]包围,其表示内存地址
例1:[0xFFFFFFFF],表示内存地址是0xFFFFFFFF
例2:Mov dword ptr ds:[0x00401000],123456789
上面语句表示,将123456789这个立即数赋值给0x00401000这个内存地址所指向的值,具体赋值宽度由前面的dword修饰,也就是4字节。在没有寄存器名存在的情况下,用操作符 X ptr 指明内存单元的长度。
0x00401000:一个内存编号,也就是内存地址
ptr:Pointer,表示后面是一个指针,也就是一个地址,本例中的地址是0x00401000。
ds:数据段寄存器
例3:Mov eax,dword ptr ds:[0x00401000]
将内存地址0x00401000所指向的值,取dword长度赋值给eax。
九、数据在内存中的存放方式
数据在内存中存放形式都是地位在前高位在后。
例子:mov dword ptr ds:[0x593000],12345678
正常情况下:12345678 是从高到低排序,那么内存中就应该是78563412
如图:可以看到实际存放的是78 56 34 12。为什么不是87 65 43 21呢?因为在内存中最小单位是字节。
一个十六进制数(0x0--0xF)=能表示4位二进制的数(0000-1111),又因为1个字节=8位,所以一个字节可以存放2个4位的数,也就是,字节的取值范围是(0x00--0xFF)。
上面说到,内存中最小单位是字节,所以内存中的数据都是两两存放,也就是78 56 34 12