2016-09-14 5 views
1

私はむしろOFFSET演算子の概念に混乱しています。 Kip R. Irvineの「x86プロセッサのアセンブリ言語」によれば、変数の距離を囲むセグメントの先頭から返す演算子としてOffset Operatorを定義しています。また、Offset Operatorは、データラベルのオフセットを返します。これは、データセグメントの先頭からのラベルの距離(バイト単位)を表します。オフセットは何ですか?データセグメントの先頭からラベルの距離がどういう意味ですか? また、彼はこの結果にについて来た:OFFSETプロセッサのアセンブリ言語の演算子

を彼は、3種類の変数を宣言:BVALはに位置していた場合

.data 
bVal BYTE ? 
wVal WORD ? 
dVal DWORD ? 
dVal2 DWORD ? 

を00404000(16進数)のオフセット、OFFSETオペレータは次の値を返します:

mov esi, OFFSET bVal  ;ESI = 00404000h 
mov esi, OFFSET wVal  ;ESI = 00404001h 
mov esi, OFFSET dVal  ;ESI = 00404003h 
mov esi, OFFSET dVal2 ;ESI = 00404007h 

ここで彼はその値に達しましたか?助けてください。どうもありがとうございます!

+5

変数bVal、wVal、dVal、dVal2のそれぞれを構成するバイト数を調べ、それらがすべてメモリ内に順番に配置されていることを想像してください。そして 'ESI ='のそれぞれの値を見てください。オフセットは、「私にラベルのアドレスを教えてください」と言っています。 004040000hのオフセットは任意であり、説明のために使用される。 –

答えて

1

オフセットの理論は、 "オフセットは、指定された絶対アドレスに行くために、ベースのアドレスのアドレスの位置の数です"という意味です。だから、これはインデックスのように見えます(データ項目またはフィールド)。配列(データ要素またはブロックまたはフレーム)。オフセットはデータ項目とデータ要素の間の距離を示します。要素のすべての項目は同じサイズです(通常はバイトまたはワードで指定されます)。

あなたのケースでは、 "。データ"はメモリセグメント、ブロックまたは要素であり、このセグメントの変数はデータ項目またはオフセットです。このオフセットは、非連続領域の空間の仮想アドレスです。この数は、物理メモリの非連続領域の空間の仮想アドレスを表します。

2

通常のOSでは、仮想メモリはフラットであり、すべてのセグメントはbase = 0です。

OFFSET varは、varというアドレスを直接ロードするのではなく、即時に指定するというだけの複雑な方法です。

mov esi, bVal   ; load from [bVal], in MASM syntax 

mov esi, OFFSET bVal ; esi= address of bVal 
mov esi, [esi]   ; load from [bVal] 

MASMとNASMの文法の違いのためにもAssembly difference between [var], and var参照してください。

関連する問題