检测点 14.1
编程:读、写 CMOS RAM 的 2 号单元的内容
说明:1. CMOS RAM 芯片的端口是 8-bits 端口,要通过 AL 寄存器进行读写操作。
2. CMOS RAM 芯片端口的地址是 70H 和 71H,地址值范围在 255(0FFh)以内,所以在 int、out 指令中使用 CMOS RAM 芯片端口时,直接书写其端口号 70H 或 71H。
3. CMOS RAM 的 2 号单元存储的是系统时间的分钟数:如果当前系统时间是 17:32,则 2 号单元存储的数据就是 32H —— 注意,不会将分钟数转换为 16 进制数,而是直接的 16 进制数 32H。
4. 要用 Debug 运行本程序,通过观察 AL 寄存器存储的数据来验证指令的执行是否正确。
assume cs:code
code segment
; (1) 读取 CMOS RAM 的 2 号单元的内容
start: mov al,2 ; 预先存入一个数字到 AL 寄存器,以便传送给 CMOS 芯片的端口
out 70h,al ; 将需要访问的 CMOS 芯片单元地址 2 读入到 CMOS 芯片的地址端口 70H。执行该指令后,意味着将要对 CMOS 芯片的 2 号单元进行读写操作
in al,71h ; 从 CMOS 芯片的数据端口 71H 读取数据到 AL 寄存器 —— CMOS 芯片会预先将其 2 号单元所存储的数据传送到数据端口 71H。注意,不要将指令名 in 写成 int,否则无法通过编译。
; (2) 向 CMOS RAM 的 2 号单元写入 0
mov al,2
out 70h,al ; 再次将需要访问的 CMOS 芯片单元地址 2 读入到 CMOS 芯片的地址端口 70H。执行该指令后,意味着将要对 CMOS 芯片的 2 号单元进行读写操作
mov al,0
out 71h,al ; 将 0 写入 CMOS 芯片的数据端口 71H —— CMOS 芯片会自动将 71H 端口存储的数据传送到 CMOS 芯片内的 2 号单元
; 以下 3 行代码将 CMOS RAM 的 2 号单元的内容再次读到 AL 寄存器中。以验证所写入 CMOS RAM 2 号单元的数据是否就是数字 0。
; 验证的结果是(在 Ubuntu 18.04 操作系统下运行):(1)当用 DOSBox 执行时,实际读到 AL 寄存器的仍然是当前系统的实时时间分钟数,而不是数字 0。(2)当用 DOSBox-X 执行时,则实际读到 AL 寄存器的数字是 0。
mov al,2
out 70h,al
in al,71h
mov ax,4c00h
int 21h
code ends
end start