汇编语言笔记14-端口
转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne
☞CPU直接读写数据的地方
- CPU内部的寄存器
-
内存单元
各种存储器都和CPU的地址线、数据线、控制线相连,CPU把它们当做内存,看作一个逻辑存储器(内存地址空间)。
-
端口
除了存储器外,和CPU的总线相连的还有下面3中芯片。
(1). 各种接口卡(如网卡、显卡)上的接口芯片,它们控制接口卡进行工作;
(2). 主板上的接口芯片,CPU通过它们对部分外设进行访问;
(3). 其他芯片,用来存储相关的系统信息,或者进行相关的输入输出处理。
这些芯片中,都有一组可以由CPU读写的寄存器,物理上处于不同的芯片中;但是从CPU的角度看,CPU对它们进行读写操作都是通过控制线向它们所在的芯片发出端口读写命令[CPU将这些寄存器当做端口,对它们进行统一编址,从而建立了一个统一的端口地址空间,每个端口在地址空间中都有一个地址]。
PS:寄存器的功能十分重要,CPU对存储器中的数据进行处理时,往往先把数据取到内部寄存器中,而后再作处理。外部寄存器是计算机中其它一些部件上用于暂存数据的寄存器,它与CPU之间通过"端口"交换数据,外部寄存器具有寄存器和内存储器双重特点。有些时候我们常把外部寄存器就称为"端口",这种说法不太严格,但经常这样说。
☞端口的读写
-
端口的读写和内存的读写很像。如下图:
-
PC系统中,CPU最多可以定位64KB个不同的端口。端口地址的范围为0~65536。
(1). in和out指令中,只能使用ax或者al来存放从端口中读入的数据或者要发送给端口中的数据;
(2). 对于256~65536的端口号需要放在dx中。
端口号 |
读 |
写 |
0~255 |
in al, 20h ; 从20h端口读入一个字节 |
out 20h, al ; 往20h端口写入一个字节 |
256~65536 |
mov dx, 3f8h in al, dx ; 从3f8h端口读入一个字节 |
mov dx, 3f8h |
☞shl和shr指令
指令 |
实现功能 |
示例1(移动1位) |
示例2(移动n位) |
逻辑左移: shl |
(1). 将一个寄存器或者内存单元中的数据向左移位; (2). 将最后移出的一位写入CF中; (3). 最低位用0补充. |
mov al, 01001000b shl al, 1 |
mov al, 01001000b mov cl, 3 shl al, cl ;(必须放在cl中) |
逻辑右移: shr |
(1). 将一个寄存器或者内存单元中的数据向右移位; (2). 将最后移出的一位写入CF中; (3). 最高位用0补充. |
mov al, 01001001b shr al, 1 |
mov al, 01001000b mov cl, 3 shr al, cl ;(必须放在cl中) |
☞CMOS RAM芯片的操作
PC机上,微机主板上有一块可读写的RAM芯片,来保存当前系统的硬件配置和用户对某些参数的设定。该芯片靠电池供电,关机后内部的实时钟仍可以正常工作。
现在的厂商把BIOS程序做到了CMOS芯片中,当开机时就可按特定键进入CMOS设置程序对系统进行设置。所以又被人们叫做BIOS设置。
CMOS RAM芯片上还包含一个实时钟,该芯片内部有两个端口,端口地址为70h和71h。CPU通过这两个端口读写CMOS RAM。
70h位地址端口,存放要访问的CMOS RAM单元的地址,71h为数据端口,存放从选定的CMOS RAM单元中读取的数据,或者要写入到其中的数据。
Programming:在屏幕中间显示当前的月份。
1 assume cs:code 2 code segment 3 start: 4 mov al, 8 5 out 70h, al 6 in al, 71h 7 8 mov ah, al 9 mov cl, 4 10 shr ah, cl ; ah中为月份的十位数码值 11 and al, 00001111b ; al中为月份的个位数码值 12 13 add ah, 30h ; 对应的ASCII码 14 add al, 30h 15 16 mov bx, 0b800h 17 mov es, bx 18 mov byte ptr es:[160*12+40*2], ah ; 显示月份的十位数码 19 mov byte ptr es:[160*12+40*2+2], al ; 显示月份的个位数码 20 21 mov ax, 4c00h 22 int 21h 23 24 code ends 25 26 end