结构体与联合体
结构体数据对齐:
起始地址需要对齐,向前插入(数据末端同样会插入间隙),下图为j需要偏移量对齐,在j前c后插入间隙
联合体:
与结构体不同,联合体中的所有字段共享同一存储区域,因此联合体的大小取决于它最大字段的大小
缓冲区溢出
均由编译器和操作系统自动完成
指令系统结构
本书采用基于X86-64简化的Y86-64结构
相对于x86-64的指令系统,少了一个寄存器%r15 ,主要是为了降低指今编码的复杂度,稍后在指合的编码部分可以体会到。在Y86-64指合系统中,寄存器%rsp也是被定义为栈指针,其他14个无固定含义。
条件码(跳转时的判断条件)寄存器也有简化,仅保留了3个条件码,分别为零标志(ZF)、符号标志(SF)和溢出标志(OF),删去了CF(进位标志)。
PC为程序计数器(存指令地址),Stat是状态码
指令集优化:
将x86-64中的数据传送指令movq指令分成了四种不同的指合,具体如图所示,重定义后的数据传送指令显示的指明了源操作数和目的操作数的格式,指令名字的第一个字母表明了源操作数的类型,源操作数可以是立即数(i)、寄存器(r)或内存(m)。指令名字的第二个字母指明了目的操作数的类型,目的操作数可以是寄存器和内存。
每条指令的第一个字节表面指令的类型 ,这个字节分为两部分,每一部分占4个比特位,高4位表示指令代码,低4位表示指令功能。当指今中有寄存器类型的操作数时,会附加一个字节,这个字节被称为寄存器指示符字节,它用来指定一个或者两个寄存器,因此还需要对寄存器进行编码。
寄存器的编码:
条件传送指令有6条,它与数据传送指合rrmovq有相同的指令格式,但是只有条件码满足条件时,于会更新目的寄存器的值
halt:停止指令,nop表示一个空操作
call:函数调用,ret:函数返回;push和pop实现出入栈