问个outp(),inp()函数的问题

时间:2022-03-04 08:38:34
我知道这是对某个端口进行读/写的操作,比如inp(0x60)是读0x60端口的数据并返回,

问题1: inp()每次只读一个字节? 还是若干位 ?

问题2: 我先执行outb(ADDR,0FE);
         然后执行result=inb(ADDR); 请问result是否等于

问题3:inp(0x60)中的0x60能理解为内存地址 ? inb()函数里的"端口"到底是硬件中的什么?

12 个解决方案

#1


DDDDD

#2


void   outp(unsigned   short   port,unsigned   short   val)   
  {     
        _asm   mov   dx,port   
        _asm   mov   ax,val   
        _asm   out   dx,ax   
  }

#3


不会帮顶

#4


1. MSDN说的很清楚,inp返回字节
2. 你的输出一般不会直接返回给你的输入,所以不等于
3. 端口是分配给硬件的地址,而不是硬件的某个部分
引用楼主 cir2633 的回复:
我知道这是对某个端口进行读/写的操作,比如inp(0x60)是读0x60端口的数据并返回,

问题1: inp()每次只读一个字节? 还是若干位 ?

问题2: 我先执行outb(ADDR,0FE);
        然后执行result=inb(ADDR); 请问result是否等于

问题3:inp(0x60)中的0x60能理解为内存地址 ? inb()函数里的"端口"到底是硬件中的什么?

#5


论坛没人,自问自答

首先outp(port,val)的参数问题,这个在readme里解释的很囧,port解释的是端口,
其实这个端口不是很贴切的,新人看到一头雾水,弄不好还和网络上的端口搞混了

port实际指的是寄存器地址, 次函数是向指定寄存器写数据的
举例, 比如我有一个isa板卡插在工控机上,此板卡设备的硬件地址(或者叫中断地址?)是0x310,
此板卡有16个寄存器, 那么0x310+N (N是0~f之间的数)就是板卡寄存器的地址,向板卡的相应寄存器写数据,就能让板卡实现相应的功能
outp(0x310+a,0x0)的意思就是向地址是310的设备的第10个寄存器写0

#6


你被“实质”给误导了,当你理解“端口”时,实际不应该去从寄存器角度理解(它可以时寄存器,也可以不是),实际上它和网络端口的概念时类似的,都是“地址”
引用 5 楼 cir2633 的回复:
论坛没人,自问自答

首先outp(port,val)的参数问题,这个在readme里解释的很囧,port解释的是端口,
其实这个端口不是很贴切的,新人看到一头雾水,弄不好还和网络上的端口搞混了

port实际指的是寄存器地址, 次函数是向指定寄存器写数据的
举例, 比如我有一个isa板卡插在工控机上,此板卡设备的硬件地址(或者叫中断地址?)是0x310,
此板卡有16个寄存器, 那么0x310+N (N是0~f之间的数)就是板卡寄存器的地址,向板卡的相应寄存器写数据,就能让板卡实现相应的功能
outp(0x310+a,0x0)的意思就是向地址是310的设备的第10个寄存器写0

#7


        _asm  mov  dx,port  
        _asm  mov  ax,val  
        _asm  out  dx,ax  

那么dx和ax是什么呢 ?

#8


up, up

#9


不理解的飘过

既然已经有了地址空间, 统一用地址空间就好了, 何必在再弄个什么端口, 还有i2c的地址, pci的地址啊, 看了就头晕

#10


引用 7 楼 cir2633 的回复:
_asm  mov  dx,port
         _asm  mov  ax,val
         _asm  out  dx,ax

 那么dx和ax是什么呢 ?

这个寄存器你反而不认识了……
这是 x86 体系里的通用寄存器,共有 ax bx cx dx si di bp sp 八个。
另外,把端口理解得太“硬”了不好,在一般的设计中,只应该把它当作 CPU 与外部设备通信的一种途径。正如 arong 所说,“它可以是寄存器,也可以不是”。只要端口的行为符合硬件定义,也不必过于关心自己的数据写入端口后到底到了哪里。
另外,不要把端口简单地看成一个像内存一样的数据储存区,有些端口不一定同时可读写,有些虽然可以,但读出来的不一定还是你写进去的数据,一切由硬件定义。

#11


关于这几个直接端口操作的函数;有分别对应的8bit 16bit 32bit的版本。
这些函数不能直接在上层程序中使用,因为windows有保护机制,而必须放到驱动程序中去。
问题1: inp()每次只读一个字节? 还是若干位 ? 

   这个有很多版本的,取决于汇编中 in指令 的操作长度。
问题2: 我先执行outb(ADDR,0FE); 
        然后执行result=inb(ADDR); 请问result是否等于 
  要看你addr端口外接是什么东西,如果外接是变化的,那么读进来会不等。
