回 帖 发 新 帖 刷新版面

主题:用vc内联汇编如何拷贝字符串地址

用vc内联汇编如何拷贝字符串地址
如何拷贝字符串地址
比如 BYTE str[21];
现已知道EDX保存了字符串地址,如何传递给str.
谢谢!
lea edx,dword ptr ss:[esp+18h]  // EDX保存了字符串地址
lea eax,[edx]

回复列表 (共2个回复)

沙发

/* 编译环境 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);
}

板凳

谢谢你的指教,可还是搞不懂.
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

我来回复

您尚未登录,请登录后再回复。点此登录或注册