Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用MASM中的汇编代码替换字符串中的字符_String_Assembly_Replace_Character_Masm - Fatal编程技术网

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

String 使用MASM中的汇编代码替换字符串中的字符,string,assembly,replace,character,masm,String,Assembly,Replace,Character,Masm,所以我的程序很简单。我有一个字符串“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可能是错误的。所有评论都非常感谢。谢谢 以下是警报的图像:“Hell

所以我的程序很简单。我有一个字符串“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可能是错误的。所有评论都非常感谢。谢谢

以下是警报的图像:

“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;
}
#包括
内部主(空)
{
char name[]=“你好,世界”;
_asm
{
lea eax,name;//eax=名称的地址
mov-ebx,‘A’;
mov[eax],bl;
}
printf(“%s”,名称);
返回0;
}
如果您使用MSVC的C89编译器(文件扩展名
.c
或命令行选项
/TC
),原始代码可以工作,但这并不真正符合标准。

第一个字符

    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;
第二个字符

    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)的内容与内存中项目的内容进行比较。

您得到的错误消息是什么?(把它一字不差地复制粘贴到你的问题中)@Michael刚刚给这个问题添加了一个图像链接。谢谢您的提问。@Michael使用“move eax,OFFSET name”,我得到了错误C2415:操作数类型不正确。有了‘leaeax,[name]”,我得到了一些奇怪的输出:“CaC”。我把第二行改成了mov bl“A”。第三行是mov[eax],bl这是更新程序的图像:所以我把char*改为char[]。代码运行良好。你是对的。我不能改变字面意思。所以我想的另一种方法是围绕char*工作。我创建一个char*名称,将字符串复制到char name2[],在其中更改一个字符。然后让name指向新名称2。它起作用了是的,但我有一个新问题。I printf(“%s”,name)只打印出“A”@Jon:
mov[eax],bl
!非
mov[eax],ebx
!您只想存储一个字符(=一个字节)。