在CPU中,一个二进制位被作为一位,八位就是一个字节,在内存中,就是以字节为单位来存储信息的,每一个字节单元给以一个唯一的存储器地址,称为物地址。ASCII码用一个字节表达,就是说一个内存单元可以存储一个英文字符或数字等,而中文要用Unicode码来表示,也就是说两个内存单元(16位),才能存一个汉字。
32位的CPU就是说一个寄存器可以存下32个0或(不包括段寄存器)
寄存器有十六个
通用寄存器:EAX,EBX,ECX,EDX,ESP,EBP,EDI,ESI.
EAX-EDX又称为数据寄存器,可以分别对其高十六位和低十六位访问
低十六位:AX,BX,CX,DX 低十六位又可以分别进行八位访问
AX可分为AH(高八位),AL(低八位)。其它BH,BL.CH,CL.DH,DL
EAX,EBX,ECX,EDX用来暂时存放计算过程中所用的操作数,结果等
ESP,EBP,EDI,ESI这四个只能用字来访问,它们的主要用途就是在存储器寻址时,提供偏移地址。称为指针或变址寄存器。
从386以后,所有的寄存器都可以用来存储内存地址。
[EBX] 表示EBX中装的是一个内存地址,真正要访问的,就是EBX中存储的内存单元所存储的值。
ESP 堆栈指针寄存器。任何时候都指向堆栈栈顶。
堆栈 基址开始于一个高地址,每当有数据入栈,它就向低地址的方向存储,入栈指令是PUSH。 每当有数据入栈,ESP就跟着改变,总之,它永远指向最后一个压入栈的数据。
Win32下,API所用的数据,均是靠堆栈来传送的,即先将要传送的数据压入堆栈,然后CALL至API函数,API函数会在函数体内用出栈指令将相应的数据出栈。
EBP 基址指针寄存器 可以与堆栈寄存器SS联用来确定堆栈中的某一个存储单元的地址.
ESI(源变址寄存器)和EDI(目的变址寄存器)一般与数据段寄存器DS联用,用来确定数据段中某一存储单元的地址。
CS 代码段寄存器
DS 数据段寄存器
SS 堆栈段寄存器
ES,FS,GS 附加段寄存器
专用寄存器
EIP 指令指针寄存器 存放代码段中的偏移地址,始终指向下一条指令的首地址。它与CS代码段寄存器配合确定下一条指令的物理地址
当这一地址送到存储器后,控制器可以取得下一条要执行的指令,而控制器一旦取得这条指令就马上修改EIP的内容,使它始终指向下一条指令的首地址。
FLAGS 标志寄存器 / PSW(program status word)程序状态寄存器
常用的指令
CMP AX BX AX寄存器减去BX寄存器的内容,不返回结果。
MOV AX BX 将BX中的值移送至AX
XOR AX AX 每个寄存器与自己作异或运算等于清零动作
异或解释:如果相同则为0,不相同则为1
JZ=74;JNZ=75;JMP=EB;Nop=90
NOP
JE/JZ 相等则跳
JNE/JNZ 不相等则跳
JMP 无条件跳
JB 小于则跳
JA 大于则跳
JG 大于则跳
JGE 大于或等于则跳
JL 小于则跳
JLE 大于或等于则跳