インテルソフトウェア開発者マニュアル(この記事ではISDMと呼ばれます)とx86 Instruction Set Reference(これは前者のコピーです)から、mov
命令データをeax/ax/al
からメモリオフセットに、またはその逆に移動することができます。NASMと8ビットメモリオフセットの混乱
たとえば、mov moffs8, al
moffs8
オフセット一部8ビットメモリにal
レジスタの内容を移動させます。
今、moffs8
とは何ですか? - 単純なメモリ変数(メモリオフセット)タイプバイト、ワード、またはMOVのいくつかの変形例で使用をダブルワード
moffs8、moffs16、moffs32、moffs64:ISDM(3.1.1.3)を引用命令。実際のアドレスはセグメントベースに対して単純なオフセットで与えられます。命令にはModR/Mバイトは使用されません。
moffs
で示される数値は、そのサイズがであることを示します。これは、命令のアドレスサイズ属性によって決まります。
私はmoffs8
のタイプがバイトで、サイズは8ビットであることを言って文章を強調しました。
私はアセンブリの初心者ですから、これを読んだ直後に、私はmov moffs8, al
命令でNASMを使い始めました。ここで私が書いたコードは次のとおりです。
; File name: mov_8_bit_al.s
USE32
section .text
mov BYTE [data], al
section .bss
data resb 2
これは(16進数で)nasm -f bin mov_8_bit_al.s
が生成するものである:
A2 08 00 00 00
は、ここで私はこれを理解方法は次のとおりです。
A2
はMOV moffs8, AL
のオペコードです08
は、サイズがのメモリオフセット自体です。1バイト は
00 00 00
メモリが相殺されることが08 00 00 00
のように見えるいくつかのゴミ
であるが、この場合には、それがmoffs32
、ないmoffs8
です!したがって、CPUはA2
を実行している間に1バイトだけを読み込み、ADD
命令またはそれ以外のものとして、00
を扱います。
NASMはここで無効なバイトコードを生成しているように見えますが、私はそれが誤解されている人ですね... NASMはIDSMに従っていないのでしょうか?もしそうなら、そのコードはインテルのCPU上では正しく実行されないので、それを実行する必要があります!
私が間違っている場所を教えていただけますか?
命令のアドレスサイズ属性はどこで取得できますか? – ForceBru
@ForceBruこれは、アドレスのサイズとアドレスのサイズに依存します。プレフィックス – harold
ああ、32ビットモードで実行していて、プレフィックスがない場合、アドレスは4バイトを占めるでしょうか? – ForceBru