我正在为课堂工作,根据教师指南,我们必须使用内联c ++来完成该程序。程序的目的是获取任意长度的字符串并将其反转。我得到的错误是操作数大小冲突,从我在__asm块的第一行可以告诉它,可能还有其他问题但是在visual studio中出现的唯一问题是冲突。这是我的asm块
int _tmain(int argc, _TCHAR* argv[])
{
char string[] = "Hi There!";
__asm
{ // reverse a string of any length
lea ecx, string
lea eax, string
mov esi, eax // esi points to start of string
add eax, ecx
mov edi, eax
dec edi // edi points to end of string
shr ecx, 1 // ecx is count (length/2)
jz done // if string is 0 or 1 characters long, done
reverseLoop:
mov al, [esi] // load characters
mov bl, [edi]
mov [esi], bl // and swap
mov [edi], al
inc esi // adjust pointers
dec edi
dec ecx // and loop
jnz reverseLoop
done:
}
printf(string);
return 0;
}
我现在做了更改我得到了这个:字符串Reverse.exe中0x00e71416处的未处理异常:0xC0000005:访问冲突读取位置0x0087ef6f。基于我尝试过的其他建议,我仍然无法让它正常运行。我认为问题可能出在我正在引用的寄存器或添加eax行中,但我不太确定。
答案 0 :(得分:2)
mov ecx, [string]
“string”是一个char数组,您试图将8位移入32位寄存器。如果是全局变量,则使用 offset 关键字。但事实并非如此,它存储在堆栈中。这要求您使用LEA指令(加载有效地址),如下所示:
lea ecx,string
编译器自动转换为:
lea ecx,[ebp-20]
-20调整取决于它在堆栈上的位置。 ECX寄存器现在指向字符串中的第一个字符。