汇编-32位寄存器的功能及其使用之整理篇
来源:互联网 发布:天津软件学院一卡通 编辑:程序博客网 时间:2024/05/21 07:06
汇编-32位寄存器的功能及其使用
总体上来讲32位寄存器可以分为一下几种:
4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)
首先介绍一下易失性
一些寄存器在函数中常常是变化的,而另外一些却是不变的。这是编译器所决定的。因为寄存器是不会自动保存的(虽然有些汇编语言会自动保存,但是x86是不会的),所以编码时要自己保存。这句话的意思是:当一个函数被调用,是不保证在函数返回时,易失寄存器上的值不变的;但是函数必须负责保存非易失寄存器中的值。
微软编译器的寄存器使用习惯如下:
1)易失寄存器:ecx, edx
2)非易失寄存器: ebx, esi, edi, ebp
3)其他特殊寄存器: eax, esp (discussed later)
eax
Eax是一个32为通用寄存器,一般的用途有两个:保存函数的返回值或者作为计算用的专用寄存器。在技术上来说,eax是一个易失寄存器,因为他的值是不能保存的,eax的值会在函数返回前设置为函数的返回值。除了ESP寄存器,EAX的这个功能(即保存返回值)可能是最重要的值得被记住的。eax还会在数据计算时要用,比如乘法和除法。这种用法我们会在指令使用一文讲解。
下面是C语言中函数返回的例子:
return 3; // 返回3
对应的汇编语言:
mov eax, 3 ; 置EAX=3
ret ; 返回
ebx
Ebx是一个非易失通用寄存器。它没有特定的用途,但是常被置为一个函数中常用的值(如0),以此来加快计算速度。
ecx
Ecx是一个易失通用寄存器。常被用作函数的参数或者是循环的计数器。
__fastcall的函数会将第一和第二个参数放置在ecx和edx寄存器中。另外,当调用一个类中的成员函数时,不管调用习惯是什么,指向类的指针常常是放在ecx中。
另外,ecx常被用作循环计算器。For循环一般(尽管不是总是)会将循环计数放在ecx中。Rep指令也会将ecx作为计数器,自动减少直到为0.这类功能将在后面讨论。
edx
Edx是一个易失通用寄存器,偶尔会被用作函数的参数。就像ecx,edx常用在__fastcall调用的函数中。
除了fastcall调用中存放参数,编译器通常会将局部(短期)变量储存在edx中。
esi
Esi是一个非易失通用寄存器,常被用作指针。特别的,在rep一类的指令中,esi通常指向“源”。因为esi中数据是不会改变的,所以esi通常会存储不会变的数据。
edi
Esi是一个非易失通用寄存器,常被用作指针。它和esi差不多,只不过一般是作为“目标”指针。
ebp
Ebp是一个非易失通用寄存器,根据编译器的设置,它有两个截然不同的用途:要么作为框架指针,要么作为一般寄存器。
若没有优化编译或者代码是手工写的,ebp会在函数开头就保存着堆栈的位置(关于堆栈下文会详细讨论)。因为堆栈在整个函数过程中是不停变换的,将ebp指向堆栈的原始位置可以使得方便使用存储在堆栈中的变量。这会在讨论堆栈是详谈。
如果编译被优化,当堆栈指针的计算通过指针的移动值计算时(这可能有点乱——IDA就是自动侦测并校准一个移动的堆栈指针),ebp就会作为一个保存任何数据的通用寄存器了。。
esp
最后说说esp,esp是一个保存着堆栈底端指针的特殊寄存器(堆栈是向低地址生长)。很少直接对ESP进行数学计算(加减),而且函数的开始和结束时的ESP值必须一致。Esp下文介绍。
- 汇编-32位寄存器的功能及其使用之整理篇
- 32位汇编寄存器
- 32位汇编寄存器
- 8086汇编学习之标志位寄存器的应用
- 汇编之---寄存器篇
- 汇编-32位CPU所含有的寄存器【备查】
- 16位汇编 寄存器的操作
- 32位CPU中所包含的寄存器及其指令
- 32位CPU寄存器和汇编指令
- 32位CPU寄存器和汇编指令
- 32位CPU寄存器和汇编指令
- 32位CPU寄存器和汇编指令
- 32位CPU寄存器和汇编指令
- 32位CPU寄存器和汇编指令
- 32位CPU寄存器和汇编指令
- (32位汇编 八)标志寄存器
- 寄存器讲解--汇编(32位处理器)
- Win32 汇编: 常用寄存器的常规功能
- java中System.currentTimeMillis与夏令时
- 身体是革命的本钱
- Teach Yourself Programming in Ten Years
- Thinking recursively
- CLISTCTRL SetItemState用法
- 汇编-32位寄存器的功能及其使用之整理篇
- the tips of Yum
- a shortcut for linux( from linux journal )
- 在线文档展示——M2M寻路算法论文
- 列车时刻表的数据存储策略
- 判断一个程序员是不是好的程序员
- Using std::basic_string the extensible way
- 项目管理之工作分解结构(WBS)
- 安装sql 2000提示挂起错误解决方法