pointers - 有人可以向我解释(用非常简单的术语)esp、ebp 和 esi 寄存器之间的区别是什么?

标签 pointers assembly x86 cpu-registers

我必须学习汇编,我对不同的寄存器做什么/指向什么感到很困惑。

最佳答案

在某些架构上,例如 MIPS,所有寄存器都是平等的,除了寄存器的名称(和软件约定)之外,实际上没有任何区别。在 x86 上,您通常可以将任何寄存器用于通用计算,但有些寄存器隐式绑定(bind)到指令集。

可以在 here 中找到有关寄存器特殊用途的大量信息。

例子:

  • eax ,累加器:许多算术指令隐式操作 eax 。许多指令也有特殊的较短的 EAX 特定编码:例如,add eax, 123456add ecx, 123456 短 1 个字节。 ( add eax, imm32 vs. add r/m32, imm32 )
  • ebx , base:很少隐式使用,但 xlat 是与“Base”命名相匹配的。仍然相关: cmpxchg8b 。因为位置无关代码 (PIC) 中的某些 32 位调用约定/ABI use it as a pointer to the "global offset table" 很少需要它。
  • edx ,数据:一些算术运算隐式地对 edx 中的 64 位值进行操作:eax
  • ecx ,用于移位计数和 rep movs 的计数器。此外,mostly-obsolete loop instruction 隐式递减 ecx
  • esi ,源索引:一些字符串操作从esi指向的内存中读取一个字符串
  • edi ,目标索引:一些字符串操作将字符串写入 edi 指向的内存。例如 rep movsb 将 ECX 字节从 [esi] 复制到 [edi]
  • ebp ,基指针:通常用于指向局部变量。 leave 隐式使用。
  • esp ,堆栈指针:指向堆栈的顶部,由 pushpopcallret 隐式使用

  • x86 指令集是一个复杂的野兽,真的。许多指令具有较短的形式,隐含地使用一个或另一个寄存器。一些寄存器可用于进行某些寻址,而另一些则不能。

    Intel 80386 Programmer's Reference Manual 是一个不可替代的资源,它基本上告诉您有关 x86 程序集的所有信息,除了现代硬件上的更新扩展和性能。

    PC Assembly (e)book 是学习汇编的绝佳资源。

    关于pointers - 有人可以向我解释(用非常简单的术语)esp、ebp 和 esi 寄存器之间的区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738595/

    相关文章:

    c++ - 将 QImage 传递给方法 - 指针混淆

    c++ - 为什么悬挂指针引用会使程序崩溃

    c - 高效内存

    assembly - 在 x86 汇编语言中返回一个值

    linux - 条件 eax != 0 和 edx == 0?

    string - 不使用预定义函数在程序集中打印字符串

    c - header 中的 typedef 结构和取消引用指向不完整类型的指针

    c++ - 从指针中提取 2 个字节 (u_short)

    windows - 使用 NASM 编译 Windows 可执行文件

    assembly - 保护模式下无法设置 GS 寄存器