ZHCUAU3J January 2018 – March 2024
编译器工具包括将 C/C++ 源语句插入到编译器的汇编语言输出中的功能。交叉列出功能可用于检查为每个 C 语句生成的汇编代码。交叉列出的行为有所不同,具体取决于是否使用了优化器以及指定了哪些选项。
调用交叉列出功能的最简单方法是使用 --c_src_interlist 选项。要在名为 function.c 的程序上编译和运行交叉列出功能,请输入:
cl7x --c_src_interlist function
--c_src_interlist 选项阻止编译器删除交叉列出的汇编语言输出文件。输出汇编文件 function.asm 被正常汇编。
在没有优化器的情况下调用交叉列出功能时,交叉列出将作为代码生成器与汇编器之间的单独通道运行。该功能读取汇编和 C/C++ 源文件,合并这些文件,然后将 C/C++ 语句作为注释写入汇编文件中。
有关将交叉列出功能与优化器一起使用的信息,请参阅节 4.12。使用 --c_src_interlist 选项会导致性能和/或代码大小下降。
foo.c 中 foo() 函数的 C 代码:
int foo(int a, int b, int c)
{
int d = a + b;
int e = d - c;
return e;
}
使用以下命令进行编译:
cl7x foo.c --c_src_interlist --symdebug:none
生成汇编文件 foo.asm,其中包含:
;----------------------------------------------------------------------
; 1 | int foo(int a, int b, int c)
;----------------------------------------------------------------------
;******************************************************************************
;* FUNCTION NAME: foo *
;* *
;* Regs Modified : A4,A8,D0,SP *
;* Regs Used : A4,A5,A6,A8,D0,SP *
;* Local Frame Size : 0 Args + 0 Auto + 8 Save = 8 byte *
;******************************************************************************
||foo||:
;** --------------------------------------------------------------------------*
MVC .S1 RP,A8 ; [A_S1]
|| STD .D1 A8,*SP(8) ; [A_D1]
ADDD .D1 SP,0xfffffff8,SP ; [A_D1]
;----------------------------------------------------------------------
; 3 | int d = a + b;
;----------------------------------------------------------------------
ADDW .D1 A5,A4,D0 ; [A_D1] |3|
;----------------------------------------------------------------------
; 4 | int e = d - c;
;----------------------------------------------------------------------
SUBW .D1 D0,A6,A4 ; [A_D1] |4|
;----------------------------------------------------------------------
; 5 | return e;
;----------------------------------------------------------------------
MVC .S1 A8,RP ; [A_S1] BARRIER
LDD .D1 *SP(16),A8 ; [A_D1]
RET .B1 ; [A_B]
|| ADDD .D1 SP,0x8,SP ; [A_D1]
; RETURN OCCURS {RP} ; []