1

私は次のコードを持っています:

mov  ax,@data
mov  ds,ax

なんでこんな風に書けないの?

mov ds,@data

すべてのソース:

   .MODEL small
   .STACK 100h
   .DATA
   HelloMessage DB 'Hello, world',13,10,'$'
   .CODE 
   .startup
   mov  ax,@data
   mov  ds,ax
   mov  ah,9
   mov  dx,OFFSET HelloMessage
   int  21h
   mov  ah,4ch
   int  21h
   END

ありがとうございました!

4

3 に答える 3

4

命令セットにはそれを行うための命令が含まれていないため、できません。これは、x86の多くの特異性の1つにすぎません。

この種の制限は、アセンブリ言語ではごく普通のことです。ほとんどのアーキテクチャには、特別に処理されるいくつかのレジスタ(たとえば、プロセッサステータスワード)が含まれていますが、通常はx86アーキテクチャよりも少なくなります。

考えられるすべての移動に対して命令を提供しない理由は、命令セットのサイズを小さくして、命令が使用するメモリを少なくするためです。全体として、2つのステップでほとんど必要とされない移動を行う方が効率的です。

于 2010-09-11T08:01:00.607 に答える
1

「ax」としての汎用レジスタは、データを指す16ビットの数値を保持するように設計されています(この場合、DATA内の文字列)

そのため、データを特殊レジスタ (ここでは ds またはデータ セグメント) に直接渡そうとすると、その方法でデータを受け入れることを認識していないため、正しく機能しません。したがって、最初にその「番号」またはデータが開始するメモリ位置のポイントを取得し、そのポイントを ds レジスタに渡します。

于 2010-09-11T08:17:52.680 に答える
0

私は専門家ではありませんが、これがこの制約が機能することを理解する方法です。

セグメント レジスタは、メモリのどのセグメントがレジスタ命令によって使用されるかを制御するために使用されます。そのため、最後にメモリ ロケーションからセグメント レジスタ (この場合は DS はデータ セグメント レジスタ) をロードする必要があります。DS を変更すると、DS の更新プロセス中に読み取られるメモリ位置が変更される可能性があります。つまり、DS にロードされる最初のビット/バイトは、残りが読み取られる前に別のセグメントを指すようになります。値をアキュムレータ (AX) または別の汎用レジスタに読み込む方が安全です。そのため、セグメント レジスタにロードされたときに値がプロセッサにあるため、ロード中に値が破損する可能性はありません。

于 2010-09-11T07:26:30.157 に答える