GAS(GNU Assembler)で構造体にアクセスする

環境はWindows7(32bit)&cygwingcc/gas(x86)で試した。

".struct"で構造体を定義し、その後サイズ(item_length)を算出する。

そして".bss"セクションに構造体名(item)でitem_length分メモリーを確保(".space")する。

後は、レジスタにitemのアドレスを代入し、間接アドレッシングでメンバーにアクセスする(この例ではitem.item2に0x05を代入している)。

.struct 0
item_start:
item1:
        .struct item1 + 12
item2:
        .struct item2 + 2
item3:
        .struct item3 + 8
item_end:
item_length = item_end - item_start

.bss
item:
        .space item_length

.text
        movl    item,%eax
        movw    $0x05,item2(%eax)

コンパイルし逆アセンブラをしてみると確かにitem2の位置(12→0xc)分を考慮したコードが生成されていた。

$ objdump.exe -d st.o
セクション .text の逆アセンブル:

00000000 <.text>:
   0:   a1 00 00 00 00          mov    0x0,%eax
   5:   66 c7 40 0c 05 00       movw   $0x5,0xc(%eax)
   b:   90                      nop

次のステップとして、アセンブラからC言語の構造体(ヘッダに定義)にアクセスしたいのだけど、やり方がよくわからない。インラインアセンブラを使えばこんな苦労しないのだけど...。

参照:
Ian Lance Taylor - Re: structures in assembly code
Using as: Struct