5

誰かがこれらの 3 つの命令の機能を説明できますか?

  ORG 1000H 
  MOV AX,CS
  MOV DS,AX

コード、データ、および余分なセグメントが理論上何であるかはわかっていますが、次のとおりです。

  1. それらはこのプログラムでどのように実装されていますか?

  2. セグメント全体が別のセグメントに移動したのはなぜですか? (MOV AX,CSMOV DS,AX)

これらの 2 つの命令は実際に何をしますか?

ハイライトされた 3 つの命令を除いて、このコードの他のすべての命令の意味を理解できます。

(プログラムは正常に動作します。0 がヒットするまで入力を受け入れます。amov ah,01hと anがありint 21h、比較alして、そうで'0'あればal'0'ジャンプしlast、そうでない場合は にジャンプしbackます。)

    ASSUME CS:CODE        
    CODE SEGMENT 
    ORG 1000H
    MOV AX,CS
    MOV DS,AX
BACK:
    MOV AH,01H
    INT 21H
    CMP AL,'0'
    JZ LAST
    JMP BACK
LAST:
    MOV AX,4C00H
    INT 21H
    CODE ENDS

    END

(編集者注:.comプログラムはオフセットでロードされ100h、すべてのセグメント レジスタは互いに等しく設定されます 。これはプログラムのように見えるため、org 1000hおそらくタイプミスです。このプログラムは絶対アドレスを使用せず、相対アドレスのみを使用するため、壊れません。ジャンプします。)org 100h.com

4

3 に答える 3

12

概念を実際に説明するには、セグメントの基本的な考え方と、x86 がそれらを (リアル モードで) 使用する方法に戻る必要があります。

8086 には 20 ビットのアドレッシングがありますが、レジスタは 16 ビットしかありません。20 ビット アドレスを生成するために、セグメントとオフセットを組み合わせます。セグメントは、セグメント レジスタ (CS、DS、ES、または SS) に存在する必要があります。次に、オフセットを (即値として、または別のレジスタまたは 2 つの内容として) 生成します。

したがって、アドレスを生成するには、16 ビットのセグメント レジスタを 4 ビット左にシフトし、それに別のレジスタの 16 ビット オフセットを加えて、合計を実際のアドレスとして使用します。ほとんどの命令にはデフォルトのセグメントが付加されておりpushpopそれに関連するものbpはすべて使用されますss。ジャンプなどに使用cs。一部の文字列命令es(例: scans) と一部の用途では、2 つのセグメントを使用します。たとえば、データを からにmovsdコピーします。他のほとんどの命令は を使用します。セグメントのオーバーライドを使用して、 のようにアドレスを明示的に指定することもできます。[ds:si][es:di]dses:bx

いずれにせよ、セグメント レジスタを有意義に使用する前に、まず、関心のあるデータのアドレス (上位 16 ビット) をロードする必要があります。典型的な「小さなモデル」プログラムは、次のようなものから始まります。

mov ax, @Data
mov ds, ax

小さなモデルでは、データとコードに同じセグメントを使用します。正しいセグメントを参照していることを確認するには、CS から 16 ビットを取得して DS にコピーします。他の多くの人が言及しているように、CS を直接 DS に移行する指示はありません。質問は1つの可能性に言及しています。別の一般的なものは次のとおりです。

push cs
pop ds
于 2011-03-19T20:54:39.663 に答える
8

ORG 1000H は、後続のコードをコード イメージのオフセット 1000H に配置する必要があることをアセンブラーに通知します。

他の 2 つの命令は、CS を DS にコピーします。セグメント自体をコピーするのではなく、データ セグメントへのポインタを更新するだけです。小さなプログラム (<64K) の場合、静的データ (ソース内の文字列リテラル、間接ジャンプ テーブル) は、コードと同じセグメントにまとめて配置できます。静的データにアクセスする前に、セグメント ベース ポインタを DS にロードする必要があります。ローダー (プログラムをディスクからメモリに読み取り、実行を開始する OS の一部) は、プログラムを実行できるように CS を設定する必要がありますが、DS を設定しない場合があるため、プログラムは開始時に CS を DS にコピーします。

「MOV DS, CS」は正当な 8086 命令ではないため、2 つの命令シーケンスが必要です。

于 2011-03-19T19:24:41.183 に答える
1

あなたにはできない

MOV DS, CS

無効な操作です (masm 32: error A2070: invalid instruction operands)。

MOV AX, CS
MOV DS, AX

mov ds, csこれらの 2 つの命令は (無効な) と同じように実行します。このようにして、アセンブラーは満足し、文句を言いません。しかし、なぜプログラマーがデータ セグメントをコード セグメントと同じにしたいのかはわかりません。

于 2011-03-19T19:15:31.130 に答える