您的位置:首页 > 编程语言 > Delphi

.net使用Delphi本地代码时FillChar失败

2020-02-29 19:33 387 查看
.net使用Delphi本地代码时FillChar失败

事由来源:C#中使用Delphi本地代码,当调用ZeroMemory或者FillChar时,内存并没有被完全清空,会出现非法内容,当调用多次ZeroMemory/FillChar则完全没有问题。

看FillChar的汇编代码完全没问题,只是其中使用了浮点数寄存器ST0,且填充后的内容,有重复的迹象,所以怀疑是st0出了问题。查到一篇类似文章:

https://connect.microsoft.com/VisualStudio/feedback/details/181987/debugger-trashes-floating-point-stack

由于ntdll.memset也有问题,求解无果,项目组自己改写了一下VCL使用的FastCode版FillChar,写出来看一下:

1 procedure FillCharRep(var Dest; count: Integer; Value: Char);
2 asm
3 CMP EDX, 32
4 MOV CH, CL // Copy Value into both Bytes of CX
5 JL @@Small
6 MOV [EAX ], CX // Fill First 8 Bytes
7 MOV [EAX+2], CX
8 MOV [EAX+4], CX
9 MOV [EAX+6], CX
10 SUB EDX, 16
11 PUSH EBX
12 MOV EBX, [EAX] //Fill Last 16 Bytes
13 MOV [EAX+EDX], EBX //此处将原8字节st0改为两次四字节EBX
14 MOV [EAX+EDX+4], EBX
15 MOV [EAX+EDX+8], EBX
16 MOV [EAX+EDX+12], EBX
17 MOV ECX, EAX
18 AND ECX, 7 // 8-Byte Align Writes
19 SUB ECX, 8
20 SUB EAX, ECX
21 ADD EDX, ECX
22 ADD EAX, EDX
23 NEG EDX
24 @@Loop:
25 MOV [EAX+EDX], EBX // Fill 16 Bytes per Loop
26 MOV [EAX+EDX+4], EBX
27 MOV [EAX+EDX+8], EBX
28 MOV [EAX+EDX+12], EBX
29 ADD EDX, 16
30 JL @@Loop
31 POP EBX
32 RET
33 NOP
34 NOP
35 NOP
36 @@Small:
37 TEST EDX, EDX
38 JLE @@Done
39 MOV [EAX+EDX-1], CL // Fill Last Byte
40 AND EDX, -2 // No. of Words to Fill
41 NEG EDX
42 LEA EDX, [@@SmallFill + 60 + EDX * 2]
43 JMP EDX
44 NOP // Align Jump Destinations
45 NOP
46 @@SmallFill:
47 MOV [EAX+28], CX
48 MOV [EAX+26], CX
49 MOV [EAX+24], CX
50 MOV [EAX+22], CX
51 MOV [EAX+20], CX
52 MOV [EAX+18], CX
53 MOV [EAX+16], CX
54 MOV [EAX+14], CX
55 MOV [EAX+12], CX
56 MOV [EAX+10], CX
57 MOV [EAX+ 8], CX
58 MOV [EAX+ 6], CX
59 MOV [EAX+ 4], CX
60 MOV [EAX+ 2], CX
61 MOV [EAX ], CX
62 RET // DO NOT REMOVE - This is for Alignment
63 @@Done:
64 end;



posted on 2012-04-04 16:35 陈伟强 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/chenwq/archive/2012/04/04/2432062.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
anpiao0000 发布了0 篇原创文章 · 获赞 0 · 访问量 25 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: