.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;

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

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

.net使用Delphi本地代码时FillChar失败相关推荐

  1. Ubuntu:成功解决ubuntu使用su切换root出现Authentication failure用户时认证失败

    Ubuntu:成功解决ubuntu使用su切换root出现Authentication failure用户时认证失败 导读 最讨厌网上回答的啰嗦和不清晰!本人最讨厌啰嗦,直接上来,图文表达,简单明了, ...

  2. Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 #原因...

    Jmeter+ant+Jenkins构建接口自动化测试时构建失败 提示:Fatal Error! 字符引用 "&#原因:接口响应数据中有&# 转载于:https://www. ...

  3. Spring——Filter过滤器注入Bean时注入失败[NULL]

    问题描述 Spring中Filter注入Bean时注入失败,Bean一直为空. @Slf4j @Component public class RestAuthFilter extends FormAu ...

  4. java ltpa_SystemOut频繁输出SECJ0369E: 使用 LTPA 时认证失败

    was 版本为7.0.0.29SystemOut.log里面频繁输出以下错误,请教下以下错误是什么原因?需要做什么处理?谢谢![14-9-16 17:21:04:796 CST] 00000064 L ...

  5. windows下用XShell远程ubuntu时连接失败

    现象描述:Ubuntu能Ping通主机,主机也能ping通虚拟机.但是windows下用XShell远程ubuntu时连接失败. 解决方案: 步骤: 1.查看一下防火墙状态:sudo ufw disa ...

  6. Delphi创建对象时,Application、Self、nil三者的区别

    Delphi创建对象时,Application.Self.nil三者的区别 ***.Create(AOwner:TComponent); //AOwner:创建者Create(nil);//这种方式创 ...

  7. 使用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 ...

  8. 支付宝小程序编译打包时, 使用tnpm安装依赖可能导致上传时构建失败,请使用 \tnpm i --by=yarn\ 安装依赖

    1.最近做支付宝小程序,不太懂,因为用了mini-ali-ui,所以打包出现了Packed fail. ========== 远程调试构建失败 ========== build & pack ...

  9. 关于签名时加密失败错误的解决

    原链接:http://blog.csdn.net/gslcn/article/details/2061510 搜集自csdn 有些开源项目,在编译时会有一大堆的错误,其中最常见的是:      对程序 ...

最新文章

  1. python编写单实例总结
  2. Android相机预览方向
  3. 用计算机制作演示文稿教案博客,制作演示文稿 教学反思
  4. Linux环境编程 哈希链表结构 hlist 介绍与用例
  5. 20220129---CTF刷题---WEB--代码审计
  6. (王道408考研操作系统)第四章文件管理-第二节2:磁盘调度算法
  7. jquery添加事件
  8. Selenium 凭什么成为 Web 自动化测试的首选?(内附源码)
  9. python 在线培训费用-线下python培训要多少钱?
  10. cmd 220 ftp 远程主机关闭连接_网络基础知识:FTP工作流程
  11. Spark sql数据倾斜优化的一个演示案例
  12. Android屏幕适配之--通过修改系统的屏幕像素比来实现屏幕的适配效果
  13. 小米路由器mini 刷潘多拉固件教程
  14. 【AI识人】OpenPose:实时多人2D姿态估计 | 附视频测试及源码链接
  15. Python学习笔记(4)-文件读取报错
  16. c语言编程竞赛活动主题,第三届“希望之星”C语言编程大赛系列活动
  17. Java面向对象的知识(二)
  18. vue滑杆_非常简单的Vue滑杆组件
  19. java fastmethod_Java FastMath.cbrt方法代码示例
  20. 25 网站应用攻击与防御

热门文章

  1. Ubuntu系统装机流程(显卡驱动、cuda、cudnn、搜狗输入法、anaconda、pycharm)
  2. SpringBoot集成Netty
  3. 树莓派红外遥控 (lirc、gpio-ir)——一遍过
  4. C#中【pdb】文件
  5. Dos与DDOS介绍及实例
  6. 玩偶 二次元 cosplay 手办迷宫 鬼屋 轰趴 密室逃脱
  7. 《Effective Java》阅读笔记(二)
  8. 忘尘如羡 计算机乐谱,忘尘如羡钢琴简谱-数字双手-Assen捷 老虎欧巴
  9. 重庆计算机学校哪个好考,重庆艺术类院校比较好考的有哪些?
  10. 【Web前端】网页背景图设置技巧