Skip to content

程序的结构和执行

约 362 个字 33 行代码 预计阅读时间 2 分钟

程序的机器级表示

  • 使用基于条件的数据传送替代基于条件的控制转移
C
// 基于条件的数据传送
int ntest = x >= y;
if (ntest) {
    ...
} else {
    ...
}

// 基于条件的控制转移
if (x >y) {

} else {

}
  • while的两种汇编形式

  • jump to the middle

    C
        go to test;
    loop:
        body
    test:
        t = test-expr;
        if (t){
            goto loop;
        }
    
  • guarded-do

    C
    t = test-expr;
    if(!t){
        goto done;
    }
    loop:
        body
        t = test-expr;
        if(t) {
            goto loop;
        }
    done:
    
  • 对抗缓冲区溢出攻击

  • 地址空间布局随机化:栈随机化,每次先在栈上随机分配一大块空间;程序每次加载地址不同
  • 栈破坏检测:在栈帧与栈状态间存放一个特殊的金丝雀
  • 限制可执行代码区域

优化程序性能

  • 优化编译器的能力和局限性
  • 确定两个指针是否指向不同的内存restrict关键字
  • 内联函数替换函数调用
  • 消除循环的低效率
  • 将某些定长的库函数结果移除循环
  • 减少过程调用
  • 消除不必要的内存引用
  • 使用临时变量替代指针
  • 循环展开
  • 提高程序并行性:可以考虑使用SIMD向量指令
  • 对dst和src地址相同的取值操作,造成写/读相关问题
  • 存储单元中存在存储缓冲区,每个缓存区由地址s_addr和数据s_data组成;srcdst不同时,数据和地址可以并行取出,如果相同,必须保证s_addrs_data前完成