80386/80386DX 微处理器的数据类型和寻址模式

2024年11月15日 | 6分钟阅读

数据类型在微处理器编程中起着至关重要的作用。变量定义了可以保存的信息类型以及可以对这些信息执行的操作。为了编写高效的代码,深入理解微处理器支持的数据类型至关重要。不同的微处理器对数据类型的支持可能有所不同,选择正确的数据类型会显著影响代码的性能。本文探讨了微处理器中各种常用数据类型,以及它们的用途和局限性。

微处理器使用基本数据类型,如字节(byte)、字(word)和双字(double word)。一个字节包含八个连续的比特,比特编号从 0 到 7。最小且最重要的比特称为比特零(bit zero),它从任何逻辑地址开始。

在微处理器中,一个字(word)由两个连续的字节组成,这两个字节从任何字节地址开始。一个字包含 16 个比特,编号从 0 到 15。最小且最重要的比特称为比特 0。在一个字中,包含比特 0 的字节称为低字节(low byte),而包含比特 15 的字节称为高字节(high byte)。

在微处理器中,一个双字(double word)由两个连续的字组成,这两个字从任何字节地址开始。一个双字包含 32 个比特,编号从 0 到 31。最小且最重要的比特称为比特 0。在一个双字中,包含比特 0 的字称为低字(low word),而包含比特 31 的字称为高字(high word)。

80386DX 微处理器为基本数据类型(如字节、字和双字)提供了其他解释的支持。这些额外的数据类型是根据引用操作数的指令来识别的。80386DX 和 80386 微处理器共享相同的数据类型。

比特(Bit): 单比特量是指只包含一个比特的数据类型。

  • 比特域(Bit Field): 由最多 32 个连续比特组成的集合称为“比特域”,它可以跨越最多四个字节。
  • 比特串(Bit String): Intel386 DX 可以处理长达 4 千兆比特的比特串。这意味着它们可以由最多 40 亿个比特的连续序列组成。
  • 字节(Byte): 带符号的 8 位数据表示范围为 -128 到 +127。它使用 8 个比特来存储值,并可以在此范围内表示负数和正数。另一方面,无符号字节是一个 8 位数据类型,可以表示从 0 到 255 的值。它没有符号,因此所有值都被视为正数。
  • 整数(字)(Integer (Word)): 带符号的 16 位数据可以存储从 -32,768 到 +32,767 的值。它使用 16 个比特来表示值,并可以在此范围内表示负数和正数。
  • 无符号整数(字)(Unsigned Integer (Word)): 无符号的 16 位数据可以容纳从 0 到 65,535 的值。它使用 16 个比特来存储值,并且只能在此范围内表示正数。
  • 长整数(双字)(Long Integer (Double Word)): 长整数(双字)是一种使用 2 的补码表示的有符号 32 位数据。它可以表示的范围为 -2 的 3 次方到 +2 的 31 次方 - 1。这意味着它可以存储在此指定范围内的负数和正数。
  • 无符号长整数(双字)(Unsigned Long Integer (Double Word)): 无符号的 32 位数据可以容纳从 0 到 4,294,967,295 的值。它使用 32 个比特来存储值,并且只能在此范围内表示正数。
  • 有符号四字(Signed Quad Word): 有符号的 64 位数据可以表示广泛的正数和负数值。它使用 64 个比特来存储值,与较小的数据类型相比,可以表示更大的数字。
  • 无符号四字(Unsigned Quad Word): 无符号的 64 位数据可以存储广泛的非负数值。它使用 64 个比特来存储值,与较小的数据类型相比,可以存储更大的非负值。
  • 偏移量(Offset): 16 位或 32 位仅偏移量用于间接引用另一个内存位置。它是一种指定内存中特定点距离或位移的方法,而不是直接引用目标内存位置本身。
  • 近指针(Near Pointer): 32 位逻辑地址是一种包含 32 位内存地址。它用于指示内存中的特定位置。另一方面,近指针表示段内的距离。它在平面或分段内存模型中使用,以指向特定的内存位置。
  • 远指针(Far Pointer): 远指针是一种表示 48 位逻辑地址的数据类型,包含两个组件:一个 16 位段选择器和一个 32 位偏移量。应用程序程序员仅在系统设计者选择分段内存结构时才使用远指针。它们允许引用超出常规 32 位地址限制的特定内存位置。
  • 字符(Char): 字节表示是指将 ASCII 字母数字或控制字符转换为特定编码。它使用单个字节数据来表示 ASCII 字符集中的特定字符,该字符集包括字母、数字和控制字符。
  • 字符串(String): 字符串是一系列连续的字节、字或双字。其大小可以从 1 字节到 4 千兆字节不等,可以容纳各种数据长度。
  • BCD(Binary Coded Decimal): 字节(未压缩)表示是指使用单独字节对十进制数字 0 到 9 进行编码。每个数字都用一个单独的字节表示,从而可以轻松地在计算机系统中处理和存储十进制值。
  • 压缩 BCD(Packed BCD): 压缩字节表示是指使用半字节(nibble)存储十进制数字 0 到 9。每个数字存储在一个半字节(nibble)中,即半个字节,从而可以紧凑地高效存储多个数字。当 Intel386 DX 与 Intel387 DX 数值协处理器结合使用时,它支持各种流行的浮点类型。这些浮点类型能够精确地表示和处理带小数点的十进制数。
  • 浮点数(Floating Point): Intel387 DX 数值协处理器支持使用 32 位、64 位或 80 位浮点格式表示带符号的实数。这些格式允许在计算机系统中准确地表示和计算十进制数。

