我正在尝试将一些c代码转换成可以解释的,我需要一些帮助。
char encode(char plain){
__asm{
mov eax, plain
add eax, 2
ret
}
//C code
/*
char code;
code = plain+2;
return code;*/
}
第一个问题是visual studio抱怨寄存器大小不匹配,即eax对于char来说太小/太大。我的印象是他们都是DWORD。另外,如果我将变量保留在eax中并返回汇编中,它实际上会返回该变量,对吗?
答案 0 :(得分:2)
请记住,您可以随时查看c文件的汇编输出,以获取有关如何翻译内容的提示。它通常是你必须启用的一个标志。
答案 1 :(得分:1)
char
s通常是一个字节,因此请尝试使用AL而不是EAX(这是指同一寄存器的最低位字节)。答案 2 :(得分:1)
是的,至少对于x86上的大多数C编译器(虽然它在理论上没有保证),无论你在[[e] a]中放入什么,x都将被视为1/2/4字节的返回值。
不,char不会(通常)是dword - 它将是一个字节。
char encode(char plaintext) {
__asm {
mov al, plaintext
add al, 2
leave
ret
}
}
答案 3 :(得分:0)
char是8位或一个字节。寄存器eax是32位,或4个字节,或两个16位字,或一个32位双字。被识别为返回的内容取决于编译器和代码,但在eax中放置一个值可能会返回该32位值。