教材学习知识点总结
本章主要介绍了c语言和汇编的关系、栈的变化、指针数组、浮点代码等知识。
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,要把参数16复制到对应的寄存器,把参数7n放到栈上,而参数7位于栈顶,所有数据大小都向8的倍数对齐。
3.7 数组分配和访问
1.数组元素i会被存放在地址为xA+Li的地方
2.数组元素D[i][j]的内存地址为&D[i][j]=xD+L(Ci+j)
3.8 异质的数据结构
1.c语言提供两种将不同类型的对象组合到一起创建数据类型的机制:结构、联合
2.结构:用将关键字struct声明,将多个对象集合到一个单位中。
3.联合:用关键字union声明,允许用几种不同的类型来引用一个对象。
3.9 在机器级程序中将控制与数据结合起来
1.每个指针对应一个类型、每个指针都有一个值、指针用‘&’运算符创建、*操作符用于间接引用指针、数组与指针紧密相连、将指针从一种类型强制转换成另一种类型、指针也可以指向函数。
2.启动gdb:linux> gdb prog
3.缓冲区溢出:在栈中分配某个字符数组来保存一个字符串,但是字符串长度超出了为数组分配的空间。
4.对抗缓冲区溢出攻击:栈随机化、栈破坏检测、限制可执行代码区域。
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解决方案:不太理解,是跟高位低位有关么?