C 需要基本ASM的帮助吗
我正在尝试将一些c代码转换为assmebly,我需要一些帮助C 需要基本ASM的帮助吗,c,masm,C,Masm,我正在尝试将一些c代码转换为assmebly,我需要一些帮助 char encode(char plain){ __asm{ mov eax, plain add eax, 2 ret } //C code /* char code; code = plain+2; return code;*/ } 第一个问题是visual studio抱怨寄存器大小不匹配,即eax对于cha
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来说太小/太大。我觉得他们都是德沃兹。另外,如果我将变量保留在eax中,将ret保留在assembly中,它实际上会返回该变量,对吗
char
s通常是一个字节,因此尝试使用AL而不是EAX(这是指同一寄存器的最低顺序字节)是的,至少在x86上的大多数C编译器中(虽然理论上不能保证),在[[e]a]x中输入的任何内容都将被视为1/2/4字节的返回值 不,char(通常)不是dword,而是字节
char encode(char plaintext) {
__asm {
mov al, plaintext
add al, 2
leave
ret
}
}
请记住,您可以随时查看c文件的汇编程序输出,以获取有关如何翻译某些内容的提示。通常需要启用单个标志。字符是8位或一个字节。寄存器eax为32位或4字节,或两个16位字,或一个32位dword。被识别为返回的内容取决于编译器和代码,但将值放入eax可能会返回该32位值。eax是32位,您的字符大小是多少-8位?如果您将eax更改为al,它还会抱怨吗?不,当我将其更改为al时,它不会抱怨。字符来自C(当然您的意思是
mov al,plaintext
?)+1:这是一个重要的一点-您可以通过使用例如gcc-S
来获得一些可构建的工作模板代码,从而在编写asm时为自己省去很多痛苦