只需看10行程序就能拿100分!(汇编中bios调用的问题)(100分)

Q

qiuqiu

Unregistered / Unconfirmed
GUEST, unregistred user!
我用下面的程序从com1读入数据发现由edit1显示的数据不对且变化(我多次点击button1),然而
当把原汇编段程序专门取出在汇编环境下运行却读入数据正确且稳定。

procedure TForm1.Button1Click(Sender: TObject);
var
x:byte;

begin

asm
mov ah,0h //设置波特率=9600,无奇偶校验,1位停止位
mov al,11100011b
mov dx,0h
int 14h
@pol: mov ah,3 //查讯接收数据寄存器是否就绪
mov dx,0h
int 14h
and ah,00000001b
jz @pol

@start:
mov ah,2 //接收数据
mov dx,0h
int 14h
mov x,al
end;

edit1.Text:=inttostr(x);

end;
 
在虚拟86模式下, ring 3层上的应用程序是不可能事先知道中断处理例程
的入口的, 也就是说对com口处理中断并不一定是int 14h, 而且同一时刻
不同的应用程序之间中断向量表也不一定完全相同的. 这就是为什么在win32
环境下不能随便试用中断调用和直接端口操作的原因.
在v86模式下, 有一个称为IDT(Interrupt description table)和GDT
(Global description table), 还有一个是LDT(Local Description table)
综合这些东西才能唯一地确定虚拟机中的中断和real mode下的中断的对应关系.
但是即便知道对应关系, 要直接进行中断调用的化还是要费一番功夫获取ring 0
层的权限.
 
我赞成'Iknow'说法很深刻
为了程序的稳定用API
 
我很感谢你们的帮助,如此看来我还是换一种方法,
我查过一些资料,但很少找到有关Delphi中用WinAPI函数进行串口通讯的问题,
恳请指教,另外我不清楚是用WinAPI还是Delphi中的一些控件如spcom好。
 
使用WinAPI比较烦琐,需要了解SetupComm等大量的API函数(可以看Delphi中的
Win32 Help).目前封装好的控件包很多,使用十分方便.无所谓好坏,实质上如果
有控件原代码的话,看一看就知他们也是用WinAPI写成的.使用控件包吧.
 
我觉得接收不对的原因可能在于串口的连接方式,比如只用了三根线的连法,就易丢
东西,和用没用汇编关系不大。不过确实这样用不太好,只能在95里勉强用用,
正规的方法是用CreateFile打开串口,然后等待事件。其实,网上有很多串口控
间,下载一个用就行了,不过也不一定可靠,可能也会丢东西,要修补。
 
1、直接int本来就是不对的
2、还有一个问题(和错误无大关系),嵌入asm,修改了寄存器要恢复,push pop
 
使用WinAPI可以具体控制机器低层的配置,还是用WinAPI吧!
 
感谢各位,我已经该用SPCOMM控件了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
600
import
I
I
回复
0
查看
587
import
I
顶部