视频

2015 CMU 15-213 CSAPP

Lecture 01 Course Overview

相关资料


Lecture 02 Bits,Bytes,and Integer

布尔代数
位运算符和逻辑运算符的区别
逻辑右移和算术右移的区别
原码反码补码
有符号数和无符号数


Lecture 03 Bits,Bytes,and Integer cont

取模
大端序、小端序


Lecture 04 Floating Point

浮点数的存储


Lecture 05 Machine Level Programming I:Basics

gcc中指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast

1
2
3
lea是“load effective address”的缩写,简单的说,lea指令可以用来将一个内存地址直接赋给目的操作数,
例如:lea eax,[ebx+8] 就是将ebx+8这个值直接赋给eax,而不是把ebx+8处的内存地址里的数据赋给eax。
而mov指令则恰恰相反,例如:mov eax,[ebx+8]则是把内存地址为ebx+8处的数据赋给eax。

Lecture 06 Machine Level Programming II:Control


Lecture 07 Machine Level Programming III:Procedures

堆栈作用


Lecture 08 Machine Level Programming IV:Data

C语言中数组的边界检查问题
数组和指针的本质区别
内存分配
结构体对齐、优化


Lecture 09 Machine Level Programming V:Advanced Topics

内存布局
栈溢出
堆栈金丝雀、ALSR、DEP
联合体、共用体
**

Lecture 10 Program Optimization

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//大小写转换
//时间浪费在了strlen(szStr)上
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<string.h>
void lower(char *szStr)
{
size_t i;
for(i=0;i<strlen(szStr);i++)
{
if(szStr[i]>='A'&&szStr[i]<='Z')
{
szStr[i]-='A'-'a';
}

}
}

int main()
{
char szStr[100]="HELLOWORLD";
lower(szStr);
printf("%s",szStr);
}

*************************
改进:
void lower(char *szStr)
{
size_t i=0;
if(i>=strlen(szStr))
{
goto done;
}
loop:
if(szStr[i]>='A'&&szStr[i]<='Z')
{
szStr[i]-='A'-'a';
}
i++;
if(i<strlen(szStr))
{
goto loop;
}
done:
}

)