如何读取寄存器中的数据?

天空的云彩 2001-12-19 04:04:42
VB中:
Private Declare Sub out_byte Lib "vbdll.dll" (ByVal port%, ByVal da%) '写一个byte
Private Declare Function in_byte Lib "vbdll.dll" (ByVal port%) As Integer '读一个byte

Function ad2118(channel As Integer) As Integer
Dim h, m, l, da As Integer
out_byte baseadd, channel
delay (100)
out_byte baseadd + 1, 1
delay (500)
h = in_byte(baseadd + 2)
delay (50)
l = Int(in_byte(baseadd + 3) / 16)
da = h * 16 + l
ad2118 = da
End Function


DELPHI中:
procedure out_byte(port,dat:integer);external 'vbdll.dll';
function in_byte(port:integer):integer;external 'vbdll.dll';

Function ad2118(channel:Integer):integer;
var h,l,da:integer;
begin
out_byte(baseadd, channel);
sleep(100);
out_byte(baseadd+1, 1);
sleep(500);
h:= in_byte(baseadd + 2); //高位
sleep(50);
l:= trunc(in_byte(baseadd+3)/16); //低位
da:= h*16 +l ;
ad2118:= da ;
end;

这是两段程序,其中BASEADD为常量=H100;该程序在VB中运行正常,但在DELPHI中函数AD2118无法返回值;我想问题应该在DA:=H*16+L行,但该如何纠正却不知道。我试过,H的值是从寄存器EAX中取得的,而L的值是从寄存器EBX中取得的,若要从这两个寄存器中取出H,L值,该怎么取呢?
...全文
2274 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhc_2000 2001-12-21
  • 打赏
  • 举报
回复
关注
风轻狂 2001-12-21
  • 打赏
  • 举报
回复
问题可能出在Sleep上,Sleep 和delay不一样,
Sleep执行时系统不在处理其它事务,也就是说它是同步的,
而看你VB的代码这好象是个异步的系统,
使用下面的函数代替Sleep试试

procedure Delay(const uDelay:dword);
var
n:dword;
begin
n:=GetTickCount;
while ((GetTickCount-n)<=uDelay) do
application.ProcessMessages;
end;
天空的云彩 2001-12-21
  • 打赏
  • 举报
回复
out_byte,in_byte 函数内部是如何写的我也不清楚,我只是调用它来获取一个值,通过调试我发现该值存在于EAX,EBX中,但不知道如何取出。
天空的云彩 2001-12-21
  • 打赏
  • 举报
回复
对于狂风的说法,我试试看。
xzjxu 2001-12-20
  • 打赏
  • 举报
回复
问题没有说清楚。
什么时候的eax,ebx的值?
out_byte,in_byte 函数是什么样子的?
天空的云彩 2001-12-20
  • 打赏
  • 举报
回复
快来看看,帮帮忙!

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