0

アセンブリ (x86) 言語で MOV 命令を使用して、これらの方法でメモリ オペランドをセグメント レジスタに移動できますか?

1.

MOV DS、[BX]

2.

MOV DS、[6401H]

4

3 に答える 3

1

はい、両方のアドレッシング モードが有効です。

この質問には、Masm と Nasm の両方のタグが付けられています。それらは同じではありません。メモリ参照が必要であることを Masm に納得させるには、そうする必要があるかもしれませんmov ds, ds:[6401h]- 奇妙なことですが、それはアセンブラの構文です - または、私が最後に Masm を使用したとき (ずっと前に!) でした。冗長性ds:はMasmで最適化され、Nasmはそれを発行します。Fasm がこれを行わない場合、Fasm は壊れています (これは疑わしいです! Tomasz は天才です!)... Fasm で試してみたところ、問題なく動作しました!

ちなみに、32 ビット アドレスにはセグメント レジスタが含まれます。OS が設定します。「ユーザーランド」コードでそれらを使用することはめったにありませんが、それらはまだそこにあります。(64ビットコード、いいえ-しかし、私はそれについて確信が持てません)。

于 2012-11-17T16:18:01.430 に答える
1

はい、インテルは をサポートしています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]は、許可されます。

于 2012-11-17T08:24:04.530 に答える
0

おい - 今世紀、誰もDSレジスタを使用していません:)!

32 ビット アセンブラを学習することを強くお勧めします。Linux にアクセスできる場合、これは優れたリソースです。

あなたの質問に答えるために-私は「いいえ」と信じています。通常、AX レジスタから DS をロードします (ただし、他の 3 つの汎用レジスタのいずれも使用できます)。

確実に確認するには、インテルのリファレンス マニュアルを調べてください (Google で見つけることができるはずです)。

PS:

「32 ビット」と言うとき、x86-32 について学んだことはすべて x86-64 に直接適用できることを急いで付け加えておきます。しかし、16 ビット DOS について学んだことの多く (ほとんど?) は、現在の(仮想メモリ/線形アドレス空間と読む) システムには適用できません。

私見では...

于 2012-11-17T08:22:42.920 に答える