端口
我们前面讲过,各种存储器都和CPU的地址线\数据线\控制线相连. CPU在操控它们的时候,把它们都当作内存来对待,把它们总地看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器我们称其位内存地址空间.
在PC机系统中,和CPU通过总线相连的芯片除各种存储器外,还有以下三种芯片.
- 各种接口卡(比如 网卡\显卡) 上的接口芯片,它们控制接口卡进行工作;
- 主板上的接口芯片,CPU通过它们对部分外设进行访问;
- 其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理
在这些芯片中,都由一组可以由CPU读写的寄存器.这些寄存器,它们在物理上可能处于不同的芯片中,但是它们在以下两点上相同:
- 都和CPU的总线相连,当然这种链接是通过它们所在的芯片进行的
- CPU对它们进行读或者写的时候都通过控制线向它们所在的芯片发出端口读写命令
可见,从CPU的角度,这些寄存器都当作端口,对它们进行统一编址,从而建立了一个统一的端口地址空间.每一个端口在地址空间中都有一个地址.
CPU 可以直接独写以下三个地方的数据:
- CPU内部的寄存器
- 内存单元
- 端口
端口独写
访问内存
mov ax,ds:[8]
- CPU通过地址线将地址信息8发出
- CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据
- 存储器将8号单元中的数据通过数据线送入CPU
访问端口
int al,60h
- CPU通过地址线将地址信息60h发出;
- CPU通过控制线发出端口读命令,选中端口所在的芯片,并通知它,将要从中读取数据
- 端口所在的芯片将60h端口中的数据通过数据线送入CPU
实验
CMOS RAM 中,存放着当前的时间: 年\月\日\时\分\秒,这六个信息的长度均为1字节.以BCD码的方式存放
编程 以
年/月/日 时:分:秒
的格式,显示当前的日期\时间
代码
因为读写的单元不是很有规律,所以只能一个一个的写了
assume cs:code
data segment
db 20 dup(0)
data ends
;s min hour day month year
code segment
start:
;s
mov bl,0
mov al,bl
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl;右移四位,取高4位
and al,00001111b;与,取低4位
add ah,30h
add al,30h
push ax
;分
mov bl,2
mov al,bl
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl;右移四位,取高4位
and al,00001111b;与,取低4位
add ah,30h
add al,30h
push ax
;时
mov bl,4
mov al,bl
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl;右移四位,取高4位
and al,00001111b;与,取低4位
add ah,30h
add al,30h
push ax
;日
mov bl,7
mov al,bl
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl;右移四位,取高4位
and al,00001111b;与,取低4位
add ah,30h
add al,30h
push ax
;月
mov bl,8
mov al,bl
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl;右移四位,取高4位
and al,00001111b;与,取低4位
add ah,30h
add al,30h
push ax
;年
mov bl,9
mov al,bl
out 70h,al
in al,71h
mov ah,al
mov cl,4
shr ah,cl;右移四位,取高4位
and al,00001111b;与,取低4位
add ah,30h
add al,30h
push ax
mov ax,data
mov ds,ax
pop ax
mov ds:[0],ah
mov ds:[1],al
mov byte ptr ds:[2],'/'
pop ax
mov ds:[3],ah
mov ds:[4],al
mov byte ptr ds:[5],'/'
pop ax
mov ds:[6],ah
mov ds:[7],al
mov byte ptr ds:[8],' '
pop ax
mov ds:[9],ah
mov ds:[10],al
mov byte ptr ds:[11],':'
pop ax
mov ds:[12],ah
mov ds:[13],al
mov byte ptr ds:[14],':'
pop ax
mov ds:[15],ah
mov ds:[16],al
mov bx,0b800h
mov es,bx
mov si,0
mov bx,0
mov cx,0
s:
mov byte ptr cl,ds:[bx]
jcxz ok
mov byte ptr es:[160*12+40*2+si],cl
inc bx
add si,2
jmp s
ok:
mov ax,4c00h
int 21h
code ends
end start