アセンブリ (x86) 言語で MOV 命令を使用して、これらの方法でメモリ オペランドをセグメント レジスタに移動できますか?
1.
MOV DS、[BX]
2.
MOV DS、[6401H]
はい、両方のアドレッシング モードが有効です。
この質問には、Masm と Nasm の両方のタグが付けられています。それらは同じではありません。メモリ参照が必要であることを Masm に納得させるには、そうする必要があるかもしれませんmov ds, ds:[6401h]
- 奇妙なことですが、それはアセンブラの構文です - または、私が最後に Masm を使用したとき (ずっと前に!) でした。冗長性ds:
はMasmで最適化され、Nasmはそれを発行します。Fasm がこれを行わない場合、Fasm は壊れています (これは疑わしいです! Tomasz は天才です!)... Fasm で試してみたところ、問題なく動作しました!
ちなみに、32 ビット アドレスにはセグメント レジスタが含まれます。OS が設定します。「ユーザーランド」コードでそれらを使用することはめったにありませんが、それらはまだそこにあります。(64ビットコード、いいえ-しかし、私はそれについて確信が持てません)。
はい、インテルは をサポートしていますmov ds, reg/mem
が、たとえば はサポートしていませんmov ds, imm16
。
確認するには1) gcc -c foo.s; objdump -d foo.o
mov (%bx), %ds
mov 1231(%bx), %ds
d: 67 8e 1f mov (%bx),%ds
10: 67 8e 9f cf 04 mov 0x4cf(%bx),%ds
PE 386 の命令は gcc/cygwin で
;に変換されるため、 2)の検証はよりトリッキーになります。mov 0x7b, %reg
しかし、それはどのレジスタにも当てはまります。80286 OTOH には、アドレッシング モードがありますmov [0x1111], reg
。
mov (123), %ds // the target is protected mode 386
mov (123), %bx
15: 8e 1d 7b 00 00 00 mov 0x7b,%ds
1b: 66 8b 1d 7b 00 00 00 mov 0x7b,%bx
質問 2) についてはおそらく paulsm4 が正しいでしょう。たとえば、フラット アセンブラーはmov ax,[123]
8086 モードでコンパイルできますが、 mov ds,[123]
.
ただし、ルールの一部の曲げを許可する場合、たとえば、bx/bp/[sp]/di/si のいずれかがゼロになる場合mov ds, [1234 + reg]
は、許可されます。
おい - 今世紀、誰もDSレジスタを使用していません:)!
32 ビット アセンブラを学習することを強くお勧めします。Linux にアクセスできる場合、これは優れたリソースです。
あなたの質問に答えるために-私は「いいえ」と信じています。通常、AX レジスタから DS をロードします (ただし、他の 3 つの汎用レジスタのいずれも使用できます)。
確実に確認するには、インテルのリファレンス マニュアルを調べてください (Google で見つけることができるはずです)。
PS:
「32 ビット」と言うとき、x86-32 について学んだことはすべて x86-64 に直接適用できることを急いで付け加えておきます。しかし、16 ビット DOS について学んだことの多く (ほとんど?) は、現在の(仮想メモリ/線形アドレス空間と読む) システムには適用できません。
私見では...