本主題利用範例來說明對映的版面配置定義。
下列範例定義下列 C 語言結構的版面配置:
typedef struct { char char_val; unsigned short ushort_val; short short_val; unsigned long ulong_val; long long_val; char string_val[32]; } _test;
建立版面配置 XML 檔
layout.dtd 文件類型定義 (DTD) 檔中定義的 XML 檔案格式如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?> <!ELEMENT LAYOUT (FIELD)+> <!ATTLIST LAYOUT Header CDATA #REQUIRED length CDATA #REQUIRED> <!ELEMENT GROUP EMPTY> <!ATTLIST GROUP Name CDATA #REQUIRED> <!ELEMENT FIELD (FIELD)*> <!ATTLIST FIELD Header CDATA #REQUIRED Type (16_BIT_INT|16_BIT_UINT|16_BIT_HINT|32_BIT_INT|32_BIT_UINT|32_BIT_HINT|32_BIT_FLOAT|64_BIT_INT|64_BIT_FLOAT|CHARACTER|HEX|ASCII|EBCDIC|STRUCTURE|PADDING|BIT|BITMASK|MAP) #REQUIRED length CDATA #REQUIRED layout CDATA #IMPLIED filename CDATA #IMPLIED Groups CDATA #IMPLIED>
這表示 XML 配置檔一開始先指定版面配置的標頭(標題)和版面配置長度總計, 接著以標頭(名稱)、長度及初始類型(用來決定該子元素的預設表示法)的說明來指定一連串子元素 (FIELD)。
另外還有特殊的子元素類型:
說明 _test 結構的樹狀結構視圖且遵循此格式的 XML 檔如下:
<?xml version="1.0"?> <!DOCTYPE LAYOUT SYSTEM "Layout.dtd" > <LAYOUT Header="A Layout" length="17"> <FIELD Header="char_val" Type="CHARACTER" length="1"></FIELD> <FIELD Header="ushort_val" Type="16_BIT_UINT" length="2"></FIELD> <FIELD Header="short_val" Type="16_BIT_INT" length="2"></FIELD> <FIELD Header="ulong_val" Type="32_BIT_UINT" length="4"></FIELD> <FIELD Header="long_val" Type="32_BIT_INT" length="4"></FIELD> <FIELD Header="string_val" Type="ASCII" length="32"></FIELD> </LAYOUT>
定義填補欄位
如果您決定忽略 long_val 欄位,但想要在版面配置中顯示 string_val 類型, 則 XML 檔的內容如下:
<FIELD Header="short_val" Type="16_BIT_INT" length="2"></FIELD> <FIELD Header="ulong_val" Type="32_BIT_UINT" length="4"></FIELD> <FIELD Header="" Type="PADDING" length="4"></FIELD> <FIELD Header="string_val" Type="ASCII" length="32"></FIELD>
最初定義 PADDING 子元素的用意是為了處理位元組定址結構,但也可以用來跳過不需要在版面配置中詳述的資料區。
定義結構
下列 XML 片段顯示如何使用 STRUCTURE 欄位來對映巢狀結構。 結構頂端元素沒有相關聯的值,且可以展開來顯示子元素。 雖然 STRUCTURE 欄位的長度會加總至 XML 版面配置的大小總計,但納入的欄位大小只是基於顯示用途。 例如,下列結構表示只從版面配置大小總計中顯示 344 個位元組。
<FIELD Header="MACHINE CHECK LOG OUT AREA" Type="STRUCTURE" length="344"> <FIELD Header="reserved" Type="HEX" length="16"></FIELD> <FIELD Header="FLCSID" Type="HEX" length="4"></FIELD> <FIELD Header="FLCIOFP" Type="HEX" length="4"></FIELD> <FIELD Header="reserved" Type="HEX" length="20"></FIELD> <FIELD Header="FLCESAR" Type="HEX" length="4"></FIELD> <FIELD Header="FLCCTSA" Type="HEX" length="8"></FIELD> <FIELD Header="FLCCCSA" Type="HEX" length="8"></FIELD> <FIELD Header="FLCMCIC" Type="HEX" length="8"></FIELD> <FIELD Header="reserved" Type="HEX" length="8"></FIELD> <FIELD Header="FLCFSA" Type="HEX" length="4"></FIELD> <FIELD Header="reserved" Type="HEX" length="4"></FIELD> <FIELD Header="FLCFLA" Type="HEX" length="16"></FIELD> <FIELD Header="FLCRV110" Type="HEX" length="16"></FIELD> <FIELD Header="FLCARSAV" Type="STRUCTURE"length="64"> <FIELD Header="AR0" Type="HEX" length="4"></FIELD> <FIELD Header="AR1" Type="HEX" length="4"></FIELD> <FIELD Header="AR2" Type="HEX" length="4"></FIELD> <FIELD Header="AR3" Type="HEX" length="4"></FIELD> <FIELD Header="AR4" Type="HEX" length="4"></FIELD> <FIELD Header="AR5" Type="HEX" length="4"></FIELD> <FIELD Header="AR6" Type="HEX" length="4"></FIELD> <FIELD Header="AR7" Type="HEX" length="4"></FIELD> <FIELD Header="AR8" Type="HEX" length="4"></FIELD> <FIELD Header="AR9" Type="HEX" length="4"></FIELD> <FIELD Header="AR10" Type="HEX" length="4"></FIELD> <FIELD Header="AR11" Type="HEX" length="4"></FIELD> <FIELD Header="AR12" Type="HEX" length="4"></FIELD> <FIELD Header="AR13" Type="HEX" length="4"></FIELD> <FIELD Header="AR14" Type="HEX" length="4"></FIELD> <FIELD Header="AR15" Type="HEX" length="4"></FIELD> </FIELD> <FIELD Header="FLCFPSAV" Type="HEX" length="32"></FIELD> <FIELD Header="" Type="PADDING" length="64"></FIELD> <FIELD Header="" Type="PADDING" length="64"></FIELD> </FIELD>
結構可以在版面配置的內部或外部定義。 建立外部結構就像建立巢狀版面配置一樣, 同樣是在結構欄位中指定 filename="<file name>", 其中,<file name> 所參照的檔案包含結構的實際定義。
例如,MACHINE CHECK LOG OUT AREA 結構可以在外部對映版面配置中指定如下: <FIELD Header="MACHINE CHECK LOG OUT AREA" Type="STRUCTURE" length="344" filename="machine.xml"></FIELD>。
定義位元遮罩欄位
下列 XML 片段是 BITMASK 欄位的說明範例。 BITMASK 的長度以位元組來指定,且包含一組以位元來指定長度的 BIT 欄位。 BIT 欄位顯示的偏移是指 BITMASK 欄位內的位元偏移。 雖然位元遮罩欄位的長度會加總至 XML 版面配置的大小總計,但個別的 BIT 欄位大小只是基於顯示用途。
<FIELD Header="byte_field" Type="BITMASK"length="2"> <FIELD Header="hi_byte" Type="BIT" length="8"></FIELD> <FIELD Header="lo_byte" Type="BIT" length="8"></FIELD> </FIELD>
定義巢狀版面配置
MAP 欄位類型和選用的版面配置欄位可以一起用來說明巢狀版面配置,如下列 DSA 版面配置範例所示:
<?xml version="1.0"?> <!DOCTYPE LAYOUT SYSTEM "Layout.dtd"> <LAYOUT Header="DSA" length="72"> <FIELD Header="FLAGS" Type="HEX" length="2"></FIELD> <FIELD Header="junk" Type="HEX" length="2"></FIELD> <FIELD Header="Back Chain" Type="MAP" length="4" layout="dsa.xml"></FIELD> <FIELD Header="Forward Chain" Type="MAP" length="4" layout="dsa.xml"></FIELD> <FIELD Header="R14" Type="HEX" length="4"></FIELD> <FIELD Header="R15" Type="HEX" length="4"></FIELD> <FIELD Header="R0" Type="HEX" length="4"></FIELD> <FIELD Header="R1" Type="HEX" length="4"></FIELD> <FIELD Header="R2" Type="HEX" length="4"></FIELD> <FIELD Header="R3" Type="HEX" length="4"></FIELD> <FIELD Header="R4" Type="HEX" length="4"></FIELD> <FIELD Header="R5" Type="HEX" length="4"></FIELD> <FIELD Header="R6" Type="HEX" length="4"></FIELD> <FIELD Header="R7" Type="HEX" length="4"></FIELD> <FIELD Header="R8" Type="HEX" length="4"></FIELD> <FIELD Header="R9" Type="HEX" length="4"></FIELD> <FIELD Header="R10" Type="HEX" length="4"></FIELD> <FIELD Header="R11" Type="HEX" length="4"></FIELD> <FIELD Header="R12" Type="HEX" length="4"></FIELD> </LAYOUT>
這個形式完整的 XML 版面配置已儲存在 DSA.XML 檔案中。 因為您知道欄位 3 和 4 中有指標指向不同的 DSA 結構,所以您新增兩個巢狀版面配置定義。
定義群組
透過群組語法,您可以將對映版面配置中的欄位組織成群組,以方便使用。 若要定義群組,您必須在配置檔的開頭加上 <GROUP Name="groupName"></GROUP>。 接著指定下列程式碼,表示欄位屬於預先定義的群組: <FIELD Header="RESERVED" Type="HEX" length="12" Groups="groupName"></FIELD>。
一個欄位可以屬於多個群組。 若要定義多個群組,請在 Groups 屬性中以逗號分隔清單來指定群組。
ALL 群組名稱是一個特殊的群組。 在欄位中指定這個名稱會使該欄位隸屬於所有群組,在所有群組中將可以看到這個欄位。 下列程式碼範例包含群組:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE LAYOUT SYSTEM "Layout.dtd"> <LAYOUT Header="GROUP_EXAMPLE" length="32"> <GROUP Name="GroupA"></GROUP> <GROUP Name="GroupB"></GROUP> <FIELD Header="FIELD_A" Type="HEX" length="8" Groups="GroupA"></FIELD> <FIELD Header="FIELD_B" Type="HEX" length="8" Groups="GroupB"></FIELD> <FIELD Header="FIELD_AB" Type="HEX" length="8" Groups="GroupA,GroupB"></FIELD> <FIELD Header="FIELD_ALL" Type="HEX" length="8" Groups="ALL"></FIELD> </LAYOUT>