CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

那位高手替我看看,这段代码啥意思的?在线等!

楼主soniconan(Delphi)2003-12-03 19:47:25 在 Delphi / VCL组件开发及应用 提问

Function   LyInit:Boolean;Stdcall;  
  Var  
      CardExist:Byte;  
  Begin  
      Asm  
          Mov     dx,$21B  
          Mov     al,$0C0  
          Out     dx,al  
          Dec     dx  
          Mov     al,$0F  
          Out     dx,al  
          Mov     al,0  
          Out     dx,al  
          In       Al,Dx  
          Cmp     Al,$ff  
          Jnz     @Exists  
          Jmp     @NoExists  
      @Exists:  
          Mov     CardExist,1  
          Jmp     @Exit  
      @NoExists:  
          Mov     CardExist,0  
      @Exit:  
      end;  
      if   CardExist=0   Then     //变量CardExist=0那函数LyInit=false,否则函数=true  
      Begin  
          Result:=False;  
          commInited:=False;  
      End  
      Else  
      Begin  
          Result:=True;  
          commInited:=True;  
      End;  
  End;  
   
  Function   LyCardSendData:Byte;  
  Const  
      WaitTime=600;  
  Var  
      SendResult:Byte;  
      OverTime:DWord;  
  Begin  
      if   Not   commInited   Then  
      Begin  
          Result:=0;  
          Exit;  
      End;  
      Asm  
          Push     ESi  
          Push     EBx  
          Push     EDx  
          Push     EAx  
          Push     ECx  
          Call     timeGetTime  
          Mov       OverTime,EAx  
          Add       OverTime,WaitTime  
          Mov       ESi,Offset   SendBuff  
      @BeginSend:  
          Mov       Cx,0  
          Mov       Bx,0  
          Mov       Ah,55  
          Jmp       @CanSend  
      @OverTime0:  
          Call     timeGetTime  
          Cmp       OverTime,EAx  
          Jnl       @CanSend  
          Mov       Al,0  
          Jmp       @ErrorExit  
      @CanSend:  
          Mov       Dx,$21a  
          In         Al,Dx  
          And       Al,$20  
          Jz         @OverTime0  
          Jmp       @CheckError  
      @ErrorProc:  
          Call     timeGetTime  
          Cmp       OverTime,EAx  
          Jnl       @CanSend  
          Mov       Al,0  
          Jmp       @ErrorExit  
      @CheckError:  
          Mov       Dx,$21c  
          In         Al,Dx  
          Cmp       Al,$aa  
          Jz         @ErrorExit  
          Cmp       Al,$cc  
          Jz         @ErrorExit  
          Cmp       Al,$11  
          Jnz       @ErrorProc  
          Mov       Cx,$18  
          Mov       Bx,0  
          Jmp       @SendData  
      @OverTime1:  
          Call     timeGetTime  
          Cmp       OverTime,EAx  
          Jnl       @SendData  
          Mov       Al,0  
          Jmp       @ErrorExit  
      @SendData:  
          Mov       Dx,$21a  
          In         Al,Dx  
          And       Al,$80  
          Jz         @OverTime1  
          Mov       Al,Byte   Ptr   [ESi]  
          Mov       Dx,$21c  
          Out       Dx,Al  
   
          Inc       ESi  
          Dec       Cl  
          Jnz       @SendData  
          Jmp       @CheckSendStatus  
      @OverTime2:  
          Call     timeGetTime  
          Cmp       OverTime,EAx  
          Jnl       @CheckSendStatus  
          Mov       Al,0  
          Jmp       @ErrorExit  
      @CheckSendStatus:  
          Mov       Dx,$21a  
          In         Al,Dx  
          And       Al,$20  
          Jz         @OverTime2  
   
          Mov       Dx,$21c  
          In         Al,Dx  
          Cmp       Al,$13  
          Jnz       @BeginSend  
      @ErrorExit:  
          Mov       SendResult,Al  
          Pop       ECx  
          Pop       EAx  
          Pop       EDx  
          Pop       EBx  
          Pop       ESi  
      End;  
      Result:=SendResult;  
  End;  
   
  Function   lySendGoCommand(ScreenAddress,Command_Count,Change,InMode,InTime,  
                                                    InAni,Extend,Extend_Delay,Extend_Time,OutMode,  
                                                    OutTime,OutAni,StartPage,EndPage:Byte):Byte;  
  Var  
      Loop:Integer;  
      SendResult,RepeatSend:Byte;  
  Begin  
      For   Loop:=0   To   23   Do   SendBuff[Loop]:=#0;  
      SendBuff[0]:=Char(ScreenAddress);  
      if   Change=0   Then  
      Begin  
          SendBuff[1]:=#$fd;  
          SendBuff[4]:=#$ff;  
      End  
      Else  
      Begin  
          SendBuff[1]:=#$ff;  
          SendBuff[4]:=#$1f;  
      End;  
      SendBuff[2]:=#0;  
      SendBuff[3]:=Char(Command_Count);  
      SendBuff[5]:=Char(InMode);  
      SendBuff[6]:=Char(InTime);  
      SendBuff[7]:=Char(InAni);  
      SendBuff[8]:=Char(Extend);  
      SendBuff[9]:=Char(Extend_Delay);  
      SendBuff[10]:=Char(Extend_Time);  
      SendBuff[11]:=Char(OutMode);  
      SendBuff[12]:=Char(OutTime);  
      SendBuff[13]:=Char(OutAni);  
      SendBuff[14]:=#$11;  
      SendBuff[15]:=Char(StartPage);  
      SendBuff[16]:=Char(EndPage);  
      RepeatSend:=0;  
      SendResult:=0;  
      While   RepeatSend<=10   Do  
      Begin  
          SendResult:=lyCardSendData;  
          if   (SendResult=19)   Or   (SendResult=$aa)   Then   Break;  
          RepeatSend:=RepeatSend+1;  
      End;  
      Result:=SendResult;  
  End; 问题点数:0、回复次数:12Top