问题3:inp(0x60)中的0x60能理解为内存地址 ? inb()函数里的"端口"到底是硬件中的什么?
    inp应该是对cpu寄存器的操作,所以与内存没关系,端口对应的就都硬件中的寄存器,微机原理,单片机原理中有讲,关于端口操作的函数,可以在网上找找,基本都是对汇编的一个封装

#12


关于inport()和outport()这两个函数, windows下如何使用 ?

#1


DDDDD

#2


void   outp(unsigned   short   port,unsigned   short   val)   
  {     
        _asm   mov   dx,port   
        _asm   mov   ax,val   
        _asm   out   dx,ax   
  }

#3


不会帮顶

#4


1. MSDN说的很清楚,inp返回字节
2. 你的输出一般不会直接返回给你的输入,所以不等于
3. 端口是分配给硬件的地址,而不是硬件的某个部分
引用楼主 cir2633 的回复:
我知道这是对某个端口进行读/写的操作,比如inp(0x60)是读0x60端口的数据并返回,

问题1: inp()每次只读一个字节? 还是若干位 ?

问题2: 我先执行outb(ADDR,0FE);
        然后执行result=inb(ADDR); 请问result是否等于

问题3:inp(0x60)中的0x60能理解为内存地址 ? inb()函数里的"端口"到底是硬件中的什么?

#5


论坛没人,自问自答

首先outp(port,val)的参数问题,这个在readme里解释的很囧,port解释的是端口,
其实这个端口不是很贴切的,新人看到一头雾水,弄不好还和网络上的端口搞混了

port实际指的是寄存器地址, 次函数是向指定寄存器写数据的
举例, 比如我有一个isa板卡插在工控机上,此板卡设备的硬件地址(或者叫中断地址?)是0x310,
此板卡有16个寄存器, 那么0x310+N (N是0~f之间的数)就是板卡寄存器的地址,向板卡的相应寄存器写数据,就能让板卡实现相应的功能
outp(0x310+a,0x0)的意思就是向地址是310的设备的第10个寄存器写0

#6


你被“实质”给误导了,当你理解“端口”时,实际不应该去从寄存器角度理解(它可以时寄存器,也可以不是),实际上它和网络端口的概念时类似的,都是“地址”
引用 5 楼 cir2633 的回复:
论坛没人,自问自答

首先outp(port,val)的参数问题,这个在readme里解释的很囧,port解释的是端口,
其实这个端口不是很贴切的,新人看到一头雾水,弄不好还和网络上的端口搞混了

port实际指的是寄存器地址, 次函数是向指定寄存器写数据的
举例, 比如我有一个isa板卡插在工控机上,此板卡设备的硬件地址(或者叫中断地址?)是0x310,
此板卡有16个寄存器, 那么0x310+N (N是0~f之间的数)就是板卡寄存器的地址,向板卡的相应寄存器写数据,就能让板卡实现相应的功能
outp(0x310+a,0x0)的意思就是向地址是310的设备的第10个寄存器写0

#7


        _asm  mov  dx,port  
        _asm  mov  ax,val  
        _asm  out  dx,ax  

那么dx和ax是什么呢 ?

#8


up, up

#9


不理解的飘过

既然已经有了地址空间, 统一用地址空间就好了, 何必在再弄个什么端口, 还有i2c的地址, pci的地址啊, 看了就头晕

#10


引用 7 楼 cir2633 的回复:
_asm  mov  dx,port
         _asm  mov  ax,val
         _asm  out  dx,ax

 那么dx和ax是什么呢 ?

这个寄存器你反而不认识了……
这是 x86 体系里的通用寄存器,共有 ax bx cx dx si di bp sp 八个。
另外,把端口理解得太“硬”了不好,在一般的设计中,只应该把它当作 CPU 与外部设备通信的一种途径。正如 arong 所说,“它可以是寄存器,也可以不是”。只要端口的行为符合硬件定义,也不必过于关心自己的数据写入端口后到底到了哪里。
另外,不要把端口简单地看成一个像内存一样的数据储存区,有些端口不一定同时可读写,有些虽然可以,但读出来的不一定还是你写进去的数据,一切由硬件定义。

#11


关于这几个直接端口操作的函数;有分别对应的8bit 16bit 32bit的版本。
这些函数不能直接在上层程序中使用,因为windows有保护机制,而必须放到驱动程序中去。
问题1: inp()每次只读一个字节? 还是若干位 ? 

   这个有很多版本的,取决于汇编中 in指令 的操作长度。
问题2: 我先执行outb(ADDR,0FE); 
        然后执行result=inb(ADDR); 请问result是否等于 
  要看你addr端口外接是什么东西,如果外接是变化的,那么读进来会不等。
问题3:inp(0x60)中的0x60能理解为内存地址 ? inb()函数里的"端口"到底是硬件中的什么?
    inp应该是对cpu寄存器的操作,所以与内存没关系,端口对应的就都硬件中的寄存器,微机原理,单片机原理中有讲,关于端口操作的函数,可以在网上找找,基本都是对汇编的一个封装

#12


关于inport()和outport()这两个函数, windows下如何使用 ?