8086/8088中有多少个寄存器?

时间:2012-02-03 14:37:41

标签: x86 cpu cpu-registers microprocessors

我参加了计算机体系结构课程,我理解处理器有32个寄存器,每个32位。现在我正在学习计算机体系结构课程,其中我读到8086有8 registers only。但是我读过的这本书和this网站显示了很多寄存器。我对8086和8088的寄存器感到困惑。请帮帮我。感谢

注意:

我非常了解不同处理器中的不同寄存器大小。我只是对寄存器的数量感到困惑。感谢

4 个答案:

答案 0 :(得分:27)

8086和8088是16位处理器 - 它们的寄存器宽度为16字节(AX和DX可以组合成一个32位寄存器)

注意8086有16位数据总线; 8088有一个8位数据总线(尽管它们在内部都是16位可寻址的)

一般目的寄存器

8086 CPU有8个通用寄存器,每个寄存器都有自己的名称:

AX - 累加器寄存器(分为AH / AL):

Generates shortest machine code
Arithmetic, logic and data transfer
One number must be in AL or AX
Multiplication & Division
Input & Output

BX - 基地址寄存器(分为BH / BL)。

CX - 计数寄存器(分为CH / CL):

Iterative code segments using the LOOP instruction
Repetitive operations on strings with the REP command
Count (in CL) of bits to shift and rotate

DX - 数据寄存器(分为DH / DL):

DX:AX concatenated into 32-bit register for some MUL and DIV operations
Specifying ports in some IN and OUT operations

SI - 源索引寄存器:

Can be used for pointer addressing of data
Used as source in some string processing instructions
Offset address relative to DS

DI - 目的地索引寄存器:

Can be used for pointer addressing of data
Used as destination in some string processing instructions
Offset address relative to ES

BP - 基指针:

Primarily used to access parameters passed via the stack
Offset address relative to SS

SP - 堆栈指针:

Always points to top item on the stack
Offset address relative to SS
Always points to word (byte at even address)
An empty stack will had SP = FFFEh

分段寄存器

CS - 指向包含当前程序的段。

DS - 通常指向定义变量的段。

ES - 额外的段寄存器,由编码器来定义其用法。

SS - 指向包含堆栈的段。

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

段寄存器与通用寄存器一起工作以访问任何存储器值。例如,如果我们想要访问物理地址12345h(十六进制)的内存,我们可以设置DS = 1230h和SI = 0045h。这样我们可以访问比单个寄存器更多的内存,这个寄存器限制为16位值。 CPU通过将段寄存器乘以10h并将通用寄存器添加到其中来计算物理地址(1230h * 10h + 45h = 12345h):

由2个寄存器组成的地址称为有效地址。 默认情况下,BX,SI和DI寄存器与DS段寄存器配合使用; BP和SP使用SS段寄存器。 其他通用寄存器不能形成有效地址。 此外,虽然BX可以形成有效地址,但BH和BL不能。

特殊目的寄存器

IP - 指令指针:

Always points to next instruction to be executed
Offset address relative to CS

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

标记注册

标志寄存器 - 确定处理器的当前状态。它们在数学运算后由CPU自动修改,这允许确定结果的类型,并确定将控制转移到程序的其他部分的条件。 通常,您无法直接访问这些寄存器。

Carry Flag (CF) - this flag is set to 1 when there is an unsigned overflow. For example when you add bytes 255 + 1 (result is not in range 0...255). When there is no overflow this flag is set to 0.
Parity Flag (PF) - this flag is set to 1 when there is even number of one bits in result, and to 0 when there is odd number of one bits. 
Auxiliary Flag (AF) - set to 1 when there is an unsigned overflow for low nibble (4 bits).
Zero Flag (ZF) - set to 1 when result is zero. For non-zero result this flag is set to 0.
Sign Flag (SF) - set to 1 when result is negative. When result is positive it is set to 0. (This flag takes the value of the most significant bit.)
Trap Flag (TF) - Used for on-chip debugging.
Interrupt enable Flag (IF) - when this flag is set to 1 CPU reacts to interrupts from external devices.
Direction Flag (DF) - this flag is used by some instructions to process data chains, when this flag is set to 0 - the processing is done forward, when this flag is set to 1 the processing is done backward.
Overflow Flag (OF) - set to 1 when there is a signed overflow. For example, when you add bytes 100 + 50 (result is not in range -128...127). 

答案 1 :(得分:3)

  

我参加了计算机体系结构课程,我理解了这个处理器   有32个寄存器,每个32位。

这不能回答您的问题,但如果您想与其他工程师沟通,则必须使用正确的语言。说“一个(某些)处理器有32个32位大小的寄存器”不会让你到任何地方,有无数的处理器。

  

8086有8个(或多或少一般)16位寄存器,包括   堆栈指针,但不包括指令指针,标志   寄存器和段寄存器。其中四个,AX,BX,CX,DX,可以   也可以访问两倍于8位寄存器(见图)   另外四个,BP,SI,DI,SP,仅为16位。

我假设混淆来自维基百科上的这句话。您阅读的两个来源都是正确的。有8个一般的purpouse寄存器(在文章中它被称为“或多或少一般”,我不知道谁能写出来),它们是:AX BX CX DX和SI DI BP SP。还有段寄存器,特殊的purpouse寄存器和一个标志寄存器(在“排除”字后面注明,我猜,它被认为是“有寄存器,如果你排除这些寄存器,有8个寄存器3组“,这很模糊。”

问题在于措辞。引用的句子令人困惑,我可以看到你的问题来自哪里。问题永远不会伤害,但你应该明白维基百科不是一个可靠的知识来源,如果你感到困惑,只需拿起一本书。

答案 2 :(得分:3)

8086有14个16位寄存器。 AX,BX,CX,DX,SI,DI,BP,SP,CS,DS,SS,ES,IP和标志寄存器。最后两个只是间接访问。

答案 3 :(得分:1)

计算机体系结构书籍通常使用MIPS作为示例,因为它相当简单且具有教育意义。 MIPS有32个寄存器,但意味着其他32位架构也有32个寄存器。此处的32位仅表示计算机具有32 bit address/32 bit integer registers,与寄存器数量无关。

ARM是最流行的32位架构,有16个寄存器(尽管ARMv8 64位将这个数字加倍到32)。许多其他32位架构也有32个以外的寄存器号,例如Motoroka 68k和SuperH,它们都有16个寄存器。有关体系结构列表,请查看here。你看,64位架构很少有64个寄存器。其中大多数将有32个,尽管有些有128或256个寄存器。

x86,几十年前向后兼容8080,只有8个寄存器。但实际上x86现在内部有数百个寄存器,并使用寄存器重命名来克服寄存器数量的限制。