1. 预备知识
- CPU 通过端口地址定位端口,使用 in 和 out 命令读写端口,且只能使用 AX(16 位)或 AL(8 位)来存放从端口读入和发送到端口的数据。
- CMOS RAM 芯片内部有两个端口:70h 为地址端口,存放要访问 CMOS 单元的地址;71h 为数据端口,存放从 CMOS 单元读取的数据。如读取 CMOS 的 2 号单元需要两个步骤:将 2 送入端口 70h,从 71h 读出 2 号单元的内容。
- shl 和 shr 时逻辑左 / 右移指令,并将移出的位写入 CF 中,并使用 0 补充移入位。左移 n 位相当于乘以 2 的 n 次方,右移 n 位相当于除以 2 的 n 次方。
2. 检测点 14.1
(1)编程:读取 CMOS RAM 的 2 号单元的内容。
- 根据预备知识的内容,首先基于 out 命令将 2 送入端口 70h,然后基于 in 命令从 71h 读取数据,全程使用 8 位寄存器 AL 完成。
assume cs:code
code segment
start:
mov al,2h
out 70h,al ;将2送入端口70h
in al,71h ;从71h独出2号单元的内容
mov ax,4c00h
int 21h
code ends
end start
由图可知,从 2 号单元读出的内容为 16H:
(2)编程:向 CMOS RAM 的 2 号单元写入 0。
- 首先将2送入地址端口,然后将0送入数据端口。
assume cs:code
code segment
start:
mov al,2h
out 70h,al ;将2送入端口70h
mov al,0
out 71h,al
mov ax,4c00h
int 21h
code ends
end start
3. 检测点 14.2
编程:用加法和移位指令计算 (ax)=(ax)*10。提示:(ax)*10=(ax)*2+(ax)*8。
- 根据预备知识和提示,将乘以 10 分解为乘以 2 和乘以 8 的组合,这样可以使用左移运算完成。
assume cs:code
code segment
start:
mov ax,5h ;(AX)=5
mov bx,ax
shl ax,1 ;计算左移1位的结果
mov cl,3
shl bx,cl ;计算左移3位的结果
add ax,bx ;(AX)=(AX)+(BX)
mov ax,4c00h
int 21h
code ends
end start
程序运行结果如下:
图中标出了两次左移运算的结果和最终的结果。
4. 总结
- CMOS RAM 芯片内部有两个端口:70h 为地址端口,存放要访问 CMOS 单元的地址;71h 为数据端口,存放从 CMOS 单元读取的数据。
- shl 和 shr 分别为逻辑左移和逻辑右移运算,左移 / 右移 n 位相当于乘以 / 除以 2 的 n 次方。