各种存储器都和CPU的地址线、数据线、控制线相连。CPU在操纵他们的时候,都当做内存,把它们总地看做一个由若干存储单元组成的逻辑存储器,这个逻辑存储器我们称其为内存地址空间。
在PC机中,和CPU通过总线相连的芯片除各种存储器外,还有以下3种芯片:
- 各种接口卡(比如:网卡、显卡)上的接口芯片,它们控制接口卡进行工作
- 主板上的接口芯片,CPU通过它们对部分外设进行访问
- 其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理
这些芯片都有一组可以由CPU进行读写的寄存器,这些寄存器的相同点有:
- 都和CPU的总线相连(通过它们所在的芯片相连)
- CPU对它们进行读或写的时候都通过控制线向他们所在的芯片发出端口读写命令
从CPU的角度,将这些寄存器都当做端口,对其统一编址,从而建立了一个统一的端口地址空间,每个端口在地址空间中都有一个地址.
CPU可以直接读写三个地方的数据:
- CPU内部的寄存器
- 内存单元
- 端口
访问端口时,cpu通过端口地址来定位端口.
因端口所在的芯片和CPU通过总线相连,所以,端口地址和内存地址一样,通过地址总线来传送.
在PC系统中,CPU最多定位64KB个不同的端口,则端口的范围为0~65535.
对端口的读写不能用mov
、push
、pop
等内存读写指令.
端口的读写指令分别为:in
,out
.
访问指令 | |
---|---|
内存访问指令 | mov ax,ds:[8] 1.CPU通过地址线将地址信息8发出 2.CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据 3.存储器将8号单元中的数据通过数据线送入CPU |
端口访问指令 | in al,60h 1.CPU通过地址线将地址信息60h发出 2.CPU通过控制线发出端口读命令,选中端口所在的芯片,并通知它,将要从中读取数据 3.端口所在的芯片将60h端口中的数据通过数据线送入CPU |
;对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端口写一个字节
CMOS芯片是一种低功耗芯片,其主要作用是用来存放BIOS中的信息以及系统时间日期.
CMOS芯片的特征:
- 包含一个实体钟和一个有128个存储单元的RAM存储器(早期的电脑为64个字节)
- 该芯片靠电池供电.所以关机后其内部的实时钟仍可正常工作,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的2号单元的内容
asseme cs:code
code segment
start:
mov al,2
out 70h,al ;往70h写2
in al,71h ;从71h读取一个字节到al
code ends
end start
- 编程,向CMOS RAM的2号单元写入0
assume cs:code
code segment
start:
mov al,2
out al,70h ;往70h写2
mov al,5
out al,71h ;往2号单元地址写5
code ends
end start
shl和shr是逻辑移位指令:
shl
是逻辑左移指令,格式为:shl reg/mem,1/cl
功能为:- 将一个寄存器或内存单元中的数据向左移位
- 将最后移出的一位写入
cf
中 - 最低位用0补充
- 移动位数大于1时,必须将移动位数放在
cl
中
shr
是逻辑右移指令,格式为:shr reg/mem,1/cl
功能为:- 将一个寄存器或内存单元中的数据向右移位
- 将最后移出的一位写入
cf
中 - 最高位用0补充
- 移动位数大于1时,必须将移动位数放在
cl
中
用加法和移位指令计算(ax)=(ax)*10
提示:(ax)*10=(ax)*2+(ax)*8
assume cs:code
code segment
start:
mov ax,10
shl ax,1
mov bx,ax
mov cl,2
shl ax,cl
add ax,bx
code ends
end start
在CMOS RAM中,存放着当前的时间:年,月,日,时,分,秒.这6个信息的长度都为1字节,存放单元为:秒:0,分:2,时:4,日:7,年:9.(以BCD码存放)
BCD码:数值26的BCD码是0010 0110
.一个字节可以表示两个BCD码.
编程:在屏幕中间显示当前月份:month.asm
assume cs:code
code segment
start:
mov al,8
out 70h,al
in al,71h ;获得当前月份的BCD码
mov ah,al
mov cl,4
shr ah,cl ;ah为月份的十位数BCD码
and al,00001111b;al为月份的个位数BCD码
add ah,30h
add al,30h
mov bx,0b800h
mov es,bx
mov byte ptr es:[160*12+40*2],ah
mov byte ptr es:[160*12+40*2+2],al
mov ax,4c00h
int 21h
code ends
end start