重複の可能性:
movsbl命令は何をしますか?
プログラムを逆アセンブルすると、本当に独特な指示が見つかりました。
0x0000000000401106: movsbl (%rbx,%rax,1),%ecx
私はmovsblが何をするか知っていると思います:それは基本的にバイトを拡張し、先頭のもの(符号拡張)をレジスタに追加します。
しかし、それが上記の文脈で使用されたときにそれが何をするのか、私にはまったくわかりません。
この指示に光を当てることができれば幸いです。
重複の可能性:
movsbl命令は何をしますか?
プログラムを逆アセンブルすると、本当に独特な指示が見つかりました。
0x0000000000401106: movsbl (%rbx,%rax,1),%ecx
私はmovsblが何をするか知っていると思います:それは基本的にバイトを拡張し、先頭のもの(符号拡張)をレジスタに追加します。
しかし、それが上記の文脈で使用されたときにそれが何をするのか、私にはまったくわかりません。
この指示に光を当てることができれば幸いです。
指示
movsbl <%rbx,%rax,1>,%ecx
最初のオペランドでアドレス指定されたメモリ位置から1バイトを読み取り、signはそのバイトを32ビットに拡張し、結果をecx
レジスタに格納します。
今から<%rbx,%rax,1>
。rbx
これは、との値を合計することによって形成されるメモリアドレスを単に示しますrax
。ご参考までに、1
はに適用される乗数rax
です。
その命令はアドレスからバイトをロードしrbx+rax
、signはそれをに拡張しecx
ます。符号拡張は、ソースの最上位ビットを宛先の最上位ビットに複製するため、常に「先頭のビット」であるとは限らないことに注意してください。これは、2の補数の符号付き数値として解釈されたときに、値が変更されないようにするためです。