1

最初の引数として指定された文字列の長さを決定する関数を作成しようとしているので、%rdi には char *ptr が含まれます。movb (%rdi),%rcx%rdi が指す文字を %rcx に移動するために呼び出すと、次のエラーが表示されます:
incorrect register '%rdx' used with 'b' suffix x86-64 では特定のレジスタのみがバイトを保持できるため、バイトを? または、文字列の各バイトで文字を抽出するために使用している方法が間違っていますか?

4

1 に答える 1

2

すべての汎用レジスターには、、 、 、 、 、、~alとして個別にアドレス指定可能な下位 8 ビットがあります(インテルのドキュメントではサフィックスを使用しています)。さらに、ビット 8..15 もアドレス可能なものもいくつかあります 。blcldlsildilbplsplr8br15blahbhchdh

したがって、バイトのみをロードする場合は、上記のいずれかを使用できます。または、ゼロまたは符号拡張を使用してバイトデータを拡張することもできます。たとえば、あなたのケースではmovzbl (%rdi), %ecx(読み取り:ゼロ拡張バイトを long に移動します)。32 ビット レジスタを操作すると、「親」の 64 ビット レジスタの上位 32 ビットがゼロになりますが、8 ビットまたは 16 ビットのサブレジスタを操作すると、残りのビットは変更されません。

おそらく、インテルのマニュアルの基本アーキテクチャーのセクションを (再) 読むべきだと思います。

于 2013-10-23T00:29:43.770 に答える