如何读懂编译器生成的汇编文件
想看看编译器到底对程序做了哪些优化,好让自己更好地去改进程序的性能,可是编译器生成的汇编文件里面很多符号和语句确看不懂什么意思。请问该怎么去看呢?
都是汇编语言的指令,或伪操作,一般没啥实在看不懂的东西呀! 如果是不是2407,列一段实例来探讨探讨.
感谢你的回答,后来重新编译了一下,把那些调试信息都去掉了,这下就清楚多了。
是不是编译器生成的汇编文件一般没有什么参考价值?感觉里面对寄存器的使用很乱
一般是不必读它.但是:
1. 如果出了莫名其妙的错,需要深入 DEBUG;
2. 想手工优化一下代码;
3. 想写汇编函数,与 C 程序混合运行,但又不很清楚汇编程序的总体的结构,规格.
哪就无妨读一读 C 生成的汇编程序.
如果你用的是 2407A, 可能是这样:
XF 标志在状态寄存器 ST1 中,而 ST1 是中断处理时需要保存和恢复的现场信息,所以中断服务中设置的XF,恢复现场时就被覆盖了,实际是不起作用,看不到的.为此我也困惑了好几天.
哪一点你认为不符事理?
下面是C 语言库 rts2xx.lib 中提供的恢复现场例程,其中分明包含 ST0,ST1. ST1 中还存放 DP,ARP,ARB .. 等等主程序重要信息,不保存还得了?
****************************************************************************
* FUNCTION DEF : I$$REST
* This function is branched to at the end of an interrupt
* handler to restore the environment of the interrupted
* code. This function performs the return from interrupt.
* In order to ensure correct restoration of the T register,
* this function assumes that interrupts are disabled during
* its execution.
****************************************************************************
I$$REST:
DINT
MAR *- ; POINT TO TOP ELEMENT ON STACK
RPTK 6 ; RESTORE TOP 6 ELEMENTS OF STACK
PSHD *-
LAR AR7,*- ; RESTORE ALL AUX REGISTERS EXCEPT AR1
LAR AR6,*-
LAR AR5,*-
LAR AR4,*-
LAR AR3,*-
LAR AR2,*-
LAR AR0,*-
MAR *- ; SKIP T REGISTER (FOR NOW)
LT *+
MPYK 1 ; RESTORE LOW PRODUCT REGISTER
LT *- ; RESTORE T REGISTER
MAR *- ; SKIP LOW PRODUCT REGISTER VALUE
LPH *- ; RESTORE HIGH PRODUCT REGISTER
ZALS *- ; RESTORE ACCUMULATOR
ADDH *-
LST *- ; RESTORE STATUS REGISTERS
LST1 *- ; OLD ARP IS RESTORED *NOW*
EINT ; RESTORE INTERRUPTS
RET ; RETURN TO INTERRUPTED CODE
RET