内联汇编操作数大小冲突

时间:2013-11-17 18:20:08

标签: visual-c++ inline-assembly

我正在为课堂工作,根据教师指南,我们必须使用内联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行中,但我不太确定。

1 个答案:

答案 0 :(得分:2)

  mov ecx, [string]

“string”是一个char数组,您试图将8位移入32位寄存器。如果是全局变量,则使用 offset 关键字。但事实并非如此,它存储在堆栈中。这要求您使用LEA指令(加载有效地址),如下所示:

  lea ecx,string

编译器自动转换为:

  lea ecx,[ebp-20] 

-20调整取决于它在堆栈上的位置。 ECX寄存器现在指向字符串中的第一个字符。