[toc]
在PC机系统中,和CPU通过总线相连的芯片除各种存储器外,还有以下3种芯片。
- 各种接口卡(比如,网卡、显卡)上的接口芯片,它们控制接口卡进行工作;
- 主板上的接口芯片,CPU通过它们对部分外设进行访问;
- 其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理。
在这些芯片中,都有一组可以由CPU读写的寄存器。这些寄存器,它们在物理上可能处于不同的芯片中,但是它们在以下两点上相同。
- 都和CPU的总线相连,这种连接是通过它们所在的芯片进行的;
- CPU对它们进行读或写的时候都通过控制线向它们所在的芯片发出端口读写命令。
从CPU的角度,将这些寄存器都当作端口,对它们进行统一编址,从而建立了一个统一的端口地址空间。
每一个端口在地址空间中都有一个地址。在访问端口的时候,CPU通过端口地址来定位端口。因为端口所在的芯片和CPU通过总线相连,
CPU可以直接读写以下3个地方的数据。
- CPU内部的寄存器;
- 内存单元;
- 端口。
端口地址和内存地址一样,通过地址总线来传送。在PC系统中,CPU最多可以定位64KB个不同的端口。则端口地址的范围为0-65535
。
ps:这个端口地址好像和网络端口号地址也是对应的,难道我们网络通信其实就是,CPU根据网卡通信,CPU通过找端口号找到网卡地址 ,进行数据读写
端口的读写指令只有两条:in
和out
,分别用于从端口读取数据和往端口写入数据。(在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。)
;对0~255以内的端口进行读时:
in al, 20h ;从20h端口读入一个字节
;对256~65535的端口进行读时,端口号放在dx中:
mov dx, 3f8h ;将端口号3f8h送入dx
in al, dx ;从3f8h端口读入一个字节
;对256~65535的端口进行读写时,端口号放在dx中:
mov dx, 3f8h ;将端口号3f8h送入dx
in al, dx ;从3f8h端口读入一个字节
out dx, al ;向3f8h端口写入一个字节
shl和shr是逻辑移位指令
shl是逻辑左移指令,它的功能为:
- 将一个寄存器或内存单元中的数据向左移位;
- 将最后移出的一位写入CF中;
- 最低位用0补充。
shr是逻辑右移指令,同理
mov al, 01001000b
shl al, 1 ;将a1中的数据左移一位执行后(al)=10010000b,CF=0。
mov al, 01010001b
mov cl, 3 ;如果移动位数大于1时,必须将移动位数放在cl中
shl al, c1
mov al, 10000001b
shr al, 1 ;将al中的数据右移一位执行后(al)=01000000b,CF=1。
将X逻辑左移一位,相当于执行X=X*2。 将X逻辑右移一位,相当于执行X=X/2
参考文章: https://blog.csdn.net/qq_39654127/article/details/88698911 王爽《汇编语言》笔记(详细)