汇编语言中8位端口与16位端口的理解问题~~
本帖最后由 兰陵月 于 2017-10-28 15:50 编辑汇编语言中8位端口与16位端口的理解问题~~
王爽《汇编语言》(第3版)第14章 端口 P266页
……
在in和out指令中,只能使用ax或al来存放从端口读入的数据或要发送到端口中的数据。访问8位端口时用al,访问16位端口时用ax。
对0~255以内的端口进行读写时:
in al,20h ;从20h端口读入一个字节
in 20h,al ;往20h端口写入一个字节
对256~65535的端口进行读写时,端口号放在dx中:
mov dx,3f8h ;将端口号3f8h送入dx
in al,dx ;从3f8h端口读入一个字节
out dx,al ;向3f8h端口写入一个字节
……
上面有几个问题没有弄清,脑袋已经被弄糊涂了。有关“8位端口与16位端口的区别”相关说法。
说法1:搜索百度时,有的人说8位端口就是编号0~255以内的端口,16位端口就是编号256~65535的端口。我想这是从端口地址的编号位数来说的8位和16位端口。但是实际上会是这么简单吗?如果仅仅是从地址编号位数来区别某个端口是8位端口还是16位端口,这似乎显得太儿戏,而且实际意义也不大。但我也不能肯定这个说法正确与否,或许这个东西本来意义就是这个,只是我想的太复杂?!
说法2:有的人说,I/O端口本来没有多少位这个说法,I/O端口就像一个内存单元一样,用地址总线来选择单元,用数据总线传输数据。前面已经说了,在PC系统中,端口地址是16位,数据是8位。端口地址就是端口号,是用16位二进制数表示的,在I/O指令中,小于等于255的端口号可以用8位立即数表示,省略高8位。
说法3:还有人说,用十六位来存放3f8h的端口号,但不能说明这个端口就是十六位的,这话要搞清楚,否则很容易造成混淆。
说法4:
有一个百度问答内容:
问:I/O端口的位宽是指什么?比如8位的端口和16位的端口的区别是什么?
答:I/O端口的位宽是指I/O端口一次能传递的数据宽度
8位的端口一次能传输1字节
16位的端口一次能传输2字节
我的理解: “访问8位端口时用al,访问16位端口时用ax。”,既然有这句话,同时还有 “只能使用ax或al来存放从端口读入的数据或要发送到端口中的数据”这句话,那是不是也就代表从某端口读来的(或往某端口写入的)数据有8位和16位之分。也就是说这个端口是8位端口还是16位端口,不是从端口编号来说的,而是从端口存放的数据(或者说叫寄存器?)来说的?
请各位解惑~~~~~~
同时还有如下的例子解释,这些解释,又与我上面的理解不同
IN AL,21H;表示从21H端口读取一字节数据到AL
IN AX,21H;表示从端口地址21H读取1字节数据到AL,从端口地址22H读取1字节到AH
MOV DX,379H
IN AL,DX ;从端口379H读取1字节到AL
OUT 21H,AL;将AL的值写入21H端口
OUT 21H,AX;将AX的值写入端口地址21H开始的连续两个字节。(port=AL,port=AH)
MOV DX,378H
OUT DX,AX ;将AH和AL分别写入端口379H和378H
两行的红色例子解释,似乎又在表明,每次读取或者写入的都是一个字节(8位),不存在一个读取或者写入两个字节(16位)的情况
貌似又反证明了8位端口就是编号地址0~255的端口,16位端口就是编号地址256~65535的端口,
证明了8位和16位的区别其实就是编号地址长度的区别这么简单而已
实在是搞糊涂了~~~~~~~~~~
{:10_247:} {:10_247:} {:10_247:} {:10_247:} {:10_247:} {:10_247:} {:10_247:} {:10_247:} {:10_247:} {:10_247:}
@人造人 @~风介~ @康小泡 @fc1735 @不二如是 @liaoluo @zealstar @shuiyu @jun 竟然没一个人鸟我{:10_266:}{:10_266:} 今天还是没人?我自己都琢磨得差不多了。。。。。。。 mov dx,3f8h ;将端口号3f8h送入dx
in al,dx ;从3f8h端口读入一个字节
out dx,al ;向3f8h端口写入一个字节
为什么不是
mov dx,3f8h ;将端口号3f8h送入dx
in ax,dx
out dx,ax ;就是ax和al 我居然现在才看到这个问题
{:10_256:}
页:
[1]