所以我的程序非常简单。我有一个字符串" 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
答案 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)的内容与内存中项目的内容进行比较。