invoke Memcopy用法的问题,请指点

sh210 2018-06-20 03:46:43
业余学习pe权威指南,感觉14章memcopy参数调用第一个和第一个写反了,但通过调试结果却是正确的:

代码如下:
invoke MemCopy,@lpMemory1,lpDstMemory,@dwFileSize1

其中@lpMemory1是打开的源文件的内存映射文件,lpDstMemory是申请的内存空间(已置0),@dwFileSize1是内存映射文件的长度,通过调试结果看,这样调用是对的。

但void *memcpy(void *dest, const void *src, size_t n);原型是这样的,上述第一个参数和第二个参数不是写反了吗?我修改代码将上述改为invoke MemCopy,lpDstMemory,@lpMemory1,@dwFileSize1得到的结果却是错的。

请各位高手指点一下,不胜感谢
...全文
221 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
sh210 2018-06-20
  • 打赏
  • 举报
回复
非常感谢早打大打打核战争,找到原因了,贴上来,非常感谢: memcopy跟memcpy是不一样的。 http://bbs.21ic.com/icview-1097178-1-1.html 这两个虽然都是拷贝,拷贝的目的地是不同的 void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr) { while(SourceAddr < SourceEndAddr) { *DestAddr++ = *SourceAddr++; } return; } void* memcpy(void*destaddr,voidconst*srcaddr,size_tlen) { char* dest=destaddr; char const* src=srcaddr; while(len-->0) { *dest++ = *src++; } return destaddr; } ramfuncs : LOAD = FLASHD, RUN = RAML0, LOAD_START(_RamfuncsLoadStart), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), PAGE = 0 第1行表示该段的装载在PAGA0的FLASHD中 第2行表示该段的运行地址在PAGE0的RAML0中 LOAD_ START(_RamfuncsLoadStart)令编译器创建了一个变量RamfuncsLoadStart,该变量指向段ramfuncs的装载地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档); LOAD_ START(_RamfuncsLoadEnd)令编译器创建了一个变量RamfuncsLoadEnd,该变量指向段ramfuncs的装载地址的末地址(LOAD_ END为编译伪指令,请见CCS的帮助文档); LOAD_ START(_RamfuncsRunStart)令编译器创建了一个变量RamfuncsRunStart,该变量指向段ramfuncs的运行地址的首地址(LOAD_ START为编译伪指令,请见CCS的帮助文档); 从第1和2行可以看出,段ramfuncs中的函数DSP28x_usDelay()的装载地址和运行地址是不同的,本程序中装载在Flash的块FLASHD中,而在SARAM L0中运行,这只是目标,实际运行时DSP并不会自动将Flash中的代码拷贝到SARAM中,因此需要手动添加代码来完成。 在C函数中,为了使用变量RamfuncsLoadStart、RamfuncsLoadEnd和RamfuncsRunStart,必须先声明,本工程在文件DSP2833x_GlobalPrototypes.h中做了如下声明: extern Uint16 RamfuncsLoadStart; extern Uint16 RamfuncsLoadEnd; extern Uint16 RamfuncsRunStart; 然后就可以使用了。在Main.c中,使用MemCopy()函数将段ramfuncs中的函数DSP28x_usDelay()的代码从装载地址RamfuncsLoadStart—RamfuncsLoadEnd拷贝到RamfuncsRunStart开始的SARAM空间中。之后在程序运行时,只要调用DSP28x_usDelay()函数,都会自动地指向SARAM中相应的函数入口地址,这一点是自动完成的。MemCopy()函数原型在MemCopy.c中,DSP2833x_GlobalPrototypes.h声明
sh210 2018-06-20
  • 打赏
  • 举报
回复
业余学习pe权威指南,感觉14章memcopy参数调用第一个和第一个写反了,但通过调试结果却是正确的: 代码如下: invoke MemCopy,@lpMemory1,lpDstMemory,@dwFileSize1 其中@lpMemory1是打开的源文件的内存映射文件,lpDstMemory是申请的内存空间(已置0),@dwFileSize1是内存映射文件的长度,通过调试结果看,这样调用是对的。 但void *memcopy(void *dest, const void *src, size_t n);原型是这样的,上述第一个参数和第二个参数不是写反了吗?我修改代码将上述改为invoke MemCopy,lpDstMemory,@lpMemory1,@dwFileSize1得到的结果却是错的。 请各位高手指点一下,不胜感谢
sh210 2018-06-20
  • 打赏
  • 举报
回复
谢谢,我发贴的时候打字少打了一个o,源代码里是Memcopy,我修改也是Memcopy,请教各位了
  • 打赏
  • 举报
回复
它这个是MemCopy,不是memcpy

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