问题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
}
{
_asm mov dx,port
_asm mov ax,val
_asm out dx,ax
}
#3
不会帮顶
#4
1. MSDN说的很清楚,inp返回字节
2. 你的输出一般不会直接返回给你的输入,所以不等于
3. 端口是分配给硬件的地址,而不是硬件的某个部分
2. 你的输出一般不会直接返回给你的输入,所以不等于
3. 端口是分配给硬件的地址,而不是硬件的某个部分
#5
论坛没人,自问自答
首先outp(port,val)的参数问题,这个在readme里解释的很囧,port解释的是端口,
其实这个端口不是很贴切的,新人看到一头雾水,弄不好还和网络上的端口搞混了
port实际指的是寄存器地址, 次函数是向指定寄存器写数据的
举例, 比如我有一个isa板卡插在工控机上,此板卡设备的硬件地址(或者叫中断地址?)是0x310,
此板卡有16个寄存器, 那么0x310+N (N是0~f之间的数)就是板卡寄存器的地址,向板卡的相应寄存器写数据,就能让板卡实现相应的功能
outp(0x310+a,0x0)的意思就是向地址是310的设备的第10个寄存器写0
首先outp(port,val)的参数问题,这个在readme里解释的很囧,port解释的是端口,
其实这个端口不是很贴切的,新人看到一头雾水,弄不好还和网络上的端口搞混了
port实际指的是寄存器地址, 次函数是向指定寄存器写数据的
举例, 比如我有一个isa板卡插在工控机上,此板卡设备的硬件地址(或者叫中断地址?)是0x310,
此板卡有16个寄存器, 那么0x310+N (N是0~f之间的数)就是板卡寄存器的地址,向板卡的相应寄存器写数据,就能让板卡实现相应的功能
outp(0x310+a,0x0)的意思就是向地址是310的设备的第10个寄存器写0
#6
你被“实质”给误导了,当你理解“端口”时,实际不应该去从寄存器角度理解(它可以时寄存器,也可以不是),实际上它和网络端口的概念时类似的,都是“地址”
#7
_asm mov dx,port
_asm mov ax,val
_asm out dx,ax
那么dx和ax是什么呢 ?
_asm mov ax,val
_asm out dx,ax
那么dx和ax是什么呢 ?
#8
up, up
#9
不理解的飘过
既然已经有了地址空间, 统一用地址空间就好了, 何必在再弄个什么端口, 还有i2c的地址, pci的地址啊, 看了就头晕
既然已经有了地址空间, 统一用地址空间就好了, 何必在再弄个什么端口, 还有i2c的地址, pci的地址啊, 看了就头晕
#10
这个寄存器你反而不认识了……
这是 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寄存器的操作,所以与内存没关系,端口对应的就都硬件中的寄存器,微机原理,单片机原理中有讲,关于端口操作的函数,可以在网上找找,基本都是对汇编的一个封装
这些函数不能直接在上层程序中使用,因为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
}
{
_asm mov dx,port
_asm mov ax,val
_asm out dx,ax
}
#3
不会帮顶
#4
1. MSDN说的很清楚,inp返回字节
2. 你的输出一般不会直接返回给你的输入,所以不等于
3. 端口是分配给硬件的地址,而不是硬件的某个部分
2. 你的输出一般不会直接返回给你的输入,所以不等于
3. 端口是分配给硬件的地址,而不是硬件的某个部分
#5
论坛没人,自问自答
首先outp(port,val)的参数问题,这个在readme里解释的很囧,port解释的是端口,
其实这个端口不是很贴切的,新人看到一头雾水,弄不好还和网络上的端口搞混了
port实际指的是寄存器地址, 次函数是向指定寄存器写数据的
举例, 比如我有一个isa板卡插在工控机上,此板卡设备的硬件地址(或者叫中断地址?)是0x310,
此板卡有16个寄存器, 那么0x310+N (N是0~f之间的数)就是板卡寄存器的地址,向板卡的相应寄存器写数据,就能让板卡实现相应的功能
outp(0x310+a,0x0)的意思就是向地址是310的设备的第10个寄存器写0
首先outp(port,val)的参数问题,这个在readme里解释的很囧,port解释的是端口,
其实这个端口不是很贴切的,新人看到一头雾水,弄不好还和网络上的端口搞混了
port实际指的是寄存器地址, 次函数是向指定寄存器写数据的
举例, 比如我有一个isa板卡插在工控机上,此板卡设备的硬件地址(或者叫中断地址?)是0x310,
此板卡有16个寄存器, 那么0x310+N (N是0~f之间的数)就是板卡寄存器的地址,向板卡的相应寄存器写数据,就能让板卡实现相应的功能
outp(0x310+a,0x0)的意思就是向地址是310的设备的第10个寄存器写0
#6
你被“实质”给误导了,当你理解“端口”时,实际不应该去从寄存器角度理解(它可以时寄存器,也可以不是),实际上它和网络端口的概念时类似的,都是“地址”
#7
_asm mov dx,port
_asm mov ax,val
_asm out dx,ax
那么dx和ax是什么呢 ?
_asm mov ax,val
_asm out dx,ax
那么dx和ax是什么呢 ?
#8
up, up
#9
不理解的飘过
既然已经有了地址空间, 统一用地址空间就好了, 何必在再弄个什么端口, 还有i2c的地址, pci的地址啊, 看了就头晕
既然已经有了地址空间, 统一用地址空间就好了, 何必在再弄个什么端口, 还有i2c的地址, pci的地址啊, 看了就头晕
#10
这个寄存器你反而不认识了……
这是 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寄存器的操作,所以与内存没关系,端口对应的就都硬件中的寄存器,微机原理,单片机原理中有讲,关于端口操作的函数,可以在网上找找,基本都是对汇编的一个封装
这些函数不能直接在上层程序中使用,因为windows有保护机制,而必须放到驱动程序中去。
问题1: inp()每次只读一个字节? 还是若干位 ?
这个有很多版本的,取决于汇编中 in指令 的操作长度。
问题2: 我先执行outb(ADDR,0FE);
然后执行result=inb(ADDR); 请问result是否等于
要看你addr端口外接是什么东西,如果外接是变化的,那么读进来会不等。
问题3:inp(0x60)中的0x60能理解为内存地址 ? inb()函数里的"端口"到底是硬件中的什么?
inp应该是对cpu寄存器的操作,所以与内存没关系,端口对应的就都硬件中的寄存器,微机原理,单片机原理中有讲,关于端口操作的函数,可以在网上找找,基本都是对汇编的一个封装
#12
关于inport()和outport()这两个函数, windows下如何使用 ?