DW_AT_encodingとそれに関連するAttributeは、比較的にめんどいので、個別のぺーじとして書きますです。
DW_AT_encodingとは、「データオブジェクト(上の基本型などもとーぜん含むです)内での、データの表現方法」を示すもんです。
これ、まぁコンピュータの中では、2進整数でしか扱われない、とか思いがち?やけど、んなことはなくて、分かりやすい例では、浮動小数点(ビットを3つに区切って、符号、指数、仮数にしてる)とか、アドレス(とはいってもこれはただの2進だが)に加え、COBOLなどではパック10進などがあり、実は多彩です。というこで、まず、以下表にまとめます。
No. | encoding名称 | value | せつめい |
1 | DW_ATE_address | 0x01 | メモリアドレス(リニア空間) |
2 | DW_ATE_boolean | 0x02 | Boolean型(TrueかFalseのもの) |
3 | DW_ATE_complex_float | 0x03 | 複素数浮動小数点 ※ただし、実際どーやって複素数がバイナリとして表現されるか、しらん ※DWARF3以降 |
4 | DW_ATE_float | 0x04 | 浮動小数点(float/double) |
5 | DW_ATE_signed | 0x05 | 符号付き2進整数(int、short、longなど) |
6 | DW_ATE_signed_char | 0x06 | 符号付きキャラクタ(char) |
7 | DW_ATE_unsigned | 0x07 | 符号なし2進整数(unsigned int、unsinged longなど) |
8 | DW_ATE_unsigned_char | 0x08 | 符号なしキャラクタ(unsigned char) |
9 | DW_ATE_imaginary_float | 0x09 | 虚数浮動小数点 ※これも、実際どのように表現されるのかまではしらんです |
10 | DW_ATE_packed_decimal | 0x0a | パックド10進小数(以下参照) ※DWARF3以降 |
11 | DW_ATE_numeric_string | 0x0b | 数文字列(以下参照) ※DWARF3以降 |
12 | DW_ATE_edited | 0x0c | 編集文字列 ※DWARF3以降 |
13 | DW_ATE_signed_fixed | 0x0d | 符号付きスケール固定小数 ※DWARF3以降 |
14 | DW_ATE_unsigned_fixed | 0x0e | 符号なしスケール固定小数 ※DWARF3以降 |
15 | DW_ATE_decimal_float | 0x0f | 10進浮動小数(IEEE754R形式) ※DWARF3以降 |
16 | DW_ATE_lo_user | 0x80 | (これより大きい値の場合、コンパイラ独自) ※DWARF3以降 |
17 | DW_ATE_hi_user | 0xff | (コンパイラ独自定義の最大値) ※DWARF3以降 |
まず、こいつらはどっちも『数文字列』に属するです。(ただ、ワタクシがこれを良く分かっていません。。。なんか、COBOLとかでは使えたはず。以下その前提で)
んで、それぞれの違いは以下の表の通りです。
Attribute名 | パック有無 | 符号 |
DW_ATE_packed_decimal | ◯ | あり |
DW_ATE_numeric_string | × | なし |
そして、DW_AT_encodingの値がこれら2つのいずれかの場合、DW_AT_encodingを持っているTAGは、「DW_AT_decimal_sign」「DW_AT_digit_count」「DW_AT_decimal_scale」の3つのAttributeを持っていますです。
これら3つのAttributeの説明は、ページに下にそれぞれ書きますんで、こちら参照ってことで。
これは、「COBOL言語での編集数値/編集アルファベット型」なencodingであることを示すです。
んで、この値を持つDW_AT_encodingを持っているTAGは「DW_AT_picture_string」なAttributeを持ってます。
DW_AT_picture_stringなAttributeは、ターゲットマシン依存の、この型と関連する「絵文字」(NULL終り)を持ってます。(これ、COBOLは良く分かりませんが、なんとなくPC-98x1にもあった「外字」っぽいですね)
んで、もしこの型が「変数数値」であった場合は、「DW_AT_digit_count」「DW_AT_decimal_scale」の属性も持ってて、解釈は下のこれらの属性欄に記述の通りです。(つまり、上のDW_ATE_packed_decimalやDW_ATE_numeric_stringと同じ)
これらは、2進固定小数を示します。(それぞれ、符号あり、なし)
2進固定小数ってのも良く分かりませんが、なんとなく、8bitあるうち、例えば下位3bitは小数点以下、見たいな感じでしょうかね
で、こいつらに関連する事項を以下列挙しますです。
こいつは、以下の表の値のいずれかで、符号をもつかどうか、もつ場合どういう形式で表現されるか、を示すです。
No. | 値の名称 | Value | いみ |
1 | DW_DS_unsigned | 0x01 | 符号なし |
2 | DW_DS_leading_overpunch | 0x02 | (ターゲットマシンにおいて)もっとも大きい桁に符号を持つ |
3 | DW_DS_trailing_overpunch | 0x03 | (ターゲットマシンにおいて)もっとも小さい桁に符号を持つ |
4 | DW_DS_leading_separate | 0x04 | 符号は’+’’-’のどちらかで、一番大きい桁の左に持つ |
5 | DW_DS_trailing_separate | 0x05 | <DW_ATE_numeric_stringの場合> ’+’’-’のどちらかで符号をもち、一番小さい桁の右に持つ <DW_ATE_packed_decimalの場合> もっとも小さな桁にマシン依存の値で正負を持つ |
こいつは簡単で、「数値の桁数」を定数としてもってます
これは、ひとことでいうと、「小数点の位置=10の冪乗数」です。
まず、前提として「1234」なる数値があった場合、(見えないけど)小数点ってとーぜん4の次にあるわけです。(たぶん、小学3年?でみんなそうならったはず)
この位置を「0」とします。そして、仮に「1234×10=12340.0」になります.(不要だけど,あえて小数点入れてみました)。このときのdecimal_scaleを「1」とするです。
んなら、「1234×1000=1234000.0」は「3」になるです。
この表記の場合は、例えば12340の例でも、そのまま12340とはデータをもたせずに、「1234×10」にして、10倍の部分の冪乗数は「1」と表す訳ですね。
んじゃ、小数点はどーすんの、となるわけですが、はい。無論「マイナス」です。例えば、この値が「-6」なら、「1234÷1000000=0.001234」です。
これは「小数点の位置を2の冪乗単位で持つ場合」です。(上のDW_AT_decimal_scaleの2進数版です)
decimal_scaleでは「10進数の桁」単位でしたが、コイツは「ビット単位の桁」での取扱です。
例えば「10010110」な2進数があったときで、かつこいつの全ての桁が整数とした場合は、「10010110.0」ですから、DW_AT_decimal_scale=0です。
これが仮に「10010110000」なら、DW_AT_decimal_scale=3、「1001.0110」ならDW_AT_decimal_scale=-4です。
小数点の位置に対する指数(倍数)を、10とか2とかのキリ番ではなくて、任意の値にしたい場合に使うです。
このAttributeは「DW_TAG_constant」なDIEへの参照になってるです。
そして、参照された「DW_TAG_constant」内の定数が、DW_AT_smallを持っている値にかけ算された値が、最終的な値になる、という具合です。
[PageInfo]
LastUpdate: 2013-09-16 14:47:14, ModifiedBy: koinec
[License]
FreeBSD Documentation License
[Permissions]
view:all, edit:members, delete/config:members