那位高手替我看看,这段代码啥意思的?在线等!
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




