6

私は x86 アセンブリに不慣れで、このドキュメントのコードを理解しようとしています: http://www.cs.cmu.edu/~410-s07/p4/p4-boot.pdfページ 3:

movw $0x1234, %ax
movw %ax, %ds
movw $0x5678, %bx
# The following instruction is the same as "movw $0x1337, (%bx)".
movw $0x1337, %ds:(%bx) # Places 0x1337 into memory word 0x179b8.
# Segment Base: %ds << 4: 12340
# Offset: %bx: + 5678
# -------
# Linear Address: 179b8

しかし、私はコマンドを理解していません:

movw $0x1337, %ds:(%bx) # Places 0x1337 into memory word 0x179b8.

%ds と (%bx) の連結が ((%ds << 4) | %bx) と同じなのはなぜですか?

私はリアル モード (16 ビット) であるため、連結は %ds << 8であってはなりません。%ds << 4の代わりに?

そして、括弧が %bx のすぐ近くにあるのはなぜですか? そして、次のような構造全体ではありません: movw $0x1337, (%ds:%bx) ?

4

1 に答える 1

9

リアル モードでは、セグメント レジスタを使用して 20 ビット アドレスを提供します。この場合、データ セグメント レジスタdsはアドレスの「上位」16 ビット (0x1234 << 4 = 0x12340) を提供し、セグメント内のオフセットは 0x5678 で与えられ、0x179b8 が得られます。

データ セグメント レジスタは暗黙的であるため、使用する必要はありません: ds:(%bx)。のような別のセグメント レジスタを使用している場合はes、明示的である必要があります。

私はあなたの質問を理解したと思います. と書かれていない理由について(%ds:%bx)は、それは実際には構文上の決定に過ぎません。

于 2013-09-11T09:07:40.947 に答える