.net使用Delphi本地代码时FillChar失败
2020-02-29 19:33
387 查看
.net使用Delphi本地代码时FillChar失败
事由来源:C#中使用Delphi本地代码,当调用ZeroMemory或者FillChar时,内存并没有被完全清空,会出现非法内容,当调用多次ZeroMemory/FillChar则完全没有问题。
看FillChar的汇编代码完全没问题,只是其中使用了浮点数寄存器ST0,且填充后的内容,有重复的迹象,所以怀疑是st0出了问题。查到一篇类似文章:
由于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;
转载于:https://www.cnblogs.com/chenwq/archive/2012/04/04/2432062.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Delphi使用android的NDK是通过JNI接口,封装好了,不用自己写本地代码,直接调用
- 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。 与基础事务管理器的通信失败。 .net 代码里 写事务代码
- [Delphi]在Delphi中使用由.NET开发的Web Service返回的DataSet类型
- 不使用IA,在.NET代码中调用Office
- 翻譯Borland® Delphi® 2005使用 VCL for .NET移植到 .NET(2)
- 下载所有的 .NET 开源代码,使用NET MASS DOWNLOADER一次性搞定!太棒了(英文,近期翻译)
- 原创: 自己收集整理的 DELPHI 中控制与使用HMTL帮助文件的单元代码。
- .net使用jquery easyui的datagrid无法显示本地.json文件中的数据
- 使用.net操作pcc的个人数据库代码
- .net使用代码来申请CA证书
- 使用.net操作AD域的一些代码共享
- 使用Delphi 通过WebServices 要想实现到.Net 或者是Java的WebServices 头验证.
- 使用VS2010代码分析功能增强ASP.NET应“.NET研究”用程序安全
- [译文] 使用JNA来简化对本地代码的访问[三]
- 本地使用xcode4创建svn代码管理的方法
- 在Android中使用JNI调用Opencv本地代码 配置方式 边缘检测 范例代码
- .NET 框架中的 XML:在 .NET 框架中使用 XML 架构执行代码生成
- .Net中使用带返回值的存储过程(VB代码)
- 使用 .NET 框架将现有代码作为 Web 服务提供