究竟如何在delphi嵌入式汇编中调用中断(100分)

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

liangliang

Unregistered / Unconfirmed
GUEST, unregistred user!
本人在使用delhpi嵌入式汇编编程时遇到这样一个奇怪的问题:
即delphi一编译到中断向量调用时(似乎int 3h 除外),就会出现蓝屏,
提示非法操作其它汇编语句倒能通过.不知是否我调用方法有误,我
将主要代码贴上,望各位高手指教。
另外早期在turbopascal中可用intr,msdos等函数调用中断,为何delphi
中找不相关函数?
program init;
{$APPTYPE CONSOLE}
procedure initwrite;assembler;
asm
mov ax,0201h
mov bx,0200h
mov cx,0001h
mov dx,0080h
int 13h //之前正常,一到这就会出蓝屏
mov ax,0301h
mov bx,0200h
mov cx,000dh
mov dx,0080h
int 13h
end;

...
begin
...
initwrite;
...
end.
 
int13h是直接操作硬盘的吧,好像windows不允许这样做的.直接读写端口倒还可以.
 
Windows不能这么简单的调用中断。
 
int 13是直接操作硬盘,事实上本程序的目的是读出硬盘主引导记录,然后写入硬盘
隐藏的第13扇区.但它是否于直接操作硬盘无关,因为我试过其它调用(如int 21h),
同样出现蓝屏。而delphi帮助文件中明明白白写着支持嵌入式汇编的int调用,我想还是调用方法有误。Hexi说'Windows不能这么简单的调用中断。',能否说得具体些?
 
Delphi中还有Interrupt保留字,但实际上在Windows 32bit中已经给屏蔽了。
Delphi中在Windows 32bit不允许用户直接进行磁盘操作,除非你调用VxD来实现。
如果你想在windows 9x中写引导扇区的话,你可以用Turbo Pascal做一个Dos程序。
但这样也不能直接写引导区,不过我发现windows 9x的一个漏洞(可能是吧),在
Win.InI文件的[windows]中添加
run=C:/WritBoot.exe
这样可以写引导区,但是它只能在Windows9x启动的时候运行。
不知你为何要在Windows中写引导区,做硬盘保护程序?
如果你要写引导区在Autoexec
若是因为在启动windows前写了引导区导致windows不能启动(比如防软盘启动功能也会使windows 启动不了。)
那就用我的方法吧。
 
其实我一开始就是用turbo pascal编译过这段程序,不过也好不到那里去,用单步调试中断
调用倒是全部通过,可最后一关竟然卡在程序的退出,即过了end.
后死机。不过后来发现只要在程序最后加上如下代码就能顺利退出:
asm
mov ax,4c00h
int 21h
end;
也就是调用中断让程序退出。
至于在windows中用delphi调用中断,似乎中断对windows来说根本就是一个禁区,无论什么
中断必定蓝屏。
不知哪位大吓还能指点一二?
 
援引原话“另外早期在turbopascal中可用intr,msdos等函数调用中断,为何delphi
中找不相关函数?”
这就是Dos与Windows系统的区别!
Dos下用户是Dos的一个任务,Dos将所有资源都分配给用户使用,所以你可用象TP6.0
那样访问系统的中断。
而Windows下,用户是Windows的一个任务,你的任务需要哪些资源,Windows就分配
哪些资源,而且若要访问系统内核,则要通过Windows的允许,不允许就容易出错,
就象你说的那样“蓝屏”。
解决的办法,TP6.0有Register关键词,不知Delphi有否?!用它调用汇编程序。
 
Jams说访问系统内核就不行,可我前面说了,无论是否访问系统内核,只要调用中断
就会出现蓝屏(如查看CF位),这又是为什么?(help文件里可是明明白白写着支持int
调用的啊。
另外,
补充一点,win32里是可以直接操作硬盘的(包括主引导记录),因为该程序我同样在win98中
用debug编译过,而且调试成功,可以安全的运行在win98中,用debug分析硬盘确实已读出
主引导记录,并写入第13扇区。为什么delphi作就不行呢。唉,delphi在win32里到底能
不能调用中断,如果不能可真是它的一大遗憾。
不知有谁能解释得清楚其中的玄机,我将在原有100分的基础上再双手奉上100分,
决不食言。
 
在windows 9x中写引导区是无效的。但可以读。其他扇区需要先Lock才能写。
 
除非你用得是delphi 1.0 + Win3.1 ,否则调用中断肯定不可行.我当年转入win95系统后就只好自己写vxd了,不过假如你对中断实时性要求不高,取下载一个控件也可以.
好像叫 TVichW32
 
不管使用vc还是delphi,windows98系统都不允许用户程序调用中断,
有一个办法是修改IDT,使你的程序进入系统零层(Ring0),然后才可以
调用中断,具体编写方法参见如下文章:在本页左下方的问题检索中打入cih
可以检索到相关文章(不过是用vc写的,如果需要delphi的程序,请写信给我
:xpmao@china.com).
祝你好运!
 
我也研究过,可就不行,期待着,好像WINDOWS对磁盘时,必须先用UNLOCK这个
命令解锁,大家可以试试
 
// unlock这个命令,我经常一用就死机的
我觉得windows下有些中断还是可以直接使用的,只是如int 13需要直接存取硬盘等一些才
不行,这可以通过写vxd,将程序权限从ring 3修改到ring 0等一些方法来实现
 
VxD也不是办法呵,遇到NT怎么办?
 
agree with xpmao,你可以去丁凯的主页上看看,有一些这方面的资料.
 
嵌入汇编在Win98/NT/2000中有问题,速度也未必提高
 

Similar threads

I
回复
0
查看
711
import
I
I
回复
0
查看
647
import
I
I
回复
0
查看
649
import
I
I
回复
0
查看
670
import
I
后退
顶部