HCL和布尔表达式 多路复用器 集合 存储器和时钟 HCL和布尔表达式 对于看过计算机系统要素的我, 这一部分的很多概念就很熟悉了. GO! HCL类似于用布尔表达式来书写门电路的组合方式, 像这个bool eq = (a && b) || (!a && !b);. 离散数学中提到, 不管多复杂的逻
简化的计算机模型和指令集 异常代码 特殊指令 - %rsp入栈出栈 简化的计算机模型和指令集 为了研究处理器的架构, CSAPP设计了一套简化的计算机模型和对应的指令集叫做Y86-64. 主要特点如下: 15个寄存器, 不包括%r15. 这样内部寻址可以用0-15来选择寄存器. %rsp依然用作栈指
浮点寄存器 浮点数指令 - 传送和转换操作 浮点数指令 - 寄存器分配 浮点数指令 - 浮点数的运算和浮点常数 浮点数指令 - 浮点数的位级操作 浮点数指令 - 浮点数比较 浮点寄存器 AVX2的浮点寄存器一共有16个, 命名比较规则, 从%YMM0 - %YMM15, 每个寄存器都是256位长.
指针 缓冲区溢出 缓冲区保护 变长栈帧 指针 这里借着底层知识实际上就把指针又复习了一遍, 指针有如下特性: 指针有类型, 是指向的是哪一类对象, 指针的类型对于机器级程序表示没有任何用处, 只是为了给编译器看和计算出地址 指针的值是一个无符号整数, 表示内存地址, 如果为0表示NULL, 即没有指
数组 结构 联合 数据对齐 数组 感觉CSAPP这里实际上是把C语言的数组和汇编语言一起讲了. 声明一个数组T A[N]实际上的意义如下: 分配N个T类型大小的连续空间 指向这个连续空间的第一个T类型大小的指针叫做A, A中的地址就是这个数组的第一个元素. 按照索引往后查找的时候, 只需要用地址加上
过程是怎么实现的. 过程在不同的语言中的表现形式不同, 比如函数, 方法等.但其底层都有一些共同的特性, 假设过程P调用过程Q: 传递控制: 进入Q的时候, 程序计数器的地址很显然要被设置成Q的起始指令所在的内存. 在返回的时候,则需要将程序计数器设置为P调用Q的指令之后的那条指令的地址. 传递数据
控制语句除了条件分支就是循环, 今天看循环的操作, 以及比较特殊的分支语句, 就是switch. do-while循环 while循环 for循环 switch语句 汇编指令并没有直接的指令对应循环, 而是用条件测试和跳转组合起来实现循环的效果. 汇编代码主要基于两种基本的循环模式. 先来看两种基本
控制语句就是分支,和循环. 今天先来看看分支的相关指令. 条件判断: 条件码 条件判断: 跳转指令 条件判断: 条件传送 条件码 条件码是一些特殊的寄存器, 在每次算术或者逻辑运算之后更新, 也有特殊的指令可以操作这些寄存器. 很多条件分支指令, 就是通过检测这些寄存器的值来实现的. 常用的条件码有
传送指令主要有如下: 普通传送 零扩展传送 符号扩展传送 压栈和弹栈 算术指令比较多了,而且也都区分长度,主要从以下几个方面介绍: leaq 指令 一元与二元操作 移位操作 特殊操作 - 128位扩展 数据传送指令 我们不生产数据,我们只是数据的搬运工. -MOV类指令. MOV类指令有四个变体,对
获取源程序对应的汇编程序 如果想要获取自己编写的源程序对应的汇编程序,基本步骤是: 将自己的文件用GCC转换成目标代码 使用反汇编器得到格式良好的汇编代码 其中第一步, 也可以直接使用GCC转换成汇编代码,可以指定优化的级别. 按照书上写了这么一个程序: long mult2(long, long)