端口就是一些芯片的存储器,这些芯片有各种接口卡(网卡,显卡)、主板上的芯片接口(CPU可以通过这些芯片对我们连接的外部设备进行访问)、用来存储相关的系统信息的一些芯片,如CMOS,或者是一些进行输入输出处理的芯片。
CPU对端口进行统一的编址,建立统一的一个端口地址空间,每一个端口在地址空间都有一个地址。端口地址范围是0-FFFF。
这边我们的端口地址是怎么设定的呢?
这边对端口的读写指令只能用IN和OUT两种指令。
比如我们访问端口(书上的例子)
IN AL,60H ;从60H号端口读入一个字节
这边,我们通过IN指令来给60H号的端口所在的芯片发出读取字节的命令,但是,是不是60号端口就是专门给端口设定的呢,60号端口所在的芯片的作用是什么呢,如果我们使用 MOV AL,[60H]这样的指令,控制总线会不会发出读取60H号端口的一个字节的指令并且是成功的读取呢,这边我们用debug试一下,测试如下:
mov al,[60]
得到的al寄存器的值是20H,可以。
那么我们试一下
IN AL,60H
得到的al的结果是AL=1C,这边也是可以的
但是,为什么会这样呢,这点就是我所不能理解的,为什么会这样呢,MOV AL,[60H]是从60H偏移地址中读入一个字节,IN AL,60H是从60号端口中读入一个字节,很明显的,这边我是把端口地址和内存偏移地址混淆了,以为是一样的,但是这个也就是关键了,为什么
不然我从段地址为0000:60中读入一个字节后,结果是:AL=0E,这边我还是很简单的认为端口地址是CUP地址空间中的前面的0000:0000-0000:FFFF对应的地址,这边是不是可以说明端口地址和我们的CPU的地址总线的地址是相互独立开来的呢?
这边如果有看到的朋友能够帮忙说明一下呢,不胜感激~ 当然我也不会就这样放着的……
这边注意,CPU只能用AL,AX存放和端口互访的数据,如果是8为的,用AL,方位16位端口时用AX,
对访问100H-FFF端口的数据时,应该先将端口号寄存到DX中,如
MOV DX,13FH
IN AX,DX
OUT DX,AX
70H,71H为COMS的端口地址,70H存放要访问的CMOS RAM单元的地址,71H为数据端口,存放从选定的COMS RAM单元中读取的数据,或者要写入的数据。