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

时间:2014-08-05 10:49:39

标签: string assembly replace character masm

所以我的程序非常简单。我有一个字符串" Hello World"我想取代' H'与' A'。所以这是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 个答案:

答案 0 :(得分:1)

" Hello World"是一个文字,即一个不可写的常量字符串。 '名称'是一个指向该文字的指针。您可以改为定义一个数组,该数组必须用该文字填充,即将文字复制到数组中:

#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),原始代码可以正常工作,但这并不符合标准。

答案 1 :(得分:0)

第一个角色

    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

MOVS - 该指令将1字节,字或双字数据从内存位置移动到另一个位置。

LODS

LODS - 该指令从内存加载。如果操作数是一个字节,则将其加载到AL寄存器中,如果操作数是一个字,则将其加载到AX寄存器中,并将双字加载到EAX寄存器中。

STOS

STOS - 该指令将寄存器(AL,AX或EAX)中的数据存储到存储器中。

CMPS

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

SCAS

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