例外処理で使用するデータのいくつかは、ユーザがエンコーディング形式を指定してその形式で使用するものがある。以下のような形式を組み合わせて使用する。
encoding | 値 | 備考 |
---|---|---|
absptr | 0x00 | void *型 |
omit | 0xff | デフォルト値を使用、または無効 |
uleb128 | 0x01 | 符号なし可変長整数 |
udata2 | 0x02 | 符号なし16bit整数 |
udata4 | 0x03 | 符号なし32bit整数 |
udata8 | 0x04 | 符号なし64bit整数 |
sleb128 | 0x09 | 符号付き可変長整数 |
sdata2 | 0x0A | 符号付き16bit整数 |
sdata4 | 0x0B | 符号付き32bit整数 |
sdata8 | 0x0C | 符号付き64bit整数 |
signed | 0x08 | 符号付きフラグ |
pcrel | 0x10 | PC相対フラグ |
textrel | 0x20 | .textセグメント相対フラグ |
datarel | 0x30 | .dataセグメント相対フラグ |
funcrel | 0x40 | 関数相対フラグ |
aligned | 0x50 | ワード境界整列フラグ |
indirect | 0x80 | 間接フラグ |
例外処理で使用されるデータ形式の中には、uleb128とsleb128という可変長整数を表す形式が存在する。前者は符号なしで後者は符号付きである。
基本的には以下のような構造をしている。
この構造は、1バイトを1bitのフラグと7bitのデータ部に分割し、フラグの値が1の場合は次のバイトも読みにいき、フラグの値が0になったらそこまでのデータ部を連結して数値とする。
例えば、n+1バイトのuleb128形式のデータ bytes[0:n] があったとすると、そのバイト列が表現する値は以下のように計算できる。
uleb128は正の整数しか表現できないが、sleb128は負の整数も表現できる。基本的には先ほど示した数式と形式が似ているが、bytes[n]の6bit目が1であるとき、この値は負の値になる。その際の計算式は以下のようになる。
また、sleb128でもbytes[n]の6bit目が0であるときは、uleb128と同じ式で計算できる。
Copyright (C) 2002-2006 s.arakawa