C ++ / ASM - “操作数大小冲突”,“操作数类型不正确”

时间:2016-04-24 14:04:27

标签: c++ assembly

我正在尝试在ASM中编写一个简单的for循环。我需要访问两个数组,这些数组是在C ++的代码片段之外编写的(是OrigChars和EncrChars)

    char temporary_char;                    

__asm {             
      xor ebx, ebx              
      jmp checkend              

      loopfor: inc ebx                          

      checkend: cmp ebx, len              
      jge endfor1               

      mov bx, word ptr[ebx + OrigChars]
      mov temporary_char, bx //error - "operand size conflict"

      push eax
      push ecx

      movzx  ecx, temporary_char    
      lea    eax, EKey          

      push eax                  
      push ecx

      call encrypt1             
      add esp, 8            

      mov temporary_char, al    

      pop ecx
      pop eax

      mov EncrChars[ebx], temporary_char  //error - "improper operand type"

      jmp loopfor           
}

以上评论了有错误的行。

简而言之,为什么这些不适合我:

  • mov temporary_char,bx // temp_char = OChars [i];
  • mov EncrChars [ebx],temporary_char // EncrChars [ebx] = temporary_char;

2 个答案:

答案 0 :(得分:3)

mov bx, word ptr[ebx + OrigChars]
mov temporary_char, bx //error - "operand size conflict"

由于 temporary_char 的类型为 char ,您只需要用BL替换BX。
更好地使用AL,因为您使用EBX作为寻址索引!

mov al, byte ptr [OrigChars + ebx]
mov temporary_char, al
mov EncrChars[ebx], temporary_char  //error - "improper operand type"

同一指令中不能有2个内存引用。使用间歇寄存器:

mov al, temporary_char
mov byte ptr [EncrChars + ebx], al

答案 1 :(得分:0)

char类型通常为8位大小。 bx寄存器为16位。这是你的不匹配。