有人可以简单地告诉我esp,ebp和esi寄存器之间的区别是什么?

| 我必须学习汇编语言,并且对不同的寄存器的作用/指向感到非常困惑。     
已邀请:
在某些体系结构(例如MIPS)上,所有寄存器的创建都是相同的,除了寄存器的名称(和软件约定)外,没有什么区别。在x86上,您几乎可以将任何寄存器用于通用计算,但是有些寄存器隐式绑定到指令集。 可以在此处找到许多有关寄存器特殊用途的信息。 例子:
eax
,累加器:许多算术指令对
eax
进行隐式运算。对于许多指令,还有特殊的短EAX专用编码:例如,“ 2”比“ 3”短1个字节。 (
add eax, imm32
vs.
add r/m32, imm32
ebx
,基数:隐式用法很少,但ѭ7but是与\“ Base \”命名相匹配的用法。仍然相关:
cmpxchg8b
。由于某些特定用途几乎不需要它,因此某些32位呼叫约定/ ABI将其用作指向位置独立代码(PIC)中“全局偏移表”的指针。
edx
,数据:某些算术运算隐含地对
edx
中的64位值进行操作:
eax
ecx
,用于移位计数的计数器,以及for13ѭ。同样,最过时的ѭ14指令隐式减少ѭ12 source16ѭ,源索引:某些字符串操作从ѭ16所指向的内存中读取一个字符串
edi
,目标索引:某些字符串操作将一个字符串写入
edi
指向的内存。例如
rep movsb
将ECX字节从
[esi]
复制到
[edi]
ebp
,基本指针:通常用于指向局部变量。
leave
隐式使用。
esp
,堆栈指针:指向堆栈的顶部,由
push
pop
call
ret
隐式使用 实际上,x86指令集是一个复杂的野兽。许多指令的格式较短,它们隐式使用一个或另一个寄存器。一些寄存器可用于执行某些寻址,而另一些则不能。 英特尔80386程序员参考手册是不可替代的资源,它基本上告诉您有关x86组装的所有知识,除了较新的扩展和现代硬件上的性能。 PC汇编(e)书是学习汇编的重要资源。     
sp
寄存器是堆栈指针,用于stack26ѭ和
pop
之类的堆栈操作。 堆栈被称为LIFO结构(后进先出),这意味着最后推动的是第一手弹出的东西。除其他外,它用于实现调用函数的功能。
bp
寄存器是基址指针,通常用于堆栈帧操作。 这意味着对于给定的级别,它是在堆栈上定位局部变量,传递的参数等的固定引用(而
sp
在函数执行期间可能会更改,
bp
通常不会更改)。 如果您正在使用如下汇编语言:
mov eax, [bp+8]
您正在看到代码访问特定于堆栈级别的变量。
si
寄存器是源索引,通常用于批量复制操作(
di
是其等效的目标索引)。英特尔拥有这些寄存器以及用于快速移动内存中字节的特定指令。
e-
变体只是这些(原始)16位寄存器的32位版本。而且,好像还不够,我们还有64位
r-
变体:-) 也许最简单的起点是在这里。它特定于8086,但概念并没有太大改变。与当前产品相比,8086的简单性将是您接受教育的良好起点。一旦掌握了基础知识,就可以轻松升级到x86系列的后续成员。 在此处转录并进行了大量编辑,以使答案独立。 通用寄存器 8086 CPU有8个通用寄存器,每个寄存器都有自己的名称:
AX
-累加器寄存器(分为
AH/AL
)。可能是最常用的通用用途寄存器。
BX
-基址寄存器(分为
BH/BL
)。
CX
-计数寄存器(分为
CH/CL
)。特殊用途说明,用于查找和移动。
DX
-数据寄存器(分为
DH/DL
)。与
AX
一起用于某些
MUL
DIV
操作,以及在某些
IN
OUT
操作中指定端口。
SI
-源索引寄存器。将其用作大容量存储器传输的专用指令(
DS:SI
)。
DI
-目的地索引寄存器。专用指令,将其用作大容量存储器传输的目的地(
ES:DI
)。
BP
-基本指针,主要用于访问堆栈上的参数和变量。
SP
-堆栈指针,用于基本堆栈操作。 分部寄存器
CS
-指向包含当前指令的段。
DS
-通常指向定义了变量的线段。
ES
-额外的段寄存器,由编码器决定其用法。
SS
-指向包含堆栈的线段。 尽管可以将任何数据存储在段寄存器中,但这绝不是一个好主意。段寄存器有一个非常特殊的用途-指向可访问的内存块。 段寄存器与通用寄存器一起使用以访问任何存储器值。例如,如果要访问物理地址“ 64”处的内存,则可以设置“ 65”和“ 66”。这样,我们可以访问的内存比单个寄存器(限制为16位值)要多得多。 CPU通过将段寄存器乘以67乘以通用寄存器68来计算物理地址:
1230
 0045
