3

一部の 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 に対して小さすぎる/大きすぎると文句を言うことです。どちらも DWORD であるという印象を受けました。また、変数を eax に残して、アセンブリに ret すると、実際にはその変数が返されますよね?

4

4 に答える 4

2

何かを翻訳する方法のヒントについては、acファイルのアセンブラー出力をいつでも確認できることを忘れないでください。これは通常、有効にする必要がある単一のフラグです。

于 2010-04-27T00:03:41.280 に答える
1
  1. Ccharは通常1バイトなので、EAXの代わりにALを使用してみてください(これは同じレジスタの最下位バイトを指します)。
  2. 厳密に言えば、RET命令は単にスタックからリターンアドレスをポップし、そこに制御を移します。標準のx86呼び出し規約では、戻り値はEAXに配置する必要があるとされています。
于 2010-04-27T00:00:11.117 に答える
1

はい、少なくともx86上のほとんどのCコンパイラでは(理論的には保証されていませんが)、[[e]a]xに入力したものはすべて1/2/4バイトの戻り値として扱われます。

いいえ、charは(通常は)dwordではありません-バイトになります。

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

char は 8 ビット、つまり 1 バイトです。レジスタ eax は 32 ビット、または 4 バイト、または 2 つの 16 ビット ワード、または 1 つの 32 ビット dword です。そして何を返すと認識されるかはコンパイラやコードによって異なりますが、eax に値を入れるとおそらくその 32 ビット値が返されます。

于 2010-04-27T00:07:59.193 に答える