1

次のアセンブリコードが無効かどうかを調べようとしています。

movb $0xF, (%bl)

無効ですか?もしそうなら、なぜですか?ありがとう。

4

2 に答える 2

7

あなたはどのプロセッサを言うのではありません。blは少なくともx86プロセッサでは8ビットレジスタですが、アドレス指定には使用できません。

なぜ無効な命令なのですか?アセンブリ命令が無効である理由は、特定のプロセッサにそのような命令がないためです。この命令をエンコードする方法はありません。この場合(x86を想定)、blアドレス指定にどちらも使用しない、またはその他の8ビットレジスタは必要ないと見なされています。16ビットコードでは、16ビットレジスタ、、、のみがbxメモリアドレス指定に使用できます。ウィキペディアには、考えられるすべてのアドレッシングモードの便利なリストがあります(Intel構文を使用していることに注意してください。コードはAT&T構文です)。bpsidi

編集: AT&T構文では、の文字b​​はmovb8ビットオペランドを処理することを定義しています。

(アドレス指定に使用する)目標を多かれ少なかれ取得するに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ベースがゼロ以外になる可能性があります。

于 2013-01-24T05:41:27.697 に答える
0

この質問は、おそらくCSAPPの本、PracticeProblem3.3からのものです。AT&Tアセンブリのアドレスレジスタとして8ビットレジスタ(%bl)を使用することはできません(Intelについてはよくわかりません)。さらに、$ 0xFが8、16、または32ビット値であるかどうかを判別することはできません。

于 2018-10-02T15:46:38.763 に答える