汇编第十四节-端口

来源:互联网 发布:java调用weka 编辑:程序博客网 时间:2024/05/22 06:19

第十四节:端口

PC机系统中,和CPU通过总线相连的芯片除各种存储器外,还有下面三种:

a.各种接口卡(比如网卡,显卡)上的接口芯片,它们控制接口卡进行工作。b.主板上的接口芯片,CPU通过它们对部分外设进行访问。c.其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理。

在这些芯片中,都有一组可以由CPU读写的寄存器。在物理上可以处于不同的芯片上,但是由两点相同:

a.都和CPU的总线相连b.CPU对它们进行读或写的时候,都通过控制线向它们所在的芯片发出端口读写指令每一个端口在地址空间中都有一个地址。

CPU可以直接读写以下3个地方的数据:

a.CPU内部的寄存器b.内存单元c.端口

1.端口的读写:

在访问端口的时候,CPU通过端口地址来定位端口。端口地址和内存地址一样,通过地址总线来传送。在PC系统中,CPU最多可以定位64kb个不同的端口。端口地址为0~65535
端口的读写指令只有2条:in(从端口读取数据)和out(往端口写入数据)
访问端口:
in al,60h ;从60h号端口读入一个字节

1.CPU通过地址总线将地址信息60h发出2.CPU通过控制线发出端口读命令,选中端口所在的芯片,并通过它,将要从中读取数据。3.端口所在的芯片将60h端口中的数据通过数据送入CPU

in 和 out 指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。
8位端口al,16位ax
0~255以内的端口进行读写:

in al,20h       ;从20h端口读入一个字节out 20h,al      ;往20h端口写入一个字节

对256~65535,端口号放在dx中

mov dx,3f8h     ;将端口号3f8h送入dxin al,dxout dx,al

2.CMOS RAM芯片:

PC机有一个CMOS RAM芯片,一般简称CMOS
特征:

1.包含一个实时钟和一个有128个存储单元的RAM存储器2.电池供电(关机后内部仍工作,RAM信息不丢失)3.128个字节的RAM中,内部实时钟占用0~0dh单元来保存时间信息,其余大部分单元用来保存信息配置信息,供系统启动时BIOS程序读取。4.该芯片内部有2个端口,70h和71h。CPU通过这2个端口来读写CMOS RAM5.70h为地址端口,存放要访问的CMOS RAM单元的地址;71hw为数据端口,存放从选定的CMOS RAM单元中读取的数据,或要写入到其中的数据。  
eg:读CMOS RAM的2号单元。
    1.将2送入端口70h    2.从端口71h读出2号单元的内容

3.shl和shr指令:

逻辑移位标志
shl-逻辑左移指令
功能:

1.将一个寄存器或内存单元中的数据向左移位。    2.将最后移出的一位写入CF中。    3.最低位用0补充

指令:

    mov al,01001000b    shl al,1            ;将al中的数据左移一位。

执行后(al)=10010000b,CF=0

如果移动位数大于1时,移动位数放在cl中。

mov al,01010001bmov cl,3mov al,cl

X逻辑左移一位,等于X=X*2

shr-逻辑右移指令
功能:

1.将一个寄存器或内存单元中的数据向右移位。2.将最后移出的一位写入CF中。3.最高位用0补充。

指令:

mov al,10000001bshl al,1            ;将al中的数据右移一位。

执行后(al)=01000000b,CF=1
X逻辑右移一位,等于X=X/2

4.CMOS RAM中存储的时间信息:

在CMOS RAM中,存放着当前的时间:年,月,日,时,分,秒。这6个信息的长度都为1个字节,存放单元为:
秒:0 分:2 时:4 日:7 月:8 年:9
这些数据以BCD码存放。
BCD码是以4位二进制数表示十进制数码的编码方法
比如26 BCD码就是 0010 0110
eg:编程,在屏幕中间显示当前的月份
1.从CMOS RAM的8号单元读出当前月份的BCD码
2.将用BCD码表示的月份以十进制的形式显示在屏幕上。

    BCD码值=十进制数码值    BCD码值+30h=十进制数对应的ASCII码
    a.将从CMOS RAM的8号单元中读出一个字节,分为两个表示BCD码值的数据    b.显示(ah)+30h和(al)+30h对应的ASCII码字符。
assume cs:codecode segmentstart: mov al,8       out 70h,al        in al,71h       mov ah,al        mov cl,4       shr ah,cl       and 00001111b       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 21hcode endsend start