[Intel汇编-MASM]端口通信

1. 那些不能被CPU统一编址的芯片:

    1) 可以被CPU统一编制的芯片都有一个共同的特点,那就是基本都是存储器(ROM、RAM、显存等)、其上的数据有且仅有CPU有权限读写、速度跟得上CPU,比如硬盘虽然也是存储器、也只能被CPU读写,但是速度太慢容量太大而无法被CPU统一编址到一个逻辑内存空间中;

    2) 很多外设(一些I/O设备)的芯片,其上的数据不仅可以被CPU修改,同时速度跟不上CPU,比如像网卡、键盘接口、鼠标接口等芯片,因此CPU不能将其统一编址;

    3) 但这些芯片都有一组可以由CPU读写的寄存器用来和CPU进行通信,并且这些寄存器和CPU通过总线相连,而这些寄存器就是所谓的端口了,而CPU可以对这些芯片的端口进行统一编址从而形成一个统一的端口地址空间;

    4) 端口地址空间概念上和内存地址空间相似,只不过内存地址空间可以看做一个较大的可供CPU读写的存储器,而端口地址空间可以看做一个较小(容量没内存那么大)可以和外设进行数据交换的缓冲区;

    5) 在PC系统中最多可以定位64KB个不同的端口,因此端口的地址范围为0~65535,因此端口号是一个16位值;


2. 使用in和out指令对端口进行读写:

    1) 和端口通信的数据只能用al和ax,8位数据用al,16位数据用ax,如果用其它寄存器会报错;

    2) in用于从端口读数据,使用格式是:in al/ax, 端口号

    3) out用于向端口写数据,使用格式时:out 端口号, al/ax

    4) 其中端口号只能用立即数或者dx表示(dx用于存放端口号,端口号毕竟是16位的嘛),并且如果用寄存器表示端口号就必须用dx,用其它的就会报错;


3. CMOS芯片简介:

    1) CMOS全称为CMOS RAM,即互补金属氧化物半导体随机存取器;

    2) 该芯片最大的特点是依靠电池独立供电,依靠该电源产生计算机运作的实时钟频率,因此关机后CMOS的RAM也能正常工作而不丢失数据;

    3) 最重要的功能就是记录当前时间信息和系统配置信息,BIOS就通过读取CMOS中的内容对硬件进行初始化的;

    4) CMOS的RAM供128字节,其中0H~DH这14个字节用来保存时钟信息,其余空间用于保存系统配置信息;

    5) 该芯片只有两个端口,在端口地址空间中的编号分别为70H和71H,这两个端口都只有1字节,前者用于存放要访问的单元的地址(CMOS RAM的单元地址),后者用于存放通信的数据;

    6) 时间信息的存放方式:

        i. 所有时间信息(年/月/日/时/分/秒)均以BCD码表示,其中对于每个数据,高4位表示十位,第4位表示个位,因此都只有1个字节大小;

        ii. 各时间数据的地址号:年(9)、月(8)、日(7)、时(4)、分(2)、秒(0),所有都用两位十进制数表示,其中年只保存两位,年份是从1970开始的,比如现在2014年,则年数据值保存14,不保存20;

        iii. 以获取月份数据为例:

             *1. 获取月份的BCD码:

mov		al, 8
out		70H, al ; 寻址单元存放要访问的单元地址8
in		al, 71H ; 从8号单元中获取月份数据的BCD码(8bit)
             *2. 将BCD码转化成二进制码:

mov		ah, al
mov		cl, 4
shr		ah, cl
and		al, 1111B
将十位和个位分离,十位保存在ah中,个位保存在al中

             *3. 将十位和个位转化成ASCII码(方便在屏幕上显示出数字):只要加30H即可

add		ah, 30H
add		al, 30H
    7) 示例:将当前时间也"年月日时分秒“的形式输出在终端

assume cs:code, ss:stacksg

stacksg segment
	db 30 dup(?)
stacksg ends

code segment
	db 'XXXXXXXXXX', '$$$$$'

start:
	mov		ax, seg stacksg
	mov		ss, ax
	mov		sp, 30

	mov		ax, seg code
	mov		ds, ax
	mov		bx, 0


	mov		cx, 2
	mov		dl, 9
lp1:
	mov		al, dl
	call	near ptr get_data
	call	near ptr set_number
	dec		dl
	loop	lp1

	mov		cx, 3
	mov		dl, 4
lp2:
	mov		al, dl
	call	near ptr get_data
	call	near ptr set_number
	sub		dl, 2
	loop	lp2

	mov		dx, 0
	mov		ah, 9
	int		21H
	
	mov		ax, 4C00H
	int		21H

get_data:
	out		70H, al
	in		al, 71H
	ret

set_number:
	push	cx

	mov		ch, al
	mov		cl, 4
	shr		ch, cl
	and		al, 1111B
	add		ch, 30H
	add		al, 30H
	mov		[bx], ch
	inc		bx
	mov		[bx], al
	inc		bx
	
	pop		cx
	ret

code ends

end start


你可能感兴趣的:(端口,masm,intel汇编)