we
这一章主要讲数据在计算机中是怎么存储的,有些东西就不记这么细了。
!(非零)==FALSE;!!(非零)==TRUE;!(零)==TRUEgcc -c产生汇编代码| 数据类型 | 汇编代码后缀 | 大小(字节) |
|---|---|---|
| 字节 | b | 1 |
| 字 | w | 2 |
| 双字 | l | 4 |
| 四字 | q | 8 |
比如说数据传送指令:movb、movw、movl、movq
64位寄存器r开头,32位寄存器e开头。之前的小甲鱼汇编笔记记了一些大概得汇编基础,现在看又学到了一些:
| 寄存器 | 使用惯例 |
|---|---|
| ax | 返回值 |
| bx | 被调用者保存 |
| cx | 第四个参数 |
| dx | 第三个参数 |
| si | 第二个参数 |
| di | 第一个参数 |
| bp | 被调用者保存,栈基址 |
| sp | 栈指针 |
| r8 | 第五个参数 |
| r9 | 第六个参数 |
| r10 | 调用者保存 |
| r11 | 调用者保存 |
| r12 | 被调用者保存 |
| r13 | 被调用者保存 |
| r14 | 被调用者保存 |
| r15 | 被调用者保存 |
寻址方式有:立即数寻址、寄存器寻址、绝对寻址、间接寻址、(基址+偏移量)寻址、变址寻址、比例变址寻址
传送指令的两个操作数不能都指向内存位置。
leaq:load effective address:实际上是movq指令的变形,可以做一些算数运算。
控制:
cmovge,符合条件进行赋值,无需jmp,但是需要多做计算。(和上一点比较,编译器必须考虑浪费的计算和由于分支预测错误所造成的性能处罚之间的性能对比)do-while;while;for三种循环的翻译,理解是,不同优化等级,可能会进行不同方案的翻译过程:
寄存器最多传6个参数,超过6个参数的部分,需要使用栈来进行传递。所以,这一小节的重点是栈帧的分布,多余6个的参数和返回地址是由调用函数的栈帧来保存,切换函数需要保存的寄存器、局部变量的信息由被调函数来维护。用栈保存的参数使用rbp进行访问。

对于定长多维数组按照行优先的顺序在内存中存放。
内存对齐
对于结构体,编译器维护关于每个结构体类型的信息,只是每个字段的字节偏移,它一这些偏移作为内存引用指令中的位移,从而产生对结构元素的引用。
对于联合体,每个元素的访问偏移都是0.
对抗缓冲区溢出攻击:
变长栈帧:使用rbp实现

RISC:精简指令集计算机
CISC:复杂指令集计算机
HCL:Hardware Control Language
ALU是通过与或非门的组合电路来实现运算的。
后面的内容是对这6步做很详细的讲解,只看了个大概,觉得没必要了解这么深,就不做相应笔记了。
CPU流水线:每条指令的不同阶段并行执行。
流水线冒险:数据冒险和控制冒险。
编译器必须很小心地对程序只使用安全的优化,因为对于有些代码,可能看上去能进行优化,但是认真地去做分析,在有些场景下它并不能安全的优化,可能会出现出其不意的结果。妨碍优化的两个因素:1. 内存别名使用;2. 函数调用。编译器总会假设最糟的假设。
CPE(cycles per element):每元素的周期数
几种提高循环效率的方法:
指令乱序执行:指令的执行顺序不一定要与他们在机器级程序中的顺序一致。通过一些限制,使得在乱序执行指令的基础上得到预期的结果。整个设计有两个主要部分:指令控制单元,执行单元。一个处理器内,有多个功能单元,包括:分支、算术运算、加载、存储等。而且一个功能可能有多个单元。
延迟:完成运算所需要的总时间;发射:两个连续的同类型的运算之间需要的最小时钟周期数;容量:能够执行该运算的功能单元的数量。
RAM(随机访问存储器)分SRAM、DRAM。SRAM用于高速缓存(cache),又可分为i-cache和d-cache;DRAM用于主存。ROM(只读存储器)断电不丢失数据,可以存放系统启动程序。
SSD(固态硬盘)和旋转磁盘,对于旋转磁盘,必须得密封包装,因为怕有灰尘落到磁道上面,读写头碰到灰层的时候就会出错。
PCI(外围设备互联)模型中,系统中所有的设备共享总线,一个时刻只能有一台设备访问这些电路。
CPU使用一种称为内存映射IO的技术来向IO设备发射指令。在使用内存映射IO的系统中,地址空间中有一块地址是为与IO设备通信保留的。每个这样的地址称为一个IO端口。当一个设备连接到总线时,它与一个或多个端口相关联。举个例子:假设磁盘控制器映射到端口0xa0。随后,CPU可能通过执行三个对地址0xa0的存储指令,发起磁盘读:第一条指令时发送一个命令字,告诉磁盘发起一个读,同时还发送了其他参数,例如当读完成时,是否中断CPU,第二条指令致命应该读的逻辑块号,第三条指令指明应该存储磁盘三区内容的主存地址。
设备可以自己执行读或者写总线事务而不需要CPU干涉过程,称为DMA(直接内存访问)。这种数据传送称为DMA传送。
计算机倾向于用邻近于其他最近引用过的数据项的数据项,说着最近引用过的数据项本身,这种倾向性,被称为局部性原理。
存储器层次结构的本质是:每一层存储设备都是较低一层的缓存。
几种高速缓存映射策略:直接映射高速缓存、组相联高速缓存、全相连映射(TLB)。命中缓存分三步:1. 组选择;2. 行匹配; 3. 字抽取
抖动:高速缓存反复地加载和驱逐相同的高速缓存块的组
写命中:直写(每次都写回内存)、写回(驱逐时再写进内存);写不命中:写分配(先读进内存)、非写分配
所有的SRAM高速缓存器都在CPU芯片上