5

アセンブリプログラミング言語を学ぶことにしました。この 8086 チュートリアルを使用しています。一番下の演習は、いくつかの命令のエラーを見つけることであり、そのうちの 1 つは次のとおりです。

mov cx, ch 

SO について、このトピックでそれを達成する方法を説明する同様の質問を見つけましたが、この操作が禁止されている理由を知りたいですか?

CHに10d = 00001010bがあり、それをCLに入れ、同時にCHを消去したいとしましょう。mov cx, ch10d を 16bit 00000000 00001010 と表示し、CH と CL にそれぞれ入れる (CX 全体) のでそうするようです。

何が問題なのですか? また、チュートリアルでこの式のエラーを見つけるよう求められるのはなぜですか?

4

4 に答える 4

8

このmov命令は、同じサイズのオペランド間を移動するために使用されます。あなたがしたいのは、8ビットを16ビットに拡張することです。そのために利用できる命令が 2 つあります。chcx

movzx cx,ch  ; zero-extends ch into cx. the upper byte of cx will be filled with zeroes
movsx cx,ch  ; sign-extends ch into cx. the upper byte of cx will be filled with the most significant bit of ch

この特定のケースで同じことを達成する別の方法は次のとおりです。

shr cx,8  ; zero-extend
sar cx,8  ; sign-extend
于 2015-04-18T11:44:37.627 に答える
2

問題は、8 ビット レジスタの内容をch16 ビット レジスタに移動しようとしていることですcx。レジスタのサイズが異なるため、それはできません。

したがって、 「無効なオペコードとオペランドの組み合わせ」のようなエラー メッセージが表示されると思います。

ps : 上記の 8 と 16 を交換します。発言はそのまま。たとえば、この概要を確認してください。ご覧のとおり、異なるレジスタ サイズの組み合わせは定義されていません。を表す OPcode が存在しないことを意味しmov cx, chます。

于 2015-04-18T11:43:53.347 に答える
0

簡単な指示でそれを行うだけです

mov cl,ch  ; copy high bits to low
xor ch,ch  ; clear high-bits

これは 16 ビット プログラミングでは一般的で、2 クロック サイクルしかかかりません。

movezx/movsx の使用には3 クロック サイクルが必要です。使用する

movsx cx,ch

符号拡張を使用してバイトをワードに移動するため

movzx cx,ch

ゼロ拡張でバイトをワードに移動する

于 2017-03-12T08:56:55.400 に答える