需要有关基本ASM的帮助

时间:2010-04-26 23:53:24

标签: c masm

我正在尝试将一些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中并返回汇编中,它实际上会返回该变量,对吗?

4 个答案:

答案 0 :(得分:2)

请记住,您可以随时查看c文件的汇编输出,以获取有关如何翻译内容的提示。它通常是你必须启用的一个标志。

答案 1 :(得分:1)

  1. C char s通常是一个字节,因此请尝试使用AL而不是EAX(这是指同一寄存器的最低位字节)。
  2. 严格地说,RET指令只是从堆栈弹出返回地址并在那里转移控制。标准的x86调用约定确实说返回值应该放在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位值。