重新发贴,关于端口读写,8位端口和16位端口

debugk 2008-09-03 09:32:09
王爽《汇编语言》第一版P255大黑字“注意”写到:“在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。访问8位端口时用al,访问16位端口时用ax。”
而在接下来的范例中,程序如下:
对256~65535的端口进行读写时,端口号放在dx中: 
mov dx,3f8h ;将端口号3f8h送入dx
in al,dx ;从3f8h端口读入一个字节
out dx,al ;向3f8h端口写入一个字节

似乎矛盾。

但有人说:3f8h是端口号,用十六位存放,但不能说明这个端口就是十六位的。

那么什么样的端口是8位的,什么样的端口又是16位的呢?

...全文
1109 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2008-09-04
  • 打赏
  • 举报
回复
I/O端口本来没有多少位这种说法,I/O端口就像一个内存单元一样,用地址总线来选择单元,用数据总线传输数据。前面已经说了,在PC系统中,端口地址是16位,数据是8位。端口地址就是端口号,是用16位二进制数表示的,在I/O指令中,小于等于255的端口号可以用8位立即数表示,省略高8位。
BAYNPU 2008-09-04
  • 打赏
  • 举报
回复
用十六位来存放3f8h的端口号,但不能说明这个端口就是十六位的,这话要搞清楚,否则很容易造成混淆。
alan001 2008-09-04
  • 打赏
  • 举报
回复
某种简单8086PC兼容情况下,是16位端口地址但8位数据线和8位数据
debugk 2008-09-03
  • 打赏
  • 举报
回复
谢谢BAYNPU和cnzdgs的回复。
还有个疑问
3f8h是端口号,用十六位存放,但不能说明这个端口就是十六位的。

这句话成立吗?
cnzdgs 2008-09-03
  • 打赏
  • 举报
回复
PC机的端口地址用16位二进制数表示,端口输入输出的数据都是8位的,在I/O指令中,端口号小于等于255时可以用8位立即数来指定端口号,超出8位(大于等于256)的端口号用dx指定,例如:
out 20H, al
out dx, al

此外,还有这样的指令:
out 20H, ax
这表示连续输出两个字节,al输出到20H端口,ah输出到21H端口;同样也可以用dx指定端口号,输出到dx和dx+1两个端口。因为外设经常使用连续的两个端口,前一个作为控制端口,后一个作为数据端口,一次操作通常需要先向控制端口输出控制字,然后向数据端口输出数据,所以才设计了这样的指令。这种时候可以把连续的两个端口看作一个16位端口(实际是有先后次序的)。
BAYNPU 2008-09-03
  • 打赏
  • 举报
回复
那么什么样的端口是8位的,什么样的端口又是16位的呢?
答:从00H--FFH是8位的端口,从0000---FFFFH是16位端口,另外输入输出指令可以理解为直接寻址。

21,495

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