これに関するWebリソースはまばらなので、今後の検索のために、まずIA-32アセンブリ言語(NASM)のアドレスモードを一覧表示してから、簡単な質問を続けます。
上記はNASM用であることに注意してください。 MASM/TASMの場合、「mov esi、OFFSET foo」を使用してアドレスを取得し、「mov esi、foo」と「movesi、[foo]」の両方が値を取得します(@Michaelへのクレジット)。
だから、私の質問に。これは、次のチュートリアルの29ページの下部にある例に関連しています。 http://www.tutorialspoint.com/Assembly_programming/Assembly_tutorial.pdf
基本的に、間接メモリアドレス指定の例として以下のコードをリストします。
MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110 ; MY_TABLE[0] = 110
ADD EBX, 2 ; EBX = EBX +2
MOV [EBX], 123 ; MY_TABLE[1] = 123
私の質問:
NASM構文では、その命令はMOV EBX, MY_TABLE
である必要があります。 MOV EBX, [MY_TABLE]
が行うことは、MY_TABLE
にある最初の4バイトをEBX
にロードすることです。もう1つの方法は、LEA EBX, [MY_TABLE]
のように LEA
を使用することです。
この場合、チュートリアルは正しいです。 MY_TABLE
は単語の配列として定義されます。 x86上のWordは2バイトであるため、MY_TABLE
の2番目の要素は実際にはMY_TABLE + 2
にあります。
そのチュートリアルは、有効なNASMコードでさえありません。 吸わないx86ガイド/リソース/マニュアルへのリンクについては、SOの x86タグwiki を参照してください。
MOV [EBX], 110
は どちらのオペランドもオペランドサイズを意味しない であるため、アセンブルされません。 (MASMでさえアセンブルしないと思いますが、emu8086のようないくつかの悪いアセンブラーには、このような命令のデフォルトのオペランドサイズがあります。)mov Word [ebx], 110
は16ビットストアを実行します。
MOV EBX, [MY_TABLE]
はアセンブルしますが、テーブルから最初の2ワードをロードします。 mov ebx, MY_TABLE
はアドレスをレジスタに入れます。