80386/80386DX 寻址模式分类

为了提高编程的灵活性,处理器提供了多种方法来从不同位置访问操作数。80386 微处理器提供了多种寻址模式,可以方便地访问内存和寄存器。这些方法通常被称为寻址模式。

寻址模式在确定处理器如何解释指令中指定的内存地址或寄存器方面起着至关重要的作用。它们定义了访问和解释指定内存或寄存器的方法。80386DX 提供了总共 11 种寻址模式来指定操作数,这些模式可分为三类:

  1. 寄存器操作数寻址
  2. 立即数操作数寻址
  3. 内存操作数寻址

寄存器操作数寻址(Register Operand Addressing): 在这种寻址模式下,指令将一个寄存器指定为操作数。

操作数是存储在寄存器中的值。这种寻址方式速度极快,因为 CPU 只需访问寄存器,而寄存器直接位于处理器上。它通常用于算术和逻辑运算,以及寄存器之间的数据传输。该值可以保存在 32 位通用寄存器(EDX、ECX、EBX、EAX、EDI、ESI、EBP 或 ESP)、16 位通用寄存器(DX、CX、BX、AX、DI、SI、BP 或 SP)或 8 位通用寄存器(DH、CH、BH、AH、BL、AL、DL 或 CL)中。

立即数操作数寻址(Immediate Operand Addressing): 在某些指令中,操作数是嵌入在指令本身中的常量值。这种寻址模式对于需要固定值作为操作数的运算特别有用,例如设置一个值或将其与常量进行比较。在某些情况下,指令可以使用指令本身内部的数据作为操作数,这被称为立即数操作数。操作数的长度可以是 32 位、16 位或 8 位,具体取决于指令。

内存操作数寻址(Memory Operand Addressing): 在这种寻址模式下,指令将一个内存地址包含为值。存储在该特定内存位置的数据用作指令的值。

此模式用于涉及从内存读取或写入内存的操作,例如将数据传输到寄存器或将寄存器中的数据保存到内存。内存操作数寻址模式可分为不同类型:直接寻址、间接寻址、寄存器间接寻址、基址-指针-索引寻址、比例变址寻址和相对寻址。每种寻址模式都有其自身的特定用途和用例。