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

cir2633 2009-09-23 09:12:54
我知道这是对某个端口进行读/写的操作,比如inp(0x60)是读0x60端口的数据并返回,

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

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

问题3:inp(0x60)中的0x60能理解为内存地址 ? inb()函数里的"端口"到底是硬件中的什么?
...全文
793 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cir2633 2009-10-10
  • 打赏
  • 举报
回复
关于inport()和outport()这两个函数, windows下如何使用 ?
kondykuang 2009-09-29
  • 打赏
  • 举报
回复
关于这几个直接端口操作的函数;有分别对应的8bit 16bit 32bit的版本。
这些函数不能直接在上层程序中使用,因为windows有保护机制,而必须放到驱动程序中去。
问题1: inp()每次只读一个字节? 还是若干位 ?

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

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

既然已经有了地址空间, 统一用地址空间就好了, 何必在再弄个什么端口, 还有i2c的地址, pci的地址啊, 看了就头晕
cir2633 2009-09-28
  • 打赏
  • 举报
回复
up, up
cir2633 2009-09-27
  • 打赏
  • 举报
回复
_asm mov dx,port
_asm mov ax,val
_asm out dx,ax

那么dx和ax是什么呢 ?
arong1234 2009-09-27
  • 打赏
  • 举报
回复
你被“实质”给误导了,当你理解“端口”时,实际不应该去从寄存器角度理解(它可以时寄存器,也可以不是),实际上它和网络端口的概念时类似的,都是“地址”
[Quote=引用 5 楼 cir2633 的回复:]
论坛没人,自问自答

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

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

[/Quote]
cir2633 2009-09-27
  • 打赏
  • 举报
回复
论坛没人,自问自答

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

port实际指的是寄存器地址, 次函数是向指定寄存器写数据的
举例, 比如我有一个isa板卡插在工控机上,此板卡设备的硬件地址(或者叫中断地址?)是0x310,
此板卡有16个寄存器, 那么0x310+N (N是0~f之间的数)就是板卡寄存器的地址,向板卡的相应寄存器写数据,就能让板卡实现相应的功能
outp(0x310+a,0x0)的意思就是向地址是310的设备的第10个寄存器写0
arong1234 2009-09-27
  • 打赏
  • 举报
回复
1. MSDN说的很清楚,inp返回字节
2. 你的输出一般不会直接返回给你的输入,所以不等于
3. 端口是分配给硬件的地址,而不是硬件的某个部分
[Quote=引用楼主 cir2633 的回复:]
我知道这是对某个端口进行读/写的操作,比如inp(0x60)是读0x60端口的数据并返回,

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

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

问题3:inp(0x60)中的0x60能理解为内存地址 ? inb()函数里的"端口"到底是硬件中的什么?
[/Quote]
thy38 2009-09-27
  • 打赏
  • 举报
回复
不会帮顶
cir2633 2009-09-27
  • 打赏
  • 举报
回复
void outp(unsigned short port,unsigned short val)
{
_asm mov dx,port
_asm mov ax,val
_asm out dx,ax
}
cir2633 2009-09-23
  • 打赏
  • 举报
回复
DDDDD

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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