汇编Delphi高手看过来....(70分)

  • 主题发起人 主题发起人 hua8hua
  • 开始时间 开始时间
H

hua8hua

Unregistered / Unconfirmed
GUEST, unregistred user!
汇编Delphi高手看过来....
那个高手可以把下面的过程改为纯c代码或者纯delphi代码?我的分全给上了。
procedure THash_XOR16.Calc(const Data
DataSize: Integer)
assembler
register;
asm
TEST ECX,ECX
JLE @Exit
PUSH EAX
MOV AX,[EAX].THash_XOR16.FCRC
@@1: ROL AX,5
XOR AL,[EDX]
INC EDX
DEC ECX
JNZ @@1
POP EDX
MOV [EDX].THash_XOR16.FCRC,AX
@Exit:
end;
 
让我试一下:
if datasize <= 0 then exit;
for i := 0 to datasize - 1 do fcrc := fcrc shl 5 xor data;
大致如此吧
 
to: hua8hua
程序编译后能正常工作吗?我总觉得程序好像有问题。
是不是少了句mov edx,eax之类的??

我也听听,看高手们怎么说吧
 
var
Guard: Integer;
Numbers: Integer;
asm
@@1: MOV EDX,1
XCHG Guard,EDX
OR EDX,EDX
JNZ @@2
MOV EAX,Numbers
INC EAX
MOV Numbers,EAX
MOV Guard,EDX
RET @@2: PUSH 0
CALL Sleep
JMP @@1
end
==> pas代码:
var
EDX: Integer;
Guard: Integer;
Numbers: Integer;
begin
repeat
EDX := Guard;
Guard := 1;
Sleep(0);
until EDX <> 0;
Inc(Numbers);
Guard := EDX;
end


 
???
zouming,好像你在答另一个题吧。而且改的也好像有问题。
 
因为没有上下文,所以不太好强硬的写为代码。解释一下吧
注:EAX,ECX的大小都相当于一个DWORD(unsigned long)型,
AX相当于WORD型,AL相当于BYTE型
procedure THash_XOR16.Calc(const Data
DataSize: Integer)
assembler
register;
asm
TEST ECX,ECX //ECX是for循环的循环次数
JLE @Exit //次数等于0,退出
PUSH EAX //保存当前Eax的值
MOV AX,[EAX].THash_XOR16.FCRC //将某个类成员值赋给EAX,
@@1: ROL AX,5 //将AX中内容循环左移
XOR AL,[EDX] //将AL同EDX指向BYTE数组内容异或
INC EDX //循环计数
DEC ECX
JNZ @@1 //循环
POP EDX //EDX被恢复为类实例指针。
MOV [EDX].THash_XOR16.FCRC,AX //将AX的内容传给类的某个成员
@Exit:
end;
 
to JJams_King:
没有少mov edx,eax;
push eax;...pop edx;这两句与之有异曲同工之妙。
 
谢谢turborabbit!
基本认同iie的改法。注意其中:

EAX --&amp;gt
Self
EDX --&amp;gt
Data
ECX --&amp;gt
DataSize

不过:
1。ROL AX 使用16bit寄存器。
2。ROL AX 使用循环移位
3。XOR AL,[EDX] 使用8bit寄存器

我猜这应该是在计算一块数据的CRC校验码吧(不要意思,什么是CRC早就忘光了)
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
647
import
I
I
回复
0
查看
711
import
I
I
回复
0
查看
844
import
I
I
回复
0
查看
628
import
I
I
回复
0
查看
699
import
I
后退
顶部