次のアセンブリコードが無効かどうかを調べようとしています。
movb $0xF, (%bl)
無効ですか?もしそうなら、なぜですか?ありがとう。
次のアセンブリコードが無効かどうかを調べようとしています。
movb $0xF, (%bl)
無効ですか?もしそうなら、なぜですか?ありがとう。
あなたはどのプロセッサを言うのではありません。bl
は少なくともx86プロセッサでは8ビットレジスタですが、アドレス指定には使用できません。
なぜ無効な命令なのですか?アセンブリ命令が無効である理由は、特定のプロセッサにそのような命令がないためです。この命令をエンコードする方法はありません。この場合(x86を想定)、bl
アドレス指定にどちらも使用しない、またはその他の8ビットレジスタは必要ないと見なされています。16ビットコードでは、16ビットレジスタ、、、のみがbx
メモリアドレス指定に使用できます。ウィキペディアには、考えられるすべてのアドレッシングモードの便利なリストがあります(Intel構文を使用していることに注意してください。コードはAT&T構文です)。bp
si
di
編集: AT&T構文では、の文字b
はmovb
8ビットオペランドを処理することを定義しています。
(アドレス指定に使用する)目標を多かれ少なかれ取得するにbl
は、次のいずれかを実行できます(これらは、Intel YASM / NASM構文であり、GNUを含むMASMスタイルのアセンブラーが.intel_syntax noprefix
必要ですbyte ptr
)。
16ビットコードの場合:
xor bh,bh
mov byte [bx], 0x0f
32ビットコードの場合:
movzx ebx,bl
mov byte [ebx], 0x0f
64ビットコードの場合:
movzx ebx,bl ; with implicit zero-extension to 64-bit
mov byte [rbx], 0x0f
0..255(1バイト)からの線形アドレスに何かを格納したいということはめったにありません。セグメンテーションがほとんど無効になっているためDSベースが0に固定されている64ビットモードでは、これは間違いなく命令が実行していることですが、特に16ビットモードでは、DSベースがゼロ以外になる可能性があります。
この質問は、おそらくCSAPPの本、PracticeProblem3.3からのものです。AT&Tアセンブリのアドレスレジスタとして8ビットレジスタ(%bl)を使用することはできません(Intelについてはよくわかりません)。さらに、$ 0xFが8、16、または32ビット値であるかどうかを判別することはできません。