1. ホーム
  2. c

[解決済み] この関数の movzbl 呼び出しについて理解する手助けが必要です。

2022-02-01 01:34:42

質問

そこで、ここにあるアセンブリを見てCのコードを書こうとしています。

pushl   %ebp
movl    %esp, %ebp
movl    12(%ebp), %eax
addl    8(%ebp), %eax
movzbl  (%eax), %eax
movsbl  %al,%eax
popl    %ebp
ret

2つの変数があり、それらが足し合わされているのはわかりますが、関数がmovzblとmovesblを呼び出し始めるときを見ると、迷ってしまいます。 どうなっているのでしょうか?

どのように解決するのですか?

対応するCの関数は次のようなものです。

char fn(char * string, int index)
{
    return string[index];
}

具体的には movzbl 命令は、2つのパラメータの和に格納されているバイトをフェッチしてゼロパッドし、それを eax . そのため movsbl は、eax の最下位バイトを取り、符号拡張し、結果を eax に戻す命令です。