寄存器:
一般我们分析的程序大多数都是32位的,所以这里就先介绍x86汇编,也就是32位下的汇编,64位下的汇编后续会介绍。
x86汇编一共共有8个32位通用寄存器,名称分别位:eax、ebx、ecx、edx、esp、ebp、esi、edi
这些寄存器用来在程序运行中的算数运算和数据传输。其中eax、ebx、ecx、edx这四个寄存器又可以分为低16位,高8位和低8位,这样分的目的是为了传输不同字节大小的数据。
比如说一个字节的数据,也就是8位,那么就可以放到寄存器的低8位中;一个四字节32位的数据,刚好就可以放到一个寄存器中。
下面是EAX\EBX\ECX\EDX这四个寄存器的低16位,高8位,低8位的表示方法
32位 16位 高8位 低8位
EAX AX AH AL
EBX BX BH BL
ECX CX CH CL
EDX DX DH DL
剩下的4个通用寄存器只能用32位和16位名称来访问
32位 16位
ESI SI
EDI DI
EBP BP
ESP SP
EAX:乘除指令默认使用EAX寄存器保存结果数据;计算加法的时候结果也是保存在eax中,函数调用完成后返回值也是默认保存在eax中
ECX:默认作为循环计数器,用来记录循环次数
EBP/ESP:这两个寄存器一般是用来记录栈顶和栈底,EBP的值是指向栈底的指针,esp的值是指向栈顶的指针
ESI/EDI:这两个寄存器大多是用在串操作指令中,比如字符串拷贝等操作
ESI就是扩展源变址寄存器(extended source index),EDI是扩展目的寄存器(extended destination index)
除了这8个通用寄存器外,还有一个寄存器使用的很多,这就是EIP(指令指针寄存器),这个寄存器的作用就是保存了下一条将要执行的地址,更改EIP的值可以改变程序的执行流程。