在Win2000下用delphi嵌入汇编语言进行I/O操作 ( 积分: 100 )

  • 主题发起人 主题发起人 lik765
  • 开始时间 开始时间
L

lik765

Unregistered / Unconfirmed
GUEST, unregistred user!
在Win2000下用delphi嵌入汇编语言进行I/O操作,运行时出错,此程序在WIN98下运行正常,代码如下:
addr:=$300;
function AD(pot:byte):word;
var ddh:byte;
begin
asm
mov dx,addr
mov al,pot
out dx,al
mov dx,addr+1
mov al,0
out dx,al
end;
repeat
asm
mov dx,addr+3
in al,dx
mov ddh,al
end;
until (ddh and $80)=$0;
asm
mov dx,addr+2
in ax,dx
and ax,0fffh
mov result,ax
end;
end;
 
在Win2000下用delphi嵌入汇编语言进行I/O操作,运行时出错,此程序在WIN98下运行正常,代码如下:
addr:=$300;
function AD(pot:byte):word;
var ddh:byte;
begin
asm
mov dx,addr
mov al,pot
out dx,al
mov dx,addr+1
mov al,0
out dx,al
end;
repeat
asm
mov dx,addr+3
in al,dx
mov ddh,al
end;
until (ddh and $80)=$0;
asm
mov dx,addr+2
in ax,dx
and ax,0fffh
mov result,ax
end;
end;
 
出什么错?
贴错误 信息上来
 
老兄,NT内核要先得到保护模式才能进行IO操作的,网络上有很多进入内核模式的文章,你自己找一下,我机子不知放哪里了
 
晕,如果NT内核的那么容易就让你进行I/O操作,那它还叫New Technology吗?
 
你的问题挺有意思,在2000下使用的是线性的虚拟内存空间,而DELPHI默认的起始地址是$40000(好像是),$300在此98下可以直接访问,而在2000下由于是保护模式,并不能直接访问物理内存,可以直接访问的是进程的线性虚拟内存空间,而$300小于DELPHI的默认装载地址,所以会出错.

写了这么多也不知道说明白了没.
 
楼上的更有意思
程序的装载地址和可访问的IO地址有什么关系?
不懂就不要出来卖弄
$40000 是对的
WIN2K是 在管态下执行应用程序的
如果执行了特权指令 象IN OUT 之类的 它当然会报错
应用程序要访问这些地址 必须要通过FILE之类的管道设备
经过相应VXD或者WDM来访问才行
除非你自己来写这个 象CIH病毒一样 才能直接 IO
 
哦,我是在卖弄,不过好象我开发过驱动,是什么时候呢,2000年还是...忘了,好像96年我就开始在编程序了,我是就程序论程序,看看把我说的限定在他的代码中,我是否有说错误,不要那么激动,不过好像以前我也那样,哎...
 
关于装载地址,你可以试验一下,在装载地址以下的地址你可以访问吗?
 
访问指令和IO指令是两回事
内存访问指令是MOV 之类的内存操作
如果你要越界访问 当然会报出AV错误
或者你要把数据MOV入代码段 也会报这个错
IO指令是 IN OUT 之类的特权指令
如果不是在管态执行 是根本没用的
我不明白楼上既然这么早就写程序 居然不明白这个道理
还是我弄错了???
 
你说的没有错,其实我是只看了addr:=$300就回了,我所回的也是基于此,这是我的错误,不过大家既然是讨论技术,言语上不要那么激烈,你说是吧.
 
其实这个大富翁论坛早年有很多高水平的软件人员,大家不一定很了解,所以如果涉及到个人的能力时,最好三思而后行.当然我是一个非常普通的程序员.
 
:)
其实我觉得大家讨论本来是个好事情
但本人觉得 回复 应该要认真一些
因为容易产生误导 而浪费了时间
不光是发贴人的时间
也有回复人的时间
所以慎重为上...
如果有何得罪之处 请表见怪
 
哈,我看还是直接用汇编语言写个驱动吧,当然要在特权模式下。[:D]
 
两句话:
“不能没有你” 说的还算正确!
“appfirst” 概念上一塌糊涂,其他方面嘛...咳!!
 
基本上要进入Ring0权限级别才能访问IO特权指令.
同意'不能没有你'.
 
非常感谢'不能没有你',有批评才有进步,如果有机会可以交个朋友.[:)]
 
后退
顶部