2017-2018-1 20179226 《深刻理解计算机系统》第3周学习总结

教材学习知识点总结

本章主要介绍了c语言和汇编的关系、栈的变化、指针数组、浮点代码等知识。linux

3.1 程序编码

1.机器级编程,两种抽象最重要,第一种是由指令集体系结构或指令集架构,第二种是**机器级程序使用的内存地址是虚拟地址。
2.程序内存包含:机器代码、信息、运行时栈、内存块。编程

3.2 数据格式

1.32位数为“双字”,64位数为“四字”。
2.数据传送指令有四个变种:movb(字节)、movw(字)、movl(双字)、movq(四字)数组

3.3 访问信息

1.一个CPU包含一组16个存储64位值的通用目的寄存器,这些寄存器用来存储整数数据和指针。
2.不一样的操做数可能性被分为三种类型:当即数、寄存器、内存引用。
3.数据传送指令:mov类第一条指令将源值加载到寄存器中,第二条将该寄存器值写入目的位置。
4.栈遵循“后进先出”的原则,push压栈,pop删除数据。数据结构

3.4 算术和逻辑操做

1.操做分为四种:加载有效地址、一元操做、二元操做和位移。
2.加载有效地址:leaq
3.一元操做:inc、dec、neg、not
4.二元操做:add、sub、imul、xor、or、and
5.位移:sal、shl、sar、shr架构

3.5 控制

1.条件码:CF(进位标志)、ZF(零标志)、SF(符号标志)、OF(溢出标志)
2.设置条件码:cmp、test
3.访问条件码:set
4.跳转指令:jmp函数

3.6 过程

1.栈帧:须要的存储空间超出寄存器可以存放的大小时,就会在栈上分配空间。
2.有n个整型参数,且n>6,要把参数1~6复制到对应的寄存器,把参数7~n放到栈上,而参数7位于栈顶,全部数据大小都向8的倍数对齐。学习

3.7 数组分配和访问

1.数组元素i会被存放在地址为xA+Li的地方
2.数组元素D[i][j]的内存地址为&D[i][j]=xD+L(C
i+j)编码

3.8 异质的数据结构

1.c语言提供两种将不一样类型的对象组合到一块儿建立数据类型的机制:结构、联合
2.结构:用将关键字struct声明,将多个对象集合到一个单位中。
3.联合:用关键字union声明,容许用几种不一样的类型来引用一个对象。指针

3.9 在机器级程序中将控制与数据结合起来

1.每一个指针对应一个类型、每一个指针都有一个值、指针用‘&’运算符建立、*操做符用于间接引用指针、数组与指针紧密相连、将指针从一种类型强制转换成另外一种类型、指针也能够指向函数。
2.启动gdb:linux> gdb prog
3.缓冲区溢出:在栈中分配某个字符数组来保存一个字符串,可是字符串长度超出了为数组分配的空间。
4.对抗缓冲区溢出攻击:栈随机化、栈破坏检测、限制可执行代码区域。code

3.10 浮点代码

1.浮点运算操做:vadd、vsub、vmul、vdiv、vmax、vmin、sqrt
2.AVX浮点操做不能以当即数值做为操做数。
3.浮点比较操做:ucomiss、ucomisd。

教材学习中的问题和解决过程

  • 问题1:汇编中leaq和movq的区别是什么?
  • 问题1解决方案:mov是将数据从源操做传到目的操做数中,lea是将源操做数的地址传到目的操做数中,一个是数据,一个是地址。
  • 问题2:incq 16(%rax)中的16是什么意思?
  • 问题2解决方案:inc是目标操做数加一,16(%rax)是指寄存器rax的地址加16的意思么?
  • 问题3:下面这个除法的汇编代码中,%rdx是怎么存了余数?
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
  • 问题3解决方案:不太理解,是跟高位低位有关么?
相关文章
相关标签/搜索