ZHCU947E June 2015 – January 2023
C/C++ 结构体和联合体转换为汇编 .struct 和 .union 元素。已根据需要添加边界填充和结尾,使生成的汇编结构与 C/C++ 源代码具有相同的大小和成员偏移量。主要目的是实现对 C/C++ 结构成员的访问,并促进汇编代码的调试。对于嵌套结构,使用汇编 .tag 特性引用其他结构体/联合体。
还从 C/C++ 源代码传递了对齐特性,使汇编符号标记的对齐与 C/C++ 符号相同。(pragma 可能尝试修改结构体,有关信息请参阅GUID-DAC601AB-053C-4EBB-A7E4-6EE0438CACDC.html#GUID-DAC601AB-053C-4EBB-A7E4-6EE0438CACDC。)由于结构体的对齐存储在汇编符号中,$sizeof( ) 和 $alignof( ) 等内置汇编函数可用于生成的结构体名称符号。
在 typedef 中使用未命名结构体(或联合体)时,例如:
typedef struct { int a_member; } mystrname;
这是以下代码的简写:
struct temporary_name { int a_member; };
typedef temporary_name mystrname;
转换时会以相同方式处理以上语句:为结构体生成临时名称,然后使用 .define 将 typedef 从临时名称输出到用户名称。在汇编中使用 mystrname 的方式应与在 C/C++ 中相同,但不要混淆列表中的汇编结构定义,其中包含的是临时名称。为结构体指定名称可避免出现临时名称,例如:
typedef struct a_st_name { ...} mystrname;
如果在 C 中使用简略方法声明特定结构的变量,例如:
extern struct a_name { int a_member; } a_variable;
那么将结构体转换为汇编语言后,会生成 .tag 指令,声明外部变量的结构,例如:
_a_variable .tag a_st_name
这样可在汇编代码中引用 _a_variable.a_member。