重点掌握
(1)IO端口的含义
(2)IO端口的读写控制
1 端口介绍
计算机的端口,或者说这里指的是IO端口,并非计算机通信的端口。
**1.1 什么是I/O端口? CPU使用什么指令与外设进行数据交换? **
答:CPU与I/O设备通过硬件接口或控制器相连接,这些接口或控制器都有数量不等的端口,这些端口有统一的地址编码,CPU通过这些端口使用输入输出指令IN、OUT与外设进行数据交换。( 来自:关于IO端口和编址方式的知识)
1.2 CPU为什么不能用MOV指令进行I/O数据传输?
答:在80x86微机系统中,I/O端口编址在一个独立的地址空间中,它和存储器是完全分离的。因此,对于存储器的存取操作使用MOV指令,而与端口进行信息交换的操作使用专门的I/O指令,二者不能混淆。( 来自:关于IO端口和编址方式的知识)
1.3 IO的编址方式
统一编制和独立编址并不是影响了真正的空间大小。
他们在于影响了,可以编址的空间大小。编址空间是由地址线的条数决定的。
然而,真正的物理空间的大小,是存储体决定的。
影响我们内存的使用,既包括地址线的个数,也包括真正的存储体大小。
如果你对IO端口的编址方式感兴趣的话,可以参看这篇文章:统一编址和独立编址
2 实验相关知识点
- in和out只能用ax或者al来存放从端口读(写)的数据
- out是写指令。给地址端口写入地址
- in为读指令。 方向是相对与cpu
- 当shr(l),移动不止一位的时候,移动位数必须放在cl中
- BCD码 + 30h = 十进制对应的ASCII码
3 实验
编程,以“年/月/日 时:分:秒”的格式,显示时间。
;--------------------------------------------------
;编程,以年/月/日 时:分:秒 的格式显示当前的时间
; dacao 2019/5/3
;--------------------------------------------------
assume cs:code
data segment
port: db 0,2,4,7,8,9
part: db "// :: " ;这里用了两个空格表示转义???(如果愿意的话,可以仔细调试一下。)
data ends
code segment
start:mov ax,data
mov ds,ax
mov si,offset port ;ds:si指向不同的端口
mov bx,offset part ;ds:bx指向不同的间隔符号
mov ax,0b800h
mov es,ax
mov di,160*12+40*2 ;es:di指向显存
mov cx,6
show_date:
push cx
mov al,ds:[si] ;in和out只能用ax或者al来存放从端口读(写)的数据
out 70h,al ;out是写指令。给地址端口写入地址
in al,71h ;in为读指令。 方向是相对与cpu
mov ah,al
mov cl,4 ;当shl(r),移动不止一位的时候,移动位数必须放在cl中
shl ah,cl ;前四位BCD码,存在ah中
add ah,30h ;BCD码 + 30h = 十进制对应的ASCII码
and al,00001111b
add al,30h
mov byte ptr es:[di],ah
mov byte ptr es:[di+2],al
;mov byte ptr es:[di+4],ds:[bx] ;逻辑和下面5行等价
push si
mov si,bx
mov al,ds:[si]
mov byte ptr es:[di+4],al
pop si
inc si ;下一个端口
inc bx ;下一个分隔符
add di,6
pop cx
loop show_date
mov ax,4c00h
int 21h
code ends
end start
参考文章
关于I/O端口和编址方式的知识
计算机的I/O端口地址表
I/O端口编址方式:统一编址和独立编址
[转载]汇编 shl和shr指令的使用