.sym name, value[, type,
storage class, size, tag, dims]
.sym伪指令用来定义一个全局变量、局部变量或一个函数符号。它有若干个参数允许你对这个变量或函数联系不同的调试信息,通常用于实现编译器在汇编语言程序和C/C++语言程序之间进行混合符号调试。如果只是纯粹的汇编语言程序,程序中定义变量的.sym伪指令可以不用写。
.sym伪指令中name和value选项是必须要有的,其它项可选。
一、name选项
name是变量(函数)名,它放置在目标代码的符号表中,name长度最好不要超过32个字符,超过部分系统认为无效。
二、value选项
value是所对应变量的值。任意合法的(绝对或可重定位)表达式都可以。
三、type选项
type与编译前C/C++程序中的变量类型一致。在目标代码的符号表中,第14、15字节定义了对应符号的类型(type
entry),它由一个基本类型和1~6个扩展类型组成:
Type
entry:
____________________________________________________________________________
|扩展类型6|扩展类型5|扩展类型4|扩展类型3|扩展类型2|扩展类型1|基本类型|
长度(位) 2 2 2 2 2 2 4
从上面可以看出,type的值由2个字节来表示,低4位表示基本类型,其余每2位表示一种扩展类型。
基本类型的值和对应的类型表示如下:
0 type not assigned
2 character
3 short integer
4 integer
5 long integer
6 floating point
7 double word
8 structure
9 union
10 enumeration
11 member of an enumeration
12 unsigned character
13 unsigned short integer
扩展类型的值和对应的类型如下:
0 no derived type
1 pointer
2 function
3 array
如果一个含有多个扩展类型的符号的类型值表示为:0000000011010011b,它表示这个符号是一个短整型数组指针。
四、storage classes选项
符号表的第16个字节表明了符号的存储类型,存储类型表示C/C++编译器存取一个符号的方式。下面举几个常用的存储类型和它的值:
0 no storage class
2 external symbol
3 static
5 external definition
6 label
7 undefined label
14 uninitialized
static
104 used only by utility programs
other reserved
五、size选项
size选项表示符号的存储空间大小,以二进制位为单位。
六、tag选项
当变量是一个类型时,tag选项是类型名或结构名。这个名字必须由.stag, .etag,
或者.utag事先已经申明。
七、dims选项
dims选项通常可以由多达4个表达式组成,用于指定由.sym指定的变量的维度。如用C语言定义一个2维数组时,编译后会生成一个.sym伪指令指向此数组,由dims参数指定数组的维数。例如在C/C++程序中有:
int array[5][10];
编译以后得到:
.global _array
.bss _array, 50, 0, 0
.sym _array, _array, 244, 2, 800, , 5, 10
上面一行中有“244”,244=F4H=011110100B,参考“Type entry”的构造,说明_array是一个二维整型数组。跟在“244”后面的“2”表示其存储类型为“external symbol”,表示_array在外部模块中定义。其中的“800”表示800位=16位*5*10,即_array的“size”共800位。其中的“5”和“10”表示数组每维的元素个数。