0

アセンブリでこれを行うことができますmov eax, [ax]か、それともサイズを指定する必要がありますかmov eax, dword [ax]?

4

2 に答える 2

4

[ax]は有効な 16 ビット アドレッシング モードではありません。に変更すると、それmov ebx, [bx]を行うことができます。は操作のebxサイズを決定するため、 と言う必要はありませんdword。32 ビット モードで[bx]は、「有用な」アドレスになる可能性は低いですが、「有効な」コードです。32 ビット モードでは、mov al, [eax]mov ax, [eax]およびmov eax, [eax]はすべて有効であり、サイズはデスティネーション レジスタのサイズによって決まりますが、わかりやすくするために「バイト」、「ワード」、または「dword」と表現することをお勧めします。この場合(!)、サイズが一致する必要はありません。

FWIW、16 ビット コードで 32 ビット命令と 32 ビット アドレッシング モードを使用することは可能です。アドレス全体がセグメント制限 (通常は 64k) 内にある必要がありますが、mov eax, [eax + ecx * 4]有効なコードです。Nasm (または他の「有能な」アセンブラ) は、必要な「オペランド サイズ オーバーライド プレフィックス」と「アドレス サイズ オーバーライド プレフィックス」(0x66 および 0x67) を生成します。

これらのことを試すことを恐れないでください... Nasm が拒否している理由は明らかではないかもしれませんが、Nasm がそれを受け入れたとしても、意図したとおりに動作するわけではありません...

于 2012-11-11T22:33:04.247 に答える
2

いいえ、それらのオペランドは一致しません。EAX にアクセスできる 32 ビット システムでは、アドレスにも同じサイズを使用する必要があります。

mov eax, [eax]

EAX のポインターを、それが指す値に置き換えます。

于 2012-11-11T20:44:17.897 に答える