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