C 需要基本ASM的帮助吗

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

我正在尝试将一些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对于char来说太小/太大。我觉得他们都是德沃兹。另外,如果我将变量保留在eax中,将ret保留在assembly中,它实际上会返回该变量,对吗

  • C
    char
    s通常是一个字节,因此尝试使用AL而不是EAX(这是指同一寄存器的最低顺序字节)
  • 严格地说,RET指令只是从堆栈中弹出返回地址并在那里传输控制。标准x86调用约定确实规定返回值应该放在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时为自己省去很多痛苦