主题:用vc内联汇编如何拷贝字符串地址
jinhu
[专家分:230] 发布于 2005-12-11 22:05:00
用vc内联汇编如何拷贝字符串地址
如何拷贝字符串地址
比如 BYTE str[21];
现已知道EDX保存了字符串地址,如何传递给str.
谢谢!
lea edx,dword ptr ss:[esp+18h] // EDX保存了字符串地址
lea eax,[edx]
回复列表 (共2个回复)
沙发
erping [专家分:3660] 发布于 2005-12-12 10:34:00
/* 编译环境 VC\C++ 6.0 sp6 */
#include <stdio.h>
#include <stdlib.h>
/* 这是我使用内嵌汇编写的一个字符串复制的过程 */
char* Strcpy(char* pszDst, const char* pszSrc)
{
__asm
{
cld
mov edi, pszDst ;在这里不需要保存 edi 和 esi,
;因为 vc 编译器会自动保存的
;但是这并保证 vc 在什么情况
;下都为你保存
mov esi, pszSrc
push esi
xor ecx, ecx
_1:
lodsb ;al = byte ptr [esi++]
inc ecx ;计算 pszSrc 的长度
test al, al ;是否是 '\0'
jnz _1
pop esi
rep movsb ;复制 pszSrc 到 pszDst
}
return pszDst;
}
void main()
{
char str[20];
Strcpy(str, "Hello world!");
printf("%s\n", str);
}
板凳
jinhu [专家分:230] 发布于 2005-12-12 17:53:00
谢谢你的指教,可还是搞不懂.
lea edx,dword ptr ss:[esp+18h] //字符串生成结果的地址赋给EDX
lea eax,[edx]
mov esi, eax
push esi
cld
lea eax,tmp // 把CHAR TMP[21]的地址传给EAX
mov edi,eax
xor ecx, ecx
_1:
lodsb //al = byte ptr [esi++]
inc ecx //计算 pszSrc 的长度
test al, al //是否是 '\0'
jnz _1
pop esi
rep movsb //复制 pszSrc 到 pszDst 怎么到了这里就死机了.
编译平台 XP VC.NET
我来回复