Employee STRUCT
IdNum BYTE "000000000" ; 9
LastName BYTE 30 DUP(0) ; 30
ALIGN WORD ; 1 byte added
Years WORD 30 ; 2
ALIGN DWORD ; 2 byte added
SalaryHistory DWORD 0,0,0,0 ; 16
Employee ENDS
employees Employee 5 DUP (<"123456789","AAAAAAAA",30h,4 DUP(0EEEEEEEEh)>)
mov eax,TYPE Employee ; it says used 60byte space
を使用しますが、私は、メモリ上で見たとき、それは57バイトの領域を使用すると言う
mov esi,SIZEOF Employee;
mov eax,employees[esi].Years
ので、私はそれを使用している場合私は決して正しい価値を得ることはできません。 私は057hをesiに移すと30hという正しい値を得ることができました、なぜですか?
が、いくつかのコード...
のMOV ESI、TYPEの従業員を試すことができます。これは60と言われています
mov ax、employees [esi] .Years;これは私が使用整列をdidnotた場合、それは
MOV ESI、TYPEの従業員が正しいだろう
正しい値を取得することはありませんでしょう。これは57 dec mov ax、従業員[esi]。年。適切な値を得るでしょう。
mov esi、0 mov eax、0 mov ax、employees [esi] .Years; AX = 0xFFの
はい、その絶対的に正しい値、ベースポインタから...のMOV ESI、TYPEの従業員をコンパイルしようとするため、構造体、私に整列せず、それが適切な値を得ることができないだろう整列、と
適切な価値を得ることができます...私はこの情報を得るためにほぼ1日試しました
誰かが私に正しい理由を教えてくれましたか?
私は完全にあなたの質問を理解することはできません。とにかく、あなたはパディングを考慮しましたか? –
あなたの質問には矛盾があります。実際には自分のMASM(私は持っていません)を実際に使用せずに従うのが難しくなります。 「STRUCT」内の「整列」が機能する場合、オフセットはIdNum = '0'、LastName =' 9'、Years = '40'(39 + 1)、SalaryHistory =' 44'(42 + 2)、 ENDS = '60'(BTWは、' WORD'が2Bなので、2回目のアライメントは+3ではなく、+2のみを実行していることに気付きます)。しかし、私は '0x30'がオフセット' 39'にあるメモリビューでどのように終わるのか分かりません。それは 'ALIGN'がまったく動かないか、' DUP'によるあなたの充填が間違っているようです。そして、 'qwords'のメモリビューは混乱しています。 – Ped7g
もう一度そのメモリビューを見ると、あなたの画面は質問とは別のソースコードで作成する必要があります。 「Years BYTE」、アライメントなしの「Years」がオフセット39、「SalaryHistory」が40、40 + 16 = 56の場合は意味があります。[MCVE]はおそらく私のためではなく、MASMとVSがあります)。 – Ped7g