3

我正在尝试将一些 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

4 回答 4

2

请记住,您始终可以查看 ac 文件的汇编程序输出以获取有关如何翻译某些内容的提示。它通常是您必须启用的单个标志。

于 2010-04-27T00:03:41.280 回答
1
  1. Cchar通常是一个字节,因此请尝试使用 AL 而不是 EAX(这是指同一寄存器的最低位字节)。
  2. 严格来说,RET 指令只是简单地从堆栈中弹出返回地址并将控制权转移到那里。标准的 x86 调用约定确实表明返回值应该放在 EAX 中。
于 2010-04-27T00:00:11.117 回答
1

是的,至少对于 x86 上的大多数 C 编译器(尽管理论上不能保证),您在 [[e]a]x 中输入的任何内容都将被视为 1/2/4 字节的返回值。

不,char 不会(通常)是一个双字——它将是一个字节。

char encode(char plaintext) { 
    __asm { 
        mov al, plaintext
        add al, 2
        leave
        ret
    }
}
于 2010-04-27T00:00:20.757 回答
0

一个 char 是 8 位或一个字节。寄存器 eax 是 32 位,或 4 个字节,或两个 16 位字,或一个 32 位 dword。被识别为返回的内容取决于编译器和代码,但在 eax 中放置一个值可能会返回该 32 位值。

于 2010-04-27T00:07:59.193 回答