能力值:
( LV9,RANK:210 )
|
-
-
2 楼
怎么也没人理我啊~~~
|
能力值:
( LV9,RANK:210 )
|
-
-
3 楼
看来这个问题太简单了,高手都不愿意理会
网上也有一个很流行的并口驱动及源码(WinIO), 看了一下源码,它是利用 I/O许可位图 来实现的, 从而允许用户程序直接操作端口.
我想用另一种方式来实现, 在驱动程序中直接用out指令来操作端口,怎么就不行了
|
能力值:
(RANK:1060 )
|
-
-
4 楼
莫非是
mov al,55h
mov dx, 378h
out dx, al
|
能力值:
( LV9,RANK:210 )
|
-
-
5 楼
forgot大哥指点得太好了, 正是如此,谢谢,让小弟走出迷津.
其实我是从KmdKit那份教程中,控制扬声器例程中那样学的,其代码如下:
MakeBeep1 proc dwPitch:DWORD
cli
mov al, 10110110y
out 43h, al
mov eax, dwPitch
out 42h, al
mov al, ah
out 42h, al
; Turn speaker ON
in al, 61h
or al, 11y
out 61h, al
sti
DO_DELAY
cli
; Turn speaker OFF
in al, 61h
and al, 11111100y
out 61h, al
sti
ret
MakeBeep1 endp
它这里控制计算机端口地址就直接用的是数值,而不是用寄存器间接表示的.
而控制并口的地址却要用寄存器来间接寻址, 有点不解.(也许是此时地址已超过了8位,就要求用寄存器来表示了吧)
再次感谢forgot大哥!
|
能力值:
(RANK:1060 )
|
-
-
6 楼
不知道你用什么assembler,那个 byte ptr 貌似有些问题
|
能力值:
( LV9,RANK:210 )
|
-
-
7 楼
我用的是RadASM
我本来是想象MakeBeep程序那样: out 378h,al, 但编译通不过. 于是,我就加了一个byte ptr,这样编译就通过了,程序运行也没有异常, 结果还是这里出了问题
|
能力值:
(RANK:1060 )
|
-
-
8 楼
00401000 > CC int3
00401001 B0 55 mov al, 55
00401003 E6 71 out 71, al ; I/O command
看来是masm的bug,截断了这个word没有warnning
|
能力值:
( LV9,RANK:210 )
|
-
-
9 楼
原来如此,谢谢forgot大哥的耐心分析指点
我怎么就没查看一下反汇编代码呢?
|
|
|