代码之家  ›  专栏  ›  技术社区  ›  Phuc

使用MASM中的汇编代码替换字符串中的字符

  •  3
  • Phuc  · 技术社区  · 10 年前

    所以我的程序很简单。我有一个字符串“Hello World”,我想用“a”替换“H”。这是我的MASM汇编代码。

    char* name = "Hello World";
    _asm
    {
    mov eax, name;
    mov ebx, 'A';
    mov [eax], ebx;
    }
    
    printf("%s", name);
    

    Visual Studio无法编译此。它提醒我这个程序不工作。我怀疑mov[eax],ebx的语法可能是错误的。感谢所有评论。谢谢

    以下是警报图像: https://www.dropbox.com/s/e5ok96pj0mxi6sa/test%20program%20not%20working.PNG

    2 回复  |  直到 10 年前
        1
  •  2
  •   rkhb    10 年前

    “Hello World”是一个文本,即不可写的常量字符串name”是指向该文本的指针。相反,您可以定义一个数组,该数组必须用该文本填充,即文本被复制到数组中:

    #include <stdio.h>
    
    int main (void)
    {
        char name[] = "Hello World";
        _asm
        {
            lea eax, name;    // EAX = address of name
            mov ebx, 'A';
            mov [eax], bl;
        }
    
        printf("%s", name);
    
        return 0;
    }
    

    如果使用MSVC的C89编译器(文件扩展名 .c 或命令行选项 /TC ),但这并不符合标准。

        2
  •  1
  •   naqib    10 年前

    第一个字符

        mov eax, _name;    // EAX = address of name
        mov bl, 'A';
        mov byte[eax], bl;
    

    第二个字符

    mov eax, _name;    // EAX = address of name
    mov bl, 'A';
    mov byte[eax+1], bl;
    

    机动车辆

    MOVS—此指令将1字节、字或双字数据从内存位置移动到另一个位置。

    LODS
    

    LODS—此指令从内存加载。如果操作数为一个字节,则将其加载到AL寄存器;如果操作数是一个字,则将它加载到AX寄存器,并将一个双字加载到EAX寄存器。

    STOS
    

    STOS—此指令将寄存器(AL、AX或EAX)中的数据存储到内存。

    CMPS
    

    CMPS—此指令比较内存中的两个数据项。数据可以是字节大小、字或双字。

    SCAS
    

    SCAS—此指令将寄存器(AL、AX或EAX)的内容与内存中项目的内容进行比较。