=====
12345
由2个寄存器组成的地址称为有效地址。 此用法仅用于实模式(这是8086唯一的模式)。后来的处理器将这些寄存器从段更改为选择器,它们用于查找表中的地址,而不是对其执行固定的计算。 默认情况下,
BX
SI
DI
寄存器与
DS
段寄存器一起工作;
BP
SP
SS
段寄存器一起工作。 特殊目的寄存器
IP
-指令指针: 始终指向要执行的下一条指令。 相对于ѭ60的偏移地址。
IP
寄存器始终与
CS
段寄存器一起使用,它指向当前正在执行的指令。 旗帜注册 确定处理器的当前状态。 CPU在进行数学运算后会自动修改这些标志,从而可以确定结果的类型,并确定将控制权转移到程序其他部分的条件。 通常,您不能直接访问这些寄存器。 进位标志
CF
-发生无符号溢出时,该标志设置为1。例如,当您添加字节255 + 1(结果不在0 ... 255范围内)时。没有溢出时,此标志设置为0。 奇偶校验标志
PF
-当结果为偶数个一位时,此标志设置为1;当结果为奇数个一位时,此标志设置为0。 辅助标志
AF
-当低位半字节(4位)发生无符号溢出时,设置为1。 零标记
ZF
-结果为零时设置为1。对于非零结果,此标志设置为0。 符号标志
SF
-结果为负时设置为1。当结果为正时,将其设置为0。(此标志采用最高有效位的值。) 陷阱标志
TF
-用于片上调试。 中断允许标志
IF
-当该标志设置为1时,CPU对来自外部设备的中断作出反应。 方向标志
DF
-某些指令使用此标志来处理数据链,当此标志设置为0-向前处理,当此标志设置为1时向后处理。 溢出标志
OF
-有符号溢出时设置为1。例如,当您添加100 + 50字节时(结果不在-128 ... 127范围内)。     
这是一个简化的摘要: ESP是当前的堆栈指针,因此通常只更新它即可操作堆栈,而EBP也可用于堆栈操作,例如在为局部变量分配堆栈空间之前保存ESP的值。但是您也可以将EBP用作通用寄存器。 ESI是扩展源索引寄存器,\“ string \”(与C字符串不同,我也不是说C字符串类型的女性也使用),例如MOVS指令使用ESI和EDI。 内存寻址: x86 CPU具有称为“段寄存器”的特殊寄存器,它们每个都可以指向不同的地址,例如DS(通常称为数据段)可能指向0x1000000,而SS(通常称为堆栈段)可能指向0x2000000。 当使用EBP和ESP时,默认的段寄存器是SS,对于ESI(和其他通用寄存器),它是DS。例如,假设DS = 0x1000000,SS = 0x2000000,EBP = 0x10,ESI = 0x10,那么:
  mov eax,[esp] //loading from address 0x2000000 + 0x10
  mov eax,[esi] //loading from address 0x1000000 + 0x10
您还可以指定要使用的段寄存器,以覆盖默认值:
  mov eax,ds:[ebp]
在加,减,逻辑运算等方面,它们之间没有真正的区别。     

要回复问题请先登录注册