分类:
2009-09-16 19:34:56
C语言各种分支控制结构在汇编语言中的实现形式
1. IF--ELSE
t=条件表达式的值
if(t为真)
goto true;
执行语句2
goto done;
true:
执行语句1
done:
while循环
t=条件表达式的值
if(t为假)
goto done;
loop:
执行语句
t=条件表达式的值
if(t为真)
goto loop;
done:
do...while循环
loop:
执行语句
t=条件表达式的值
if(t为真)
goto loop;
for循环
for语句被翻译为一个while语句,不同的是在while前要加上初始化语句
循环初始化
while(条件表达式){
循环语句
递增语句
}
循环初始化
t=条件表达式的值
if(t为假)
goto done;
loop:
循环语句
递增语句
t=条件表达式的值
if(t为真)
goto loop;
done:
控制结构的优化(编译器优化)
表达式优化:
使用移位计算代替乘法除法。(移位执行速度和加减法差不多)
常量折叠——将能够直接静态的计算出结果的表达式计算出来,提高程序的执行速度
使用数学公式
x=x+1 ==> x++ 可减少cpu执行周期数(减少一个访存周期)
分支优化:
将发生几率大的if语句放在前面
使用switch语句代替多项ifelseif
循环优化:
将循环内部不会改变的赋值语句放到循环外
全局变量与局部变量
全局变量初始值为0,存储在固定的存储区(内存数据段),程序执行过程中一直存在
局部变量存储在内存堆栈中,不被初始化,其值为该内存区域原有的值。对于调用频繁的局部变量,编译器会自动将其存储到寄存器中。
故在循环中,循环算子最好使用局部变量。
使用register存储类别会被优先分配寄存器。
函数的调用
将参数压栈
保存寄存器的值
保存返回地址
跳转到函数地址
函数的调用其实是以时间换空间。故在使用函数的时候要考虑到是否必要。
Static的用处
static可用于文件间隐藏。
全局static变量的使用范围缩小了,只能在当前文件中使用。通过一些操作性的函数来暴露该变量给外部文件,这样就可以实现封装和模块化设计。
对于局部static变量,作用域不变,但其在整个函数生命期都存在。虽然使用全局变量效果一样,但这样会使其他函数无意间修改该变量。
C语言的符号解析
不允许有多个符号定义(变量、函数)
如果有一个符号定义和多个符号声明,选择被定义的符号
如果有多个符号的声明,则任选一个作为符号的定义。
Printf参数问题:printf(“%d\n”); printf(“%s\n”);
对于整形参数,自动把存储在format字符串后面的4个字节传入,作为整形变量
对于字符串,将该4字节当作字符串地址,从内存中该地址读入数据,可能会发生段异常。
void*的意义
有时编译器不清楚用户要把指针指向的内存做什么用途的时候,编译器将认为指向该内存的指针为任意类型,如malloc的返回值,返回void*以躲过编译器的类型检查。之后用户使用的时候在cast成相应的指针类型。
#define NULL (void *)0;
调试开关——使用条件编译
#define DEBUG 1
#ifdef DEBUG
#define PRINT(str) printf(str);
#define PRINT!(str,arg); printf(str,arg);
#else
#define PRINT(str) ;
#define PRINT!(str,arg) ;;
#endif
restrict关键字
表明指针x是指向这块区域的唯一指针。