端口

Tutorial: 汇编基础 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
1. 端口

在 PC 机系统中,和 CPU 通过总线相连的芯片除各种存储器外,还有以下 3 种芯片。

  • 各种接口卡(比如,网卡、显卡)上的接口芯片,它们控制接口卡进行工作;
  • 主板上的接口芯片,CPU 通过它们对部分外设进行访问;
  • 其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理。

在这些芯片中,都有一组可以由 CPU 读写的寄存器。这些寄存器,它们在物理上可能处于不同的芯片中, 但是它们在以下两点上相同。

  • 都和 CPU 的总线相连,这种连接是通过它们所在的芯片进行的;
  • CPU 对它们进行读或写的时候都通过控制线向它们所在的芯片发出端口读写命令。

从 CPU 的角度,将这些寄存器都当作端口,对它们进行统一编址,从而建立了一个统一的端口地址空间。 每一个端口在地址空间中都有一个地址。在访问端口的时候,CPU 通过端口地址来定位端口。因为端口所在的芯片和 CPU 通过总线相连,

CPU 可以直接读写以下 3 个地方的数据。

  • CPU 内部的寄存器;
  • 内存单元;
  • 端口。
2. 端口的读写

端口地址和内存地址一样,通过地址总线来传送。在 PC 系统中,CPU 最多可以定位 64KB 个不同的端口。则端口地址的范围为 0-65535。

端口的读写指令只有两条:in 和 out,分别用于从端口读取数据和往端口写入数据。

在 in 和 out 指令中,只能使用 ax 或 al 来存放从端口中读入的数据或要发送到端口中的数据。

; 对0~255以内的端口进行读写时:
in al, 20h   ; 从20h端口读入一个字节
out 20h, al  ; 往20h端口写入一个字节

; 对256~65535的端口进行读写时,端口号放在dx中:
mov dx, 3f8h  ; 将端口号3f8h送入dx
in al, dx     ; 从3f8h端口读入一个字节
out dx, al    ; 向3f8h端口写入一个字节
3. CMOS RAM 芯片

PC 机中,有一个 CMOS RAM 芯片,一般简称为 CMOS。此芯片的特征如下

  • 包含一个实时钟和一个有 128 个存储单元的 RAM 存储器
  • 该芯片靠电池供电。关机后内部的实时钟正常工作,RAM 中的信息不丢失
  • 128 个字节的 RAM 中,内部实时钟占用 0~0dh 单元来保存时间信息,其余大部分单元用于保存系统配置信息,供系统启动时 BIOS 程序读取。 BIOS 也提供了相关的程序,使我们可以在开机的时候配置 CMOS RAM 中的系统信息。
  • 该芯片内部有两个端口,端口地址为 70h 和 71h。CPU 通过这两个端口来读写 CMOS RAM
  • 70h 为地址端口,存放要访问的 CMOS RAM 单元的地址;71h 为数据端口,存放从选定的 CMOS RAM 单元中读取的数据,或要写入到其中的数据。 可见,CPU 对 CMOS RAM 的读写分两步进行,比如,读 CMOS RAM 的 2 号单元: ① 将 2 送入端口 70h; ② 从端口 71h 读出 2 号单元的内容。
CMOS RAM中存储的时间信息
在CMOS RAM中,存放着当前的时间:年、月、日、时、分、秒。长度都为1个字节,
存放单元为:

1001  1000   0111  0110   0101   0100    0011   0010   0001   0000
9     8      7     6      5      4       3      2      1      0
年    月     日                  时              分            秒

BCD码是以4位二进制数表示十进制数码的编码方法 4 == 0100B

一个字节可表示两个BCD码。则CMOS RAM存储时间信息的单元中,存储了用两个BCD码表示的两位十进制数,
高4位的BCD码表示十位,低4位的BCD码表示个位。比如,00010100b表示14。

比如从端口读取时间: 26秒 =al(一个字节) => 0010 0110
4. 检测点 14.1

(1)编程:读取 CMOS RAM 的 2 号单元的内容。

assume cs:code
code segment
      start:
            mov al,2
            out 70h,al
            in  al,71h

            mov ax,4c00h
            int 21h
code ends
end start

(2)编程:向 CMOS RAM 的 2 号单元写入 0。

assume cs:code
code segment
      start:
            mov al,2
            out 70h,al
            mov al,0
            out 71h,al

            mov ax,4c00h
            int 21h
code ends
end start