|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 若余相思 于 2017-12-3 17:43 编辑
前面讲了那么多,其实都是对CPU的寄存器和内存进行操作,这章讲到对端口的操作
CPU通过总线(即地址总线、控制总线、数据总线)相连的芯片除了各种存储器外,还有一下3中芯片
(1)各种接口卡上的接口芯片,他们控制接口卡进行工作
(2)主板上的接口i芯片,,CPU通过他们进行外部设备进行访问
(3)其他芯片,用来存储相关的系统信息,或者进行相关的输入输出处理
这些芯片都有一组可以CPU读写的寄存器,他们有如下的特点:
(1)都与CPU进行相连
(2)CPU对他们进行读写的时候都是通过控制线向他们所在的芯片发出端口的读写命令
所以以后CPU可以直接在以下3地方进行读写操作
(1)CPU内部的寄存器
(2)内存单元
(3)端口
14.1节 端口的读写
访问端口CPU通过地址来访问,端口地址和内存地址一样,都是通过地址总线来传送的。
端口地址范围为0~65535
in和out指令分别是对端口进行读写的指令
访问端口:
in al, 60H
过程如下l
(1)CPU通过地址总线通过地址信息60H发出
(2)CPU通过控制线发出端口读命令
(3)端口所在芯片讲60H端口中的数据通过数据总线送入CPU
在in和out指令中只能使用ax和al来存放端口中读来的数据或者把数据放在端口中
访问8位端口时使用al,访问16位端口是ax
0~255以内的端口进行读写
in al, 20H 从20H端口向al中读入一个字节
out 20H, al 往20H端口写入一个字节
对255~65535端口进行读写时,端口放在dx中
mov dx, 3F8H
in al, dx
out dx, al
14.2节 CMOS RAM芯片
CMOS RAM芯片简称CMOS,有如下特征
(1)包含一个时钟和有128个存储单元的RAM存储器
(2)该芯片靠电池工作,所以关机后不会丢失信息
(3)128个字节的RAM内部的0~0dH单元来保存时间信息,其他大部分单元用来保存系统的配置信息,
供系统启动时BIOS读取,BIOS也提供了相关的程序,使我们在开机的时候配置CMOS RAM中的系统信息
(4)该芯片有两个端口,70H和71H,70H为地址端口,存放在访问的CMOS RAM单元的地址,71H为数据端口,存放对端口的读写数据
如:
1、编程读取CMOS RAM的2号单元的内容
代码:assume cs:code
code segment
start: mov al,2 ;赋值al
out 70h,al ;将al送入端口70h
in al,71h ;从端口71h处读出单元内容
mov ax,4c00h
int 21h
code ends
end start
2、编程向CMOS RAM的2号单元写入0
代码:assume cs:code
code segment
start: mov al,2 ;赋值al
out 70h,al ;将al送入端口70h
mov al,0 ;赋值al
out 71h,al ;向端口71h写入数据al
mov ax,4c00h
int 21h
code ends
end start
14.3节 shl和shr指令
shl和shr是移位指令,分别是向左向右移
如:
mov al, 01001000B
shl al, 1
结果al = 10010000B
如果有进位,则将进位放在CF中
如:
mov al, 10001000B
shl al, 1
这时al = 00010000B,CF = 1
如果在移动2位以上则将要移的位数放在cl中
mov al, 10010000B
mov cl, 3
shl al, cl
这时al = 10000000B
问题:编程用加法和移位计算(ax) = (ax)* 10
代码:assume cs: code
code segment
start: mov ax, 5
mov bx,ax
shl ax, 1
mov cl, 3
shl bx, cl
add ax, bx
mov ax, 4c00H
int 21H
code ends
end start
14.4节 CMOS RAM中存储的时间信息
CMOS RAM中存放着时间:年月日时分秒着6个信息的长度都为一个字节
存放的单元分别是:
秒:0 分:2 时:4 日:7 月:8 年:9
这些数据以BCD码的形式存放,BCD码是以四位二进制数表示十进制
所以一个字节单元能表示两个BCD码
编程:在屏幕显示当前的月份
代码:assume cs: code
code segment
start: mov al, 8
out 70H, al
in al, 71H
mov ah, al
mov cl, 4
shr ah, cl
and al, 00001111B
add al, 30H
add ah, 30H
mov ax, 0b800H
mov es, ax
mov byte ptr es:[160*12 + 80], ah
mov byte ptr es:[160*12+ 80 + 2], al
mov ax, 4c00H
int 21H
code ends
end start
|
|