我有一个方法(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;
}
由于某种原因,此方法返回♀
有什么想法吗?感谢
答案 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中的值。