のはなぜですかmov指導して使用axの代わりに二つのセグメントを登録す。
-
06-09-2019 - |
質問
見ようなコード:
mov ax, cs
mov ds, ax
mov es, ax
できないのはなぜで圧縮す:
mov ds, cs
mov es, cs
最初の方がはるかに速からのアキュムレータ。もなう直感的な年とクリティカルセグメント レジスタ.やはり制限があることん知らなか?
を使用していnasmにあります。
解決
あなたはMOVセグメントは、セグメント・レジスタに登録することはできません - それのための指示はありません。
。他のヒント
すべての手順については、マイクロプロセッサのための唯一のそんなに部屋があります。だから、一つの一般的指示は、多くの場合、セグメントレジスタを変更することはほとんどありませんuused操作湖のためのいくつかの特別な目的のものよりも好ましいです。また、いくつかのプロセッサのための命令の数は絶対的アーキテクチャによって限定される - それらはすべて単一バイトで符号化されたOPコードを持っていたように、例えば、元の8080プロセッサは256の命令に限定された
。これは実際にアセンブリ言語が、これらの操作を妨げる根本的な機械語ではありません。
アセンブリは、単語やニーモニックを読みやすいで構成されているが、それらは実際には非常に直接マシンコードの1と0を表します。 x86 CPU上で各命令は、典型的には、個々のバイトまたは意味を有するバイト内の偶数ビットとバイトのシーケンスで構成されています。特定のビットは、他のモードをアドレッシングrel="nofollow">のmov命令のソースおよび宛先として使用されるべき表す。
CPUアーキテクチャが単純だったときは、今のプロセッサのx86ファミリーは、1970年代に長い道を戻って行きます。当時アキュムレータのの概念が重要な鍵だった - ax
は16ですビットのx86アキュムレータ。すべての計算は、構築や、それはすべての命令に利用可能であったように、このレジスタに「蓄積」されました。その他の汎用レジスタは、使用のより制限された範囲を持っています。
命令はバイトに基づいていたので、あなたは速い命令デコードを維持するために可能な限りの命令を表現するなど、いくつかのバイトを望んでいました。できるだけ短いなど多くの命令を保つために、アキュムレータの使用が中心作られています。
モトローラは、より汎用レジスタを680x0のような、より近代的なCPU上では、以前アキュムレータのドメインたより多くの能力を持っています。 RISC CPU上のすべてのレジスタは、アキュムレータのように柔軟です。私は、64ビットモードでは、現在のx86 / AMD64命令セットは今はるかに少ない制限されていることを聞いたことがあります。
の インテル-マニュアル、中巻2命令セット-リファレン-325383-056US月2015 "MOV移動"欄に"指導".
の16ビットmovレジスタへ符号化された:
mov r/m16, Sreg
と"3.1.1.3命令列のOpcodeの概要テーブル"を説明:
- r/m16—ワ汎用登録やメモリのオペランド使用のための指示がオペランド-サイズ 属性は16ビット.の汎用レジスタ:AX-CX-DX-BX、SP、BP、SI、ジ。
- Sreg—セグメント登録があります。
このように mov ds, cs
ない的な、ありません mov Sreg, Sreg
バージョン。