人老了,有一点不舒服就得请假去医院,去了之后,还什么事儿都没有,不去心理还有压力,而且最近疫情新闻里报道的还挺严重,城南小陌又逢春,只见梅花不见人,人有生老三千疾,唯有相思不可医
CPU内部暂存数据的叫做寄存器,而外围设备的(键盘,硬盘,鼠标等等),则叫做端口,本质上就是寄存器,只是为了区分叫法,CPU想要对外围设备进行数据读取(IO操作),那么就必须通过端口
相对于CPU内部的多个寄存器,名字叫eax,ebx,ecx等等,而端口是外围设备的寄存器,所以名字很简单,就是简单的直接编号,在英特尔架构下,端口最多支持65535个,也就是说端口的编号是0001-0xFFFF
端口是独立编址的,什么意思呢?说白了就是不要和内存弄混了,比方我说端口地址是0xFFFF,这意思可不是内存地址0xFFFF作为端口,刚接触计算机的时候,我个人就是这么认为的,很尴尬
端口的位宽也是不同的(这是基于历史的,现在几乎都是32位),有8位的,16位的,所以对不同位宽的端口,CPU要使用EAX下的不同的寄存器
对端口的操作,使用in和out指令,其中in从端口读数据,out往端口写数据,没错,这就是IO这个词的由来,它的的确确就是汇编演变过来的
汇编指令IN:in eax/ax/al,dx
下面的代码使用in指令来从0xfff1端口处读取数据,且该端口的位宽是8
mov dx,0xfff1 ;dx用来存放端口号,如果端口号小于255,可是直接使用立即数
in al,dx
下面的代码使用in指令来从0xfff1端口处读取数据,且该端口的位宽是16
mov dx,0xfff1
in ax,dx
汇编指令OUT:out dx,eax/ax/al
下面的代码使用out指令往0xfff1端口处写0x12,且该端口的位宽是8
mov dx,0xfff1 ;必须是dx,其他寄存器不行
mov al,0x12
out dx,al
下面的代码使用out指令往0xfff1端口处写0x1234,且该端口的位宽是16
mov dx,0xfff1 ;必须是dx,其他寄存器不行
mov ax,0x1234
out dx,ax