アセンブリでこれを行うことができますmov eax, [ax]
か、それともサイズを指定する必要がありますかmov eax, dword [ax]
?
2 に答える
[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 がそれを受け入れたとしても、意図したとおりに動作するわけではありません...
いいえ、それらのオペランドは一致しません。EAX にアクセスできる 32 ビット システムでは、アドレスにも同じサイズを使用する必要があります。
mov eax, [eax]
EAX のポインターを、それが指す値に置き換えます。