CSAPP第三章:程序的机器级表示 小结

1.汇编代码和机器代码都是和特定机器相关的。

2.精通细节是理解更深和更基本概念的先决条件。

3.32为机器内存为2的32次方,4*1G  64位机器为2的48次方,2的40次方位1T,2的8次方为256.256T。

4.摩尔定律:芯片上的晶体管数量每年翻一番:实际上是18个月并且磁盘容量,存储器芯片容量和处理其性能都符合这一定律。

5.一个程序:.i-->.s-->.o-->.exe。windows把生成汇编代码和编译代码混了到一起了,直接从.i到.o了。

6.计算机系统的抽象:1:ISA,好像每条指令都是顺序的。2:存储器使用虚拟地址。操作系统负责虚拟地址空间,转换成实际的物理地址。

7.示例:int sum(int x,inty){int t = x+y; retrun t} 汇编代码:首先压栈返回地址,其次向上寻址mov存放参数,接着向下执行函数代码,最后出栈。 
sum:
 push%esp 
 movl(%esp,%ebp)
 move 12 %esp,%eax  
 addl  %eax,t
 pop%ebp

8.总线一次性能够传输的位数称作“字长”,intel的字是16位的,了解各基本数据类型所占的位数。

9.过程调用的栈帧结构:栈底--》栈顶(大小例如VC1M) 如果大小不足Stack   Overflow
#pragma comment(linker, "/STACK:4194304,4194304")手动设置栈的大小。不要太大就行
所以最好算一下。
算过:windows大约栈帧要占30字节,2600-》100000溢出,2599没事。

10.数组的分配和访问:注意和指针的区别 char A[12]; char*B[12],注意区别。数组相当于静态的指针,不能改变其指向。但是指针如果指向了.rodata区,不能改变值。
数组元素按照“行优先”的方式进行存储。也就是说,二维数组也是,所以如果按照列访问数组是不划算的。

11.好的编程习惯:
#define N 16:
if(1==i){};

12.windows小端表示,例如0x12345678,会表示成78 56 34 12 

13.异质的数据结构:数据对齐,一般默认4字节对齐。

14.指针式C语言提供的一种抽象:

15.存储器越界和缓冲区溢出攻击。
存储器越界:一般指的是数组越界,例如访问越界元素,gets函数直接破坏了栈寄存器。

缓冲区溢出攻击:例如strcpy就有,不需要告诉他们目标缓冲区的大小,就产生一个字节的序列,可能会让程序运行注入者运行某些程序
char a[3] = {'1','2','3'};
char *p1 = new char(1);
strcpy(p1,a);



你可能感兴趣的:(CSAPP)