汇编语句 [les di, COUNT] 的调试(50分)

  • 主题发起人 主题发起人 gaodu2002
  • 开始时间 开始时间
G

gaodu2002

Unregistered / Unconfirmed
GUEST, unregistred user!
在DELPHI6、WINXP环境下,编译 [les di, COUNT] 时出现如下错误:

Invalid combination of opcode and operands
操作码与操作对象的无效组合

该如何解决呢?

代码如下:
Function IsCDROM(Drv : Char):BOOLEAN;
Var
CDR : string;
cnt : byte;
Count,First : word;
begin
Result := false;
CDR := '';
asm
mov ax, 1500h
xor bx, bx
int $2f //CDROM中断
les di, COUNT
mov es:[di], bx
les di, FIRST
mov es:[di], cx
end;
if Count > 0 then
for cnt := 0 to (Count-1) do
CDR := CDR + char(First + Byte('A') + cnt);
Result := (Pos(upcase(Drv),CDR) > 0);
end;

来自:http://www.delphibbs.com/delphibbs/dispq.asp?lid=132182
 
有没有能替代 [les di, COUNT] 的语句?
 
你这个代码也许只能在98下用....
 
白河愁:
这样的话,那编译成DLL后,能不能在XP下使用呢?
有没有在XP下解决的方法?
 
除非用delphi 1.0编译成16位dll,否则是不可以的。
你的这个程序是向监测光驱?
 
不是,是想看能不能分辨出光驱是虚拟的还是物理的
 
就凭这个应该是做不到的,不然也不会出什么star force了。
 
只这个我想也不可能,只是想看通过后能不能得到一点有用的信息
 
那就用delphi 1.0编译吧。
 
你有没有其它方法或建议来区分物理光驱及虚拟光驱的?
1.0的版本倒是有,回头测试一下看看
 
基本上没有什么简单的好办法。start force就是通过增加系统驱动来实现的。
 
我再找一下其它资料,看有没有什么办法
谢谢
 
没记错的话WIN32环境下,L3不能调用中断。所以你的代码应该运行不了
 
晕,你们懂不懂汇编哟,
les di, COUNT
你的变量Count是Word,宽度与di不匹配

你改成
les di,dword ptr COUNT 或
les di,word ptr COUNT 或
les di,byte ptr COUNT
 
不知楼上的有几懂汇编,WROD的宽度在DELPHI的帮助文件说了
Word 0..65535 unsigned 16-bit
WORD的宽度是16位,di也是16位寄存器,何来不匹配?

还有DELPHI的内嵌汇编使用DELPHI的变量时无需加宽度前辍,因为在变量定义的时候已经表明该变量的宽度。
所以les di, COUNT
这句没有错!
 
NT内核不允许ring3使用int $2f
 
我记得在一本 Windows下delphi核心编程里就说了,
内嵌汇编有时要加 Word ptr (DWORD PTR) 来引用变量

况且 DI 是 DWORD 型的,如果你不改下面的 DWORD PTR ,你就把定义变量改成
Count,First : Dword;
也可以编译通过

//经测试,在XP下delphi7环境编译通过
//至于运行没试过,XP下支不支持 int $2f 也没试过

Function IsCDROM(Drv : Char):BOOLEAN;
Var
CDR : string;
cnt : byte;
Count,First : word;
begin
Result := false;
CDR := '';
asm
mov ax, 1500h
xor bx, bx
int $2f //CDROM中断
les di, DWORD ptr COUNT //这是修改了的
mov es:[di], bx
les di, DWORD ptr FIRST //这是修改了的
mov es:[di], cx
end;
if Count > 0 then
for cnt := 0 to (Count-1) do
CDR := CDR + char(First + Byte('A') + cnt);
Result := (Pos(upcase(Drv),CDR) > 0);
end;

如果你只需要知道哪个是光驱,在这里查查,有详细介绍(不需要汇编)
http://www.vckbase.com/bbs/prime/viewprime.asp?id=388
 
谢谢各位的热心帮助,按lqcros说的修改后,测试通过!谢谢!
 
后退
顶部