在嵌入式x86程序集中使用数组?

时间:2010-04-13 08:26:46

标签: c++ assembly embedded x86

我有一个方法(C ++),它返回一个字符并将一个字符数组作为其参数。

我第一次搞乱程序集,只是试图在dl寄存器中返回数组的第一个字符。这是我到目前为止所做的:

char returnFirstChar(char arrayOfLetters[])
{
 char max;

 __asm
 {
  push eax
      push ebx
       push ecx
     push edx
  mov dl, 0

  mov eax, arrayOfLetters[0]
  xor edx, edx
  mov dl, al

  mov max, dl       
  pop edx
  pop ecx
  pop ebx
  pop eax

 }

 return max;
}

由于某种原因,此方法返回♀

有什么想法吗?感谢

2 个答案:

答案 0 :(得分:4)

装配线:

mov eax, arrayOfLetters[0]

正在将指向字符数组的指针移动到eax(注意,这不是arrayOfLetters[0]在C中会做的事情,但汇编不是C)。

您需要在它之后添加以下内容,以便进行一些装配工作:

mov al, [eax]

答案 1 :(得分:4)

这就是我写这个功能的方法:

char returnFirstChar( const char arrayOfLetters[] )
{
    char max;
    __asm
    {
         mov eax, arrayOfLetters ; Move the pointer value of arrayOfLetters into eax.
         mov dl, byte ptr [eax]  ; De-reference the pointer and move the byte into eax.
         mov max, dl             ; Move the value in dl into max.
    }
    return max;
}

这似乎完美无缺。

注意:

1)正如我在评论中所说,你不需要推动堆栈上的寄存器,让MSVC处理它。
2)不要通过对它自己进行X的扫描来清除edx,或者不要将dl设置为0.两者都会达到同样的效果。你甚至都不需要这样做,因为你可以用你的值覆盖存储在dl中的值。