1 楼yishengdxx(yisheng)回复于 2003-12-03 19:54:59 得分 0

这还看不懂吗,唉,这师道怎么了,连26个拼音字母都不识别了,真不配当中国人了:-)Top

2 楼imageonline(不交房租)回复于 2003-12-03 19:58:50 得分 0

好长的汇编啊,累Top

3 楼soniconan(Delphi)回复于 2003-12-03 20:00:36 得分 0

各位大虾辛苦一下,详细解释一下!!  
  Top

4 楼xiaoqiang123(xiaoqiang)回复于 2003-12-03 20:01:00 得分 0

看不懂汇编:(Top

5 楼cqlumm(一条道走到黑)回复于 2003-12-03 21:07:43 得分 0

这是一个底层串口通讯的汇编代码,具体是和意思我也不太清楚。Top

6 楼bestdelphier(菜鸟升级中......)回复于 2003-12-04 00:09:05 得分 0

不懂,帮你顶一下吧。Top

7 楼siwuge(五哥)回复于 2003-12-04 08:35:44 得分 0

你拿到汇编高手处看看就行。Top

8 楼schmodock(愚人码头)回复于 2003-12-04 09:27:47 得分 0

我来试试吧:  
  Function   LyInit:Boolean;Stdcall;  
  Var  
      CardExist:Byte;  
  Begin  
      Asm  
          Mov     dx,$21B     //16进制数021B=539送入dx寄存器dx  
          Mov     al,$0C0     //C0=192送入ax的低16(32位机是16)  
          Out     dx,al         //把上面al=192发送到端口号539  
          Dec     dx               //dx=dx-1=538  
          Mov     al,$0F       //al=15  
          Out     dx,al       //15发送到端口538  
          Mov     al,0           //al=0  
          Out     dx,al         //0发送到端口538  
          In       Al,Dx         //从538端口接收一个字  
          Cmp     Al,$ff       //把接受到的字与255比较  
          Jnz     @Exists     //相同则跳转到@Exists处  
          Jmp     @NoExists     //否则跳转到@NoExists  
      @Exists:  
          Mov     CardExist,1   //1送入变量CardExist  
          Jmp     @Exit               //跳转到@Exit  
      @NoExists:  
          Mov     CardExist,0     //0送入变量CardExist  
      @Exit:  
      end;  
      if   CardExist=0   Then     //变量CardExist=0那函数LyInit=false,否则函数=true  
      Begin  
          Result:=False;  
          commInited:=False;  
      End  
      Else  
      Begin  
          Result:=True;  
          commInited:=True;  
      End;  
  End;  
   
  Top

9 楼chy105(烽火必胜)回复于 2003-12-04 09:44:45 得分 0

The   same   to   UP.Top

10 楼schmodock(愚人码头)回复于 2003-12-04 10:09:42 得分 0

EDI,   ESI,   ESP,   EBP,EBX   在delphi函数或过程调用中要用到的话必须把原值入栈,退出调用时必须出栈。也就是这几个寄存器delphi用来保存现场。  
  Function   LyCardSendData:Byte;  
  Const  
      WaitTime=600;  
  Var  
      SendResult:Byte;  
      OverTime:DWord;  
  Begin  
      if   Not   commInited   Then  
      Begin  
          Result:=0;  
          Exit;  
      End;  
      Asm  
          Push     ESi  
          Push     EBx  
          Push     EDx  
          Push     EAx  
          Push     ECx  
          Call     timeGetTime      
          Mov       OverTime,EAx             //OverTime:=TimeGetTime  
          Add       OverTime,WaitTime     //OverTime   :=   OverTime   +   WaitTime  
          Mov       ESi,Offset   SendBuff     //ESi   =   @SendBuff  
      @BeginSend:  
          Mov       Cx,0                                   //Cx   :   =0  
          Mov       Bx,0                                     //   Bx:   =0  
          Mov       Ah,55                                 //Ah   :=   55  
          Jmp       @CanSend                           //goto   @CanSend  
      @OverTime0:  
          Call     timeGetTime                            
          Cmp       OverTime,EAx                    
          Jnl       @CanSend                             //   if   OverTime   >=   TimeGetTime   then   goto   @CanSend  
          Mov       Al,0                                     //   al   :=0  
          Jmp       @ErrorExit                         //   goto   @ErrorExit  
      @CanSend:  
          Mov       Dx,$21a               //     Dx   :=(21a=538)  
          In         Al,Dx                     //   端口538处接受一个字  
          And       Al,$20                   //Al   and   100000   意思是取al的第六位  
          Jz         @OverTime0         //如果与的结果是0则goto   @OverTime0  
          Jmp       @CheckError       //否则goto   @CheckError  
      @ErrorProc:  
          Call     timeGetTime    
          Cmp       OverTime,EAx  
          Jnl       @CanSend             //     if   OverTime   >=   TimeGetTime   then   goto   @CanSend  
          Mov       Al,0                     //   al   :=   0  
          Jmp       @ErrorExit               //   goto   @ErrorExit  
      @CheckError:  
          Mov       Dx,$21c                 //         Dx   :=   540          
          In         Al,Dx                     //   从端口540接受一个字  
          Cmp       Al,$aa                  
          Jz         @ErrorExit         //   if   Al=   170   then   goto   @ErrorExit  
          Cmp       Al,$cc                      
          Jz         @ErrorExit         //   if   Al=204   then   goto   @ErrorExit  
          Cmp       Al,$11  
          Jnz       @ErrorProc           //if   Al   <>   17   then   goto   @ErrorProc  
          Mov       Cx,$18                   //Cx   :=   24  
          Mov       Bx,0                       //   Bx   :=   0  
          Jmp       @SendData               //   goto   @SendData  
      @OverTime1:  
          Call     timeGetTime  
          Cmp       OverTime,EAx  
          Jnl       @SendData           //   if   OverTime   >=   TimeGetTime   then     goto   @SendData  
          Mov       Al,0                       //   al   :=   0  
          Jmp       @ErrorExit               //goto   @ErrorExit  
      @SendData:  
          Mov       Dx,$21a                     //   Dx   :=   538  
          In         Al,Dx                         //   端口538一个字送入Al  
          And       Al,$80                        
          Jz         @OverTime1                 //if   al第8位=0   then   goto   @OverTime1  
          Mov       Al,Byte   Ptr   [ESi]     //Al   =   (Byte)@ESi  
          Mov       Dx,$21c                
          Out       Dx,Al                       //发送一个子节到539  
   
          Inc       ESi                               //Esi   :=   Esi   +   1  
          Dec       Cl                                   //cl   :=   cl   -1   Cx寄存器的低16位  
          Jnz       @SendData                   //if   cl   >   0   then   Goto   @SendData  
          Jmp       @CheckSendStatus     //goto   CheckSendStatus  
      @OverTime2:  
          Call     timeGetTime                    
          Cmp       OverTime,EAx  
          Jnl       @CheckSendStatus//   if   OverTime   >=   TimeGetTime   then   goto   @CheckSendStatus  
          Mov       Al,0                    
          Jmp       @ErrorExit               //   al   :=0   ;goto   @ErrorExit  
      @CheckSendStatus:  
          Mov       Dx,$21a  
          In         Al,Dx  
          And       Al,$20  
          Jz         @OverTime2       //从端口539接收一个字,如果第六位=0   then   goto   @OverTime2  
   
          Mov       Dx,$21c          
          In         Al,Dx  
          Cmp       Al,$13  
          Jnz       @BeginSend     //否则从端口540接收一个字   if   >   19   then   goto   @BeginSend  
      @ErrorExit:  
          Mov       SendResult,Al               //SendResult   :=   al  
          Pop       ECx                                  
          Pop       EAx  
          Pop       EDx  
          Pop       EBx  
          Pop       ESi                             //回复现场  
      End;  
      Result:=SendResult;  
  End;  
  Top

11 楼schmodock(愚人码头)回复于 2003-12-04 10:15:36 得分 0

上面的意思好像是从端口538接收一个子节,判断是否超时,否则向端口540发送字Top

12 楼schmodock(愚人码头)回复于 2003-12-04 10:18:52 得分 0

第一个函数是初始化串口,也就是判断设备是否连接。  
  第二个是向设备传送数据。Top

相关问题

  • 这段代码啥意思?
  • 这段代码啥意思?
  • 一小段ATL代码,啥意思?
  • 新手,帮忙看一下ATL代码,啥意思?
  • 请帮我看看下面的代码是啥意思?
  • 帮我解释一下,如下代码是啥意思?
  • 请问如下代码的语法是啥意思,请指教
  • 问两句代码的意思,在线等待
  • 这段代码有意思!
  • 这代码什么意思?

关键词

  • 端口
  • overtime
  • errorexit
  • al
  • cansend
  • dx
  • cardexist
  • checksendstatus
  • errorproc
  • senddata

得分解答快速导航

  • 帖主:soniconan

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo