【问题标题】:Using an array in embedded x86 assembly?在嵌入式 x86 程序集中使用数组?
【发布时间】:2010-04-13 08:26:45
【问题描述】:

我有一个方法 (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;
}

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

知道发生了什么吗?谢谢

【问题讨论】:

  • 顺便说一句,根据您的 asm 语法,我猜您正在使用 Visual Studio。您确实很欣赏您不需要推送和弹出您将使用的寄存器。 Visual Studio 会自动执行此操作,因此您将使用的堆栈空间增加一倍...
  • @Mark V. - 仅供参考,您可以使用 pushapopa 推送 all 并弹出 all 寄存器。

标签: c++ assembly embedded x86


【解决方案1】:

装配线:

mov eax, arrayOfLetters[0]

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

您需要在它之后添加以下内容以使您的一点组装工作:

mov al, [eax]

【讨论】:

    【解决方案2】:

    这就是我编写该函数的方式:

    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,或者不要将dl设置为0。两者都会达到同样的效果。你甚至不需要这样做,因为你可以用你的值覆盖存储在 dl 中的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2015-06-15
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多