两个delphi内嵌汇编的函数看不懂,请各位大侠帮帮忙! hoho,简单?单说mov,je,cmp谁都知道什么意思。我问的是整个汇编函数是怎么实现这个功能的,比如Mov [ECX],EAX 是什么意思,为什么要Je @OB1 。而不是什么是Je @OB1 。不好意思,可能表达有误,有些人没有看懂。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我很奇怪,你说你知道mov,je,cmp,但确不知道Mov [ECX],EAX ??????[ECX]表示32位寄存器ECX的地址!Mov [ECX],EAX 表示把[ECX]的地址作为一个值传给寄存器EAX! 楼上的说话怎么不看看前面的讨论?不懂就听,不要乱回答。别人是问“为什么”,不是“是什么”,比如ECX是第三个输入参数的存放位置,将EAX放入……是为了……,所以……。这才是一个回答嘛。hoho,我不懂,只是看不惯说两句。 这个outv和下一个getnextvalue是干什么的你应当从整个project分析。Procedure OutV(Value:Integer); Asm Mov EDX,Value Inc OB //这里是o而不是0(zero)吧,这个变量ob的定义是什么?And OB,3 //似乎是个byte(out byte?)为1/2/3时各有意义。 //若为0,则转至ob0处,Cmp OB,1 Je @OB1 Cmp OB,2 Je @OB2 Cmp OB,3 Je @OB3 @OB0:Mov ECX, DstPtr //这个dstptr(目标地址?)又是什么?还有变量dw,Mov EAX,EDX //thispackdw,thispackbyte,从子过程里是没法分析的。Shr AX,8 OR EAX,DW Mov [ECX],EAX Add ECX,4 Mov [Ecx],DL Inc ECX Mov DstPtr,Ecx Jmp @Exit @OB1:Shl EDX,22 //取value的低10位,Mov DW,EDX Jmp @Exit @OB2:Shl EDX,12 //取低20位,Or DW,EDX Jmp @Exit @OB3:Shl EDX,2 Or DW,EDX @Exit: End; 不好意思,忘了给出函数变量声明。1。Var OutSize,I,J,OB,H,OS:Integer; Code,OldCode:Smallint; ThisPackDW,DataPtr,DstPtr:DWord; ThisPackByte:Byte; StringTable:Array [0.._WinSize] of Array of Byte; SLTable:Array [0.._WinSize] of SmallInt; Procedure GetNextValue; //数据单元拆分 Asm CMP OB,1 ……2。VAR SrcData:PByteArray; OB,H:Integer; I,J:Integer; Found,JustComplete:Boolean; ADW,DstBegin,DstPtr:Dword; Procedure OutV(Value:Integer); Asm Mov EDX,Value Inc OB…… Procedure OutV(Value:Integer); Asm Mov EDX,Value 赋值给寄存器 EDXInc OB 寄存器 OB 加 1And OB,3 与上 3Cmp OB,1 比较 Je @OB1 取OB1的地址,为零则跳转 Cmp OB,2 比较Je @OB2 取OB2的地址,为零则跳转 Cmp OB,3 比较Je @OB3 取OB1的地址,为零则跳转 @OB0:Mov ECX, DstPtr 赋值Mov EAX,EDX 赋值Shr AX,8 AX 位移8OR EAX,DW EAX 和 DW 相或Mov [ECX],EAX 赋值Add ECX,4 ECX 加 4Mov [Ecx],DL 赋值Inc ECX ecx 减一Mov DstPtr,Ecx 赋值Jmp @Exit 无条件跳转@OB1:Shl EDX,22 EDX 位移22Mov DW,EDX AX 位移8...... 以下请参照Jmp @Exit @OB2:Shl EDX,12 Or DW,EDX Jmp @Exit @OB3:Shl EDX,2 Or DW,EDX @Exit: End; Procedure GetNextValue; //数据单元拆分 Asm CMP OB,1 JE @OB1 CMP OB,2 JE @OB2 CMP OB,3 JE @OB3 @OB0: Mov ECX,DataPtr MOV EDX,[ECX] Add ECX,4 Mov ThisPackDW,EDX MOV AL,[ECX] Inc ECX Mov DataPtr,ECX Mov ThisPackByte,AL Shr EDX,22 Mov Code,DX Jmp @Exit @OB1: Mov EAX,ThisPackDW Shr EAX,12 AND EAX,$3FF Mov Code,AX Jmp @Exit @OB2: Mov EAX,ThisPackDW Shr EAX,2 AND EAX,$3FF Mov Code,AX Jmp @Exit @OB3: Mov EAX,ThisPackDW Shl EAX,8 MOV AL,ThisPackByte AND EAX,$3FF Mov Code,AX @Exit:Inc OB AND OB,3 End; Procedure OutV(Value:Integer); Asm Mov EDX,Value ;赋值给寄存器 EDXInc OB ;缓冲区OB 加 1And OB,3 ;与上 3Cmp OB,1 ;比较 Je @OB1 ;OB=1则跳转,下同 Cmp OB,2 Je @OB2 Cmp OB,3 je @OB3 @OB0:Mov ECX, DstPtr ;赋值Mov EAX,EDX ;赋值Shr AX,8 ;AX 右移8位OR EAX,DW ;EAX 和 DW 相或Mov [ECX],EAX ;把EAX赋值给ECX指向的缓冲区Add ECX,4 ;ECX 加 4Mov [Ecx],DL ;把DL赋值给ECX指向的缓冲区Inc ECX ;ecx 加1Mov DstPtr,Ecx ;赋值Jmp @Exit ;无条件跳转@OB1:Shl EDX,22 ;EDX 左移22位Mov DW,EDX ;Jmp @Exit @OB2:Shl EDX,12 Or DW,EDX Jmp @Exit @OB3:Shl EDX,2 Or DW,EDX @Exit: End; End; 再次发"关于qq中发送聊天内容的屏蔽字" 我有几个问题要问高手请进!!再线等!!分不够再加!!谢谢了 价格走势图? 送分:ADOConnection 连接数据库的问题 如何在dbgrid中插入记录 ComboBox问题! 谁用过RXlib? 什么是屏幕坐标?? 如何保护画图后的图形! 急!急!急! 用Delphi做数据库程序真是烦,假如有一个像PowerBuilder的DataWindow的“超级表格”就好了,请问何处有? 小问题,派点小分。TQuery方面 怎样用程序实现发送Email,新手请教 :)谢谢谢谢
[ECX]表示32位寄存器ECX的地址!
Mov [ECX],EAX 表示把[ECX]的地址作为一个值传给寄存器EAX!
别人是问“为什么”,不是“是什么”,比如ECX是第三个输入参数的存放位置,将EAX放入……是为了……,所以……。这才是一个回答嘛。
hoho,我不懂,只是看不惯说两句。
Asm
Mov EDX,Value
Inc OB //这里是o而不是0(zero)吧,这个变量ob的定义是什么?
And OB,3 //似乎是个byte(out byte?)为1/2/3时各有意义。
//若为0,则转至ob0处,
Cmp OB,1
Je @OB1
Cmp OB,2
Je @OB2
Cmp OB,3
Je @OB3
@OB0:Mov ECX, DstPtr //这个dstptr(目标地址?)又是什么?还有变量dw,
Mov EAX,EDX //thispackdw,thispackbyte,从子过程里是没法分析的。
Shr AX,8
OR EAX,DW
Mov [ECX],EAX
Add ECX,4
Mov [Ecx],DL
Inc ECX
Mov DstPtr,Ecx
Jmp @Exit
@OB1:Shl EDX,22 //取value的低10位,
Mov DW,EDX
Jmp @Exit
@OB2:Shl EDX,12 //取低20位,
Or DW,EDX
Jmp @Exit
@OB3:Shl EDX,2
Or DW,EDX
@Exit:
End;
1。
Var OutSize,I,J,OB,H,OS:Integer;
Code,OldCode:Smallint;
ThisPackDW,DataPtr,DstPtr:DWord;
ThisPackByte:Byte;
StringTable:Array [0.._WinSize] of Array of Byte;
SLTable:Array [0.._WinSize] of SmallInt; Procedure GetNextValue; //数据单元拆分
Asm
CMP OB,1
……
2。
VAR SrcData:PByteArray;
OB,H:Integer;
I,J:Integer;
Found,JustComplete:Boolean;
ADW,DstBegin,DstPtr:Dword; Procedure OutV(Value:Integer);
Asm
Mov EDX,Value
Inc OB
……
Asm
Mov EDX,Value 赋值给寄存器 EDX
Inc OB 寄存器 OB 加 1
And OB,3 与上 3Cmp OB,1 比较
Je @OB1 取OB1的地址,为零则跳转
Cmp OB,2 比较
Je @OB2 取OB2的地址,为零则跳转
Cmp OB,3 比较
Je @OB3 取OB1的地址,为零则跳转
@OB0:
Mov ECX, DstPtr 赋值
Mov EAX,EDX 赋值
Shr AX,8 AX 位移8
OR EAX,DW EAX 和 DW 相或
Mov [ECX],EAX 赋值
Add ECX,4 ECX 加 4
Mov [Ecx],DL 赋值
Inc ECX ecx 减一
Mov DstPtr,Ecx 赋值
Jmp @Exit 无条件跳转
@OB1:Shl EDX,22 EDX 位移22
Mov DW,EDX AX 位移8...... 以下请参照Jmp @Exit
@OB2:Shl EDX,12
Or DW,EDX
Jmp @Exit
@OB3:Shl EDX,2
Or DW,EDX
@Exit:
End;
Procedure GetNextValue; //数据单元拆分
Asm
CMP OB,1
JE @OB1
CMP OB,2
JE @OB2
CMP OB,3
JE @OB3
@OB0: Mov ECX,DataPtr
MOV EDX,[ECX]
Add ECX,4
Mov ThisPackDW,EDX
MOV AL,[ECX]
Inc ECX
Mov DataPtr,ECX
Mov ThisPackByte,AL
Shr EDX,22
Mov Code,DX
Jmp @Exit
@OB1: Mov EAX,ThisPackDW
Shr EAX,12
AND EAX,$3FF
Mov Code,AX
Jmp @Exit
@OB2: Mov EAX,ThisPackDW
Shr EAX,2
AND EAX,$3FF
Mov Code,AX
Jmp @Exit
@OB3: Mov EAX,ThisPackDW
Shl EAX,8
MOV AL,ThisPackByte
AND EAX,$3FF
Mov Code,AX
@Exit:Inc OB
AND OB,3 End;
Asm
Mov EDX,Value ;赋值给寄存器 EDX
Inc OB ;缓冲区OB 加 1
And OB,3 ;与上 3Cmp OB,1 ;比较
Je @OB1 ;OB=1则跳转,下同
Cmp OB,2
Je @OB2
Cmp OB,3
je @OB3
@OB0:
Mov ECX, DstPtr ;赋值
Mov EAX,EDX ;赋值
Shr AX,8 ;AX 右移8位
OR EAX,DW ;EAX 和 DW 相或
Mov [ECX],EAX ;把EAX赋值给ECX指向的缓冲区
Add ECX,4 ;ECX 加 4
Mov [Ecx],DL ;把DL赋值给ECX指向的缓冲区
Inc ECX ;ecx 加1
Mov DstPtr,Ecx ;赋值
Jmp @Exit ;无条件跳转
@OB1:Shl EDX,22 ;EDX 左移22位
Mov DW,EDX ;Jmp @Exit
@OB2:Shl EDX,12
Or DW,EDX
Jmp @Exit
@OB3:Shl EDX,2
Or DW,EDX
@Exit:
End;
End;