C++ 在嵌入式x86程序集中使用阵列?

C++ 在嵌入式x86程序集中使用阵列?,c++,assembly,embedded,x86,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,

我有一个方法(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;
}
由于某种原因,此方法返回♀

知道怎么回事吗?感谢装配线:

mov eax, arrayOfLetters[0]
正在将指向字符数组的指针移动到
eax
(请注意,这不是
arrayOfLetters[0]
在C中所做的,但程序集不是C)

您需要在其后面添加以下内容,以使您的一点组装工作正常进行:

mov al, [eax]

下面是我如何编写该函数的:

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) 不要麻烦通过对edx自身进行X’oring或将dl设置为0来清除edx。两者都将实现同样的目标。总之,您甚至不需要这样做,因为您可以用您的值覆盖存储在dl中的值。

另外,根据asm语法,我猜您正在使用Visual Studio。你很感激你不需要按下和弹出你将要使用的寄存器。Visual Studio会自动执行此操作,因此您将使用的堆栈空间加倍…@Mark V.-FYI,您可以使用
pusha
popa
来推送所有和弹出所有寄存器。