Ale*_*amo 10

在某些体系结构(如MIPS)上,所有寄存器都是相同的,除寄存器名称(和软件约定)之外没有任何区别.在x86上,您通常可以将任何寄存器用于通用计算,但某些寄存器隐式绑定到指令集.

有关寄存器特殊用途的大量信息可以在这里找到.

例子:

  • eax,accumulator:隐含操作的许多算术指令eax.对于许多指令,还有特殊的更短EAX特定编码:add eax, 123456比例add ecx, 123456如短1个字节.(add eax, imm32add r/m32, imm32)
  • ebx,base:很少隐式用法,但是xlat匹配"Base"命名.仍然相关:cmpxchg8b.因为它几乎不需要任何特定的东西,一些32位调用约定/ ABI 将它用作位置独立代码(PIC)中"全局偏移表"的指针.
  • edx,data:一些算术运算隐含地对64位值进行操作edx:eax
  • ecx,计数器用于班次计数,和rep movs.此外,大多数过时的loop指令隐式递减ecx
  • esi,source index:一些字符串操作从指向的内存中读取一个字符串 esi
  • edi,destination index:一些字符串操作将字符串写入指向的内存edi.例如,rep movsb拷贝ECX从字节[esi][edi].
  • ebp,base pointer:通常用于指向局部变量.隐式使用leave.
  • esp,堆栈指针:指向堆栈的顶部,通过隐式地使用push,pop,callret

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

英特尔公司的80386程序员参考手册是一个不可替代的资源,它主要是告诉你一切有了解x86汇编,除了较新的扩展和现代化的硬件性能.

PC大会(五)本书是学习汇编很好的资源.

  • 现在ecx不再用作循环计数器了.没有编译器实际发出循环指令,因为与算术/分支指令对相比,它已知非常慢.它具有另一个特殊含义,即用于移位指令或位集/测试/等的位索引寄存器. (2认同)

pax*_*blo 7

sp寄存器是堆栈指针,用于类似的堆栈操作pushpop.

堆栈被称为LIFO结构(后进先出),这意味着最后推出的东西是弹出的第一件事.除其他外,它用于实现调用函数的能力.

bp寄存器是基指针,并且通常用于堆栈帧的操作.

这意味着它是一个固定的引用,用于在给定级别上定位局部变量,在栈上传递参数等等(虽然sp在执行函数期间可能会发生变化,但bp通常不会).

如果您正在查看汇编语言,例如:

mov eax, [bp+8]
Run Code Online (Sandbox Code Playgroud)

您看到代码访问特定于堆栈级别的变量.

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某些MULDIV操作,以及在某些INOUT操作中指定端口.
  • SI - 源索引寄存器.使用它作为大容量存储器传输源的特殊用途指令(DS:SI).
  • DI - 目的地索引寄存器.使用它作为大容量存储器传输目的地的特殊用途指令(ES:DI).
  • BP - 基指针,主要用于访问堆栈上的参数和变量.
  • SP - 堆栈指针,用于基本堆栈操作.

分段寄存器

  • CS - 指向包含当前指令的段.
  • DS - 通常指向定义变量的段.
  • ES - 额外的段寄存器,由编码器来定义其用法.
  • SS - 指向包含堆栈的段.

虽然可以在段寄存器中存储任何数据,但这绝不是一个好主意.段寄存器有一个非常特殊的用途 - 指向可访问的内存块.

段寄存器与通用寄存器一起工作以访问任何存储器值.例如,如果我们想要访问物理地址的内存12345h,我们可以设置DS = 1230hSI = 0045h.这样我们可以访问比单个寄存器更多的内存,单个寄存器限制为16位值.

CPU通过将段寄存器乘以并将10h通用寄存器添加到它来计算物理地址(1230h * 10h + 45h = 12345h):

1230
 0045
=====
12345
Run Code Online (Sandbox Code Playgroud)

由2个寄存器组成的地址称为有效地址.

此用法仅适用于实模式(这是8086唯一的模式).后来的处理器将这些寄存器从段更改为选择器,它们用于查找表中的地址,而不是对它们执行固定计算.

默认情况下BX,SIDI寄存器一起工作DS段寄存器; 并BPSP一起工作SS段寄存器.

特殊用途寄存器

IP - 指令指针:

  • 始终指向要执行的下一条指令.
  • 偏移地址相对于CS.

IP寄存器始终与CS段寄存器一起工作,并指向当前正在执行的指令.

标志注册

确定处理器的当前状态.数学运算后,CPU会自动修改这些标志,这样可以确定结果的类型,并确定将控制权转移到程序其他部分的条件.

通常,您无法直接访问这些寄存器.

在此输入图像描述

  • 进位标志CF- 当存在无符号溢出时,此标志设置为1.例如,当您添加字节255 + 1(结果不在范围0 ... 255)时.没有溢出时,该标志设置为0.
  • 奇偶校验标志PF- 当结果中存在偶数个偶数时,该标志设置为1,当存在奇数个1位时,该标志设置为0.
  • 辅助标志AF- 当低半字节(4位)存在无符号溢出时,设置为1.
  • 零标志ZF- 结果为零时设置为1.对于非零结果,此标志设置为0.
  • 符号标志SF- 结果为负时设置为1.当结果为正时,它被设置为0.(该标志取最高位的值.)
  • 陷阱标志TF- 用于片上调试.
  • 中断使能标志IF- 当该标志设置为1时,CPU对来自外部设备的中断作出反应.
  • 方向标志DF- 某个指令使用此标志来处理数据链,当此标志设置为0时 - 处理完成向前,当此标志设置为1时,处理向后完成.
  • 溢出标志OF- 当有符号溢出时设置为1.例如,当您添加字节100 + 50(结果不在范围-128 ... 127)时.

  • @Tomalex:不知道.也许`e`代表"扩展"而``r代表"真正扩展":-) (2认同)
  • 我必须部分同意cHao,现在16位代码甚至用于学习目的是没用的 - 如果你想学习一些真实世界应用程序的汇编.8086的整个分段内容已经过时,取而代之的是分页.寄存器现在至少为32位,并且允许更多寻址模式.所以8086绝不是_simpler_而是x64.但它仍然有一些目的向学生展示如何设计处理器,作为一个反面的例子(说实话,x64并不是更好,但是一些真正疯狂的事情已经消失了.有没有听说过A20 Gate?) (2认同)