C++ 在嵌入式x86程序集中使用阵列?
我有一个方法(C++),它返回一个字符并将一个字符数组作为其参数 我第一次搞汇编,只是想返回dl寄存器中数组的第一个字符。以下是我目前掌握的情况: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,
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
来推送所有和弹出所有寄存器。