GAS(GNU Assembler)で構造体にアクセスする
環境はWindows7(32bit)&cygwinのgcc/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