.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], CX10 SUB EDX, 1611 PUSH EBX12 MOV EBX, [EAX] //Fill Last 16 Bytes13 MOV [EAX+EDX], EBX //此处将原8字节st0改为两次四字节EBX14 MOV [EAX+EDX+4], EBX15 MOV [EAX+EDX+8], EBX16 MOV [EAX+EDX+12], EBX17 MOV ECX, EAX18 AND ECX, 7 // 8-Byte Align Writes19 SUB ECX, 820 SUB EAX, ECX21 ADD EDX, ECX22 ADD EAX, EDX23 NEG EDX24 @@Loop:25 MOV [EAX+EDX], EBX // Fill 16 Bytes per Loop26 MOV [EAX+EDX+4], EBX27 MOV [EAX+EDX+8], EBX28 MOV [EAX+EDX+12], EBX29 ADD EDX, 1630 JL @@Loop31 POP EBX32 RET33 NOP34 NOP35 NOP36 @@Small:37 TEST EDX, EDX38 JLE @@Done39 MOV [EAX+EDX-1], CL // Fill Last Byte40 AND EDX, -2 // No. of Words to Fill41 NEG EDX42 LEA EDX, [@@SmallFill + 60 + EDX * 2]43 JMP EDX44 NOP // Align Jump Destinations45 NOP46 @@SmallFill:47 MOV [EAX+28], CX48 MOV [EAX+26], CX49 MOV [EAX+24], CX50 MOV [EAX+22], CX51 MOV [EAX+20], CX52 MOV [EAX+18], CX53 MOV [EAX+16], CX54 MOV [EAX+14], CX55 MOV [EAX+12], CX56 MOV [EAX+10], CX57 MOV [EAX+ 8], CX58 MOV [EAX+ 6], CX59 MOV [EAX+ 4], CX60 MOV [EAX+ 2], CX61 MOV [EAX ], CX62 RET // DO NOT REMOVE - This is for Alignment63 @@Done:64 end;
转载于:https://www.cnblogs.com/chenwq/archive/2012/04/04/2432062.html
.net使用Delphi本地代码时FillChar失败相关推荐
- Ubuntu:成功解决ubuntu使用su切换root出现Authentication failure用户时认证失败
Ubuntu:成功解决ubuntu使用su切换root出现Authentication failure用户时认证失败 导读 最讨厌网上回答的啰嗦和不清晰!本人最讨厌啰嗦,直接上来,图文表达,简单明了, ...
- Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 #原因...
Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 "&#原因:接口响应数据中有&# 转载于:https://www. ...
- Spring——Filter过滤器注入Bean时注入失败[NULL]
问题描述 Spring中Filter注入Bean时注入失败,Bean一直为空. @Slf4j @Component public class RestAuthFilter extends FormAu ...
- java ltpa_SystemOut频繁输出SECJ0369E: 使用 LTPA 时认证失败
was 版本为7.0.0.29SystemOut.log里面频繁输出以下错误,请教下以下错误是什么原因?需要做什么处理?谢谢![14-9-16 17:21:04:796 CST] 00000064 L ...
- windows下用XShell远程ubuntu时连接失败
现象描述:Ubuntu能Ping通主机,主机也能ping通虚拟机.但是windows下用XShell远程ubuntu时连接失败. 解决方案: 步骤: 1.查看一下防火墙状态:sudo ufw disa ...
- Delphi创建对象时,Application、Self、nil三者的区别
Delphi创建对象时,Application.Self.nil三者的区别 ***.Create(AOwner:TComponent); //AOwner:创建者Create(nil);//这种方式创 ...
- 使用Portia时docker-compose失败 /bin/sh: 1: /app/provision.sh: Permission denied
使用Portia时docker-compose失败 /bin/sh: 1: /app/provision.sh: Permission denied docker-compose up Buildin ...
- 支付宝小程序编译打包时, 使用tnpm安装依赖可能导致上传时构建失败,请使用 \tnpm i --by=yarn\ 安装依赖
1.最近做支付宝小程序,不太懂,因为用了mini-ali-ui,所以打包出现了Packed fail. ========== 远程调试构建失败 ========== build & pack ...
- 关于签名时加密失败错误的解决
原链接:http://blog.csdn.net/gslcn/article/details/2061510 搜集自csdn 有些开源项目,在编译时会有一大堆的错误,其中最常见的是: 对程序 ...
最新文章
- python编写单实例总结
- Android相机预览方向
- 用计算机制作演示文稿教案博客,制作演示文稿 教学反思
- Linux环境编程 哈希链表结构 hlist 介绍与用例
- 20220129---CTF刷题---WEB--代码审计
- (王道408考研操作系统)第四章文件管理-第二节2:磁盘调度算法
- jquery添加事件
- Selenium 凭什么成为 Web 自动化测试的首选?(内附源码)
- python 在线培训费用-线下python培训要多少钱?
- cmd 220 ftp 远程主机关闭连接_网络基础知识:FTP工作流程
- Spark sql数据倾斜优化的一个演示案例
- Android屏幕适配之--通过修改系统的屏幕像素比来实现屏幕的适配效果
- 小米路由器mini 刷潘多拉固件教程
- 【AI识人】OpenPose:实时多人2D姿态估计 | 附视频测试及源码链接
- Python学习笔记(4)-文件读取报错
- c语言编程竞赛活动主题,第三届“希望之星”C语言编程大赛系列活动
- Java面向对象的知识(二)
- vue滑杆_非常简单的Vue滑杆组件
- java fastmethod_Java FastMath.cbrt方法代码示例
- 25 网站应用攻击与防御