2017-09-01 5 views
0

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という正しい値を得ることができました、なぜですか?

enter image description here

が、いくつかのコード...

の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日試しました

誰かが私に正しい理由を教えてくれましたか?

+0

私は完全にあなたの質問を理解することはできません。とにかく、あなたはパディングを考慮しましたか? –

+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

+0

もう一度そのメモリビューを見ると、あなたの画面は質問とは別のソースコードで作成する必要があります。 「Years BYTE」、アライメントなしの「Years」がオフセット39、「SalaryHistory」が40、40 + 16 = 56の場合は意味があります。[MCVE]はおそらく私のためではなく、MASMとVSがあります)。 – Ped7g

答えて

-1

、キップアーバイン:

それは、構造体定義内にALIGNを使用しないでください。

Answer pict

0

LastNameフィールドの30文字すべてを入力するだけで、わずかな変更でこれをテストしました。 EDXに移動されたSIZEOF値は実際に0x3C(10進数60)です。構造体定義のALIGN文が考慮されます。しかし、デバッグメモリウィンドウで初期化された構造体を調べると、employees配列の各インスタンスは0x39バイト(小数点以下57桁)になります。

ボトムライン:フィールドイニシャライザを使用して構造体のインスタンスを宣言すると、ALIGNディレクティブはデータのアラインメントに影響しないようです。

Employee STRUCT        
IdNum BYTE "000000000"     
LastName BYTE 30 DUP(0)    
ALIGN WORD       
Years WORD 30       
ALIGN DWORD       
SalaryHistory DWORD 0, 0, 0, 0   
Employee ENDS 

.data 
employees Employee 5 DUP(<"111111111", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 0FFh, 4 DUP(0EEEEEEEEh)>) 
; hex offsets: 00--08, 09-26, 27-28, 29-38. 


.code 
main proc 
mov eax,offset employees 
mov edx,SIZEOF Employee ; 0x3C 

良いニュースは、正しくAXレジスタに "年" の値をロードし、次の文です:

著者によって回答
mov esi,0 
mov eax,0 
mov ax, employees[esi].Years   ; AX = 0xFF 
+0

こんにちは、私の投稿に非常に嬉しいです。 あなたのコードを試してみましょう... mov esi、TYPE employee;あなたの本のインデックス番号は1です。 mov ax、employees [esi] .Years;これは決して正しい値を得ることができません もし私が整列を使用しなかったなら、それは正しいでしょう ---- mov esi、TYPE従業員;これは57 decです mov ax、employees [esi] .Years;正しい値を得るだろうFF –

関連する問題