兰陵月 发表于 2017-10-28 15:37:11

汇编语言中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:}

兰陵月 发表于 2017-10-28 15:53:28

@人造人 @~风介~ @康小泡 @fc1735 @不二如是 @liaoluo @zealstar @shuiyu @jun

兰陵月 发表于 2017-10-30 17:15:02

竟然没一个人鸟我{:10_266:}{:10_266:}

兰陵月 发表于 2017-10-31 10:21:11

今天还是没人?我自己都琢磨得差不多了。。。。。。。

xiaogu4117 发表于 2020-2-6 21:38:13

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

人造人 发表于 2020-2-6 22:59:42

我居然现在才看到这个问题

zwhe 发表于 2020-6-3 16:24:04

{:10_256:}
页: [1]
查看完整版本: 汇编语言中8位端口与16位端口的理解问题~~