本章主要介绍了c语言和汇编的关系、栈的变化、指针数组、浮点代码等知识。linux
1.机器级编程,两种抽象最重要,第一种是由指令集体系结构或指令集架构,第二种是**机器级程序使用的内存地址是虚拟地址。
2.程序内存包含:机器代码、信息、运行时栈、内存块。编程
1.32位数为“双字”,64位数为“四字”。
2.数据传送指令有四个变种:movb(字节)、movw(字)、movl(双字)、movq(四字)数组
1.一个CPU包含一组16个存储64位值的通用目的寄存器,这些寄存器用来存储整数数据和指针。
2.不一样的操做数可能性被分为三种类型:当即数、寄存器、内存引用。
3.数据传送指令:mov类第一条指令将源值加载到寄存器中,第二条将该寄存器值写入目的位置。
4.栈遵循“后进先出”的原则,push压栈,pop删除数据。数据结构
1.操做分为四种:加载有效地址、一元操做、二元操做和位移。
2.加载有效地址:leaq
3.一元操做:inc、dec、neg、not
4.二元操做:add、sub、imul、xor、or、and
5.位移:sal、shl、sar、shr架构
1.条件码:CF(进位标志)、ZF(零标志)、SF(符号标志)、OF(溢出标志)
2.设置条件码:cmp、test
3.访问条件码:set
4.跳转指令:jmp函数
1.栈帧:须要的存储空间超出寄存器可以存放的大小时,就会在栈上分配空间。
2.有n个整型参数,且n>6,要把参数1~6复制到对应的寄存器,把参数7~n放到栈上,而参数7位于栈顶,全部数据大小都向8的倍数对齐。学习
1.数组元素i会被存放在地址为xA+Li的地方
2.数组元素D[i][j]的内存地址为&D[i][j]=xD+L(Ci+j)编码
1.c语言提供两种将不一样类型的对象组合到一块儿建立数据类型的机制:结构、联合
2.结构:用将关键字struct声明,将多个对象集合到一个单位中。
3.联合:用关键字union声明,容许用几种不一样的类型来引用一个对象。指针
1.每一个指针对应一个类型、每一个指针都有一个值、指针用‘&’运算符建立、*操做符用于间接引用指针、数组与指针紧密相连、将指针从一种类型强制转换成另外一种类型、指针也能够指向函数。
2.启动gdb:linux> gdb prog
3.缓冲区溢出:在栈中分配某个字符数组来保存一个字符串,可是字符串长度超出了为数组分配的空间。
4.对抗缓冲区溢出攻击:栈随机化、栈破坏检测、限制可执行代码区域。code
1.浮点运算操做:vadd、vsub、vmul、vdiv、vmax、vmin、sqrt
2.AVX浮点操做不能以当即数值做为操做数。
3.浮点比较操做:ucomiss、ucomisd。
x in %rdi,y in %rsi,qp in %rdx,rp in %rcx movq %rdx,%r8 movq %rdi,%rax cqto idivq %rsi movq %rax,(%r8) movq %rdx,(%rcx) ret