第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节.对于机器级编程来说,其中两种抽象尤为重要.第一种是由指令集体系结构或指令集架构(Instruction Set Architecture,ISA)来定义机器级程序的格式和行为,它定义了处理器状态.指令的格式,以及每条指令都是按顺序执行的,一条指令结束后,下一条再开始.处理器的硬件远比描述的精细复杂,…
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般是寄存器)的值压入栈中,由于栈向下生长,所以这时栈顶指针会减小一点 2.move 操作数的个数:2 第一个操作数是源操作数,第二个操作数是目的操作数,该指令将源操作数的值赋给目的操作数 3.call 操作数的个数:1 调用某个方法,栈的变化没有完全弄明白 4.pop 操作数的个数:1 将栈顶元素赋给…
如题所示,这一章讲解了程序在机器中是怎样表示的,主要讲汇编语言与机器语言. 学习什么,为什么学,以及学了之后有什么用 我们不用学习如何创建机器级的代码,但是我们要能够阅读和理解机器级的代码. 虽然现代的优化编译器能够很有效的将高级代码翻译成机器级的代码,但是,为了能够达到以下 2 点目的,我们还是要能够阅读和理解机器级的代码: 1.通过查看程序对应的汇编代码,可以了解程序的运行效率,然后可以采取相应措施提高其效率 2.系统程序中的漏洞会被人利用,导致安全问题.了解这些漏洞是如何出现的,以及如何防…
这周由于时间和精力有限,只读一小节:3.4.4  压入和弹出栈数据 栈是一种特殊的数据结构,遵循“后进先出”的原则,可以用数组实现,总是从数组的一端插入和删除元素,这一端被称为栈顶. 栈有两个常用指令: push:把数据压入栈中 pop:删除数据 这两个指令都只有一个操作数 一般栈在内存中,是向下生长的,所以栈顶元素的地址是所有栈中元素地址中最低的. 结合以上三点,可以看出: 压栈(push)时,栈指针(寄存器 %rsp)会减小 出栈(pop)时,栈指针会增大 由于栈和程序代码以及其他形式的程序…
这周看了刘老师提供的相关视频,以及书中对应的章节“3.7 过程” 这一节分为运行时栈.转移控制.数据传送.栈上的局部存储.寄存器中的局部存储空间和递归过程这 6 个小节 其中前 3 小节看懂了一部分内容,后面两个还没来得及看,下周看完补上 下面记录一下看懂的部分内容 首先,过程作为一种很重要的抽象(方法.函数都是过程),必然存在互相调用的情况,而过程调用有三个要点(以过程 P 调用过程 Q 为例): 传递控制:调用过程 Q 时,需将程序计数器指向 Q 的起始地址:调用结束之后,程序计数器需指向过…
程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈   x86-64的栈向低地址方向增长,而栈指针%rsp指向低地址方向增长,而栈指针%rsp指向栈顶元素.可以用pishq和popq指令将数据存入栈中或是从栈中取出.将栈指针减小一个适当的量可以为没有指定初始值的数据在栈上分配空间.类似地,可以通过增加栈指针来释放空间.  当x86-64过程需要的存储空间超出寄存器能够存放的…
CSAPP:程序的机器级表示2 关键点:算术.逻辑操作 算术逻辑操作1.加载有效地址2.一元二元操作3.移位操作 算术逻辑操作   如图列出了x86-64的一些整数和逻辑操作,大多数操作分成了指令类(只有leaq没有其他的变种,addb.addw.addl.addq分别是字节加法.字加法.双字加法和四字加法),这些操作通常分为四组:加载有效地址.一元操作.二元操作和移位操作. 1.加载有效地址 leaq S,D;D = &S  加载有效地址指令leag实际上是movq指令的变形,它的指令形式上是…
CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式   术语字(word)表示16位数据类型,32位数为双字(double words),64位数为四字(quad words).图3-1给出了c语言的数据类型在x86-64中的大小.在64位机器中标准int为双字,指针为8字.  不通数据类型产生的汇编代码后缀如图所示.movb(传送字节).movw(传送字).movl(传送双字).movq(传送四字) 访问信息   一个x86-64的…
目录 1. 数据的编码与存储 2. 汇编指令 2.1 数据传送指令 访存方式 数据传送指令 入栈出栈 2.2 算术/逻辑指令 2.3 过程控制指令 控制码 比较指令 跳转指令 条件设置指令 3. 程序设计 3.1 循环 do-while循环 while循环 3.2 if-else分支 3.3 switch分支 3.4 函数调用 运行时栈 调用的实现 3.5 递归 4. 工具使用 4.1 gcc 4.2 gdb&objdump 4.3 makefile makefile的格式 make的高级特性…
<深入理解计算机系统> 第三版 第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了 22 ~ 28 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9824395.html 计算机中存储整数时,一般都是以补码的形式存储的 因为使用补码计算的话,计算机可以不用判断符号位(直接把所有位的值都当做数值),可以用加法去替代减法(少了一种算法) 对于虚拟地址和虚拟地址空间不大理解,先把相关内容摘抄下来: “机器级程序将内存视为一个非常大的字节数组…
本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. [一]程序编码 -O1表示1级optimize,一般第二级优化比较好. 1.机器级代码 两种抽象尤为重要:1.机器级程序的格式和行为 --指令集体系结构.2.储存器地址是虚拟的,字节数组. 机器级代码可控部分: 程序计数器(pc, %eip) 整数寄存器文件:8个命名的位置,分别存储32位的值,可…
第七章读书笔记 链接 链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.(这个文件可被加载或拷贝到存储器并执行) 链接可以执行于编译,加载或运行时. 静态链接: 两个主要任务: 1 符号解析:将目标文件中的每个全局符号都绑定到一个唯一的定义 2 重定位:确定每个符号的最终存储器地址,并修改对那些目标的引用 符号表: typedef struct{ int name; //字符串表中的字节偏移,指向符号的以NULL结尾的名字 int value; //符号的地址,对于可重定位的模块是…
Linux下程序的机器级表示学习心得 上周学习完Linux程序的机器级表示后,对于其中有些还是掌握的不太透彻.对于老师提出的关于本章一些细节的问题还是有不会,所以又重新温习了一下上周的学习内容,以下为学习心得. 分析反汇编 操作过程 分析反汇编采用了书上的一个简单案例.C语言代码如下. int a(int x) { returnx+1; } int b(int x) { return a(x); } int main (void) { return b(8)+14; } 使用vim编辑器编译代码…
3.1 程序的机器级表示 发展历史 Intel,AMD,ARM 等企业各有又是,CPU 从 8 位发展到 16 位,再到 32 位,近几年发展到 64 位,当下的 CPU 体系被称为 x86-64 体系结构,主要是 Intel 和 AMD 两家的产品. IA32 处理器体系结构是 32 位芯片. CPU 的微观视图架构 当下的计算机大多是采用冯诺伊曼体系结构,计算机由存储器,运算器,控制器,输入设备,输出设备组成. IA32 的寄存器 通用寄存器的特殊用法 EAX:扩展累加寄存器.在乘法和除法指…
对此书已经慕名已久了,抽空看了第1,2,3,5章,其他章节等有空闲继续看吧. 我的许多博客是给自己快速复习使用的,比如此读书后感,你可以根据我下面的建议读完原书几章再回来复习一下(或许那时候就没必要回来这里复习了): 第一章个人认为必须看,理由有: 1.它很短,花不了多少时间 2.它有趣味,我犹记得看此章节的畅快. 第二章个人认为必须看,而且要认真看,不要跳 第三章个人认为最好看一看,但或许用处不会太大,讲的是程序的汇编级代码,可以用来调试.逆工程.查看性能等 第四章我还没看 第五章个人认为只需…
9.11 A. 00001001 111100 B. +----------------------------+ | Parameter Value | +----------------------------+ | VPN 0x09 | | TLB index 0x01 | | TLB tag 0x02 | | TLB hit? N | | Page fault? N | | PPN 0x17 | +----------------------------+ C. 010111 11110…
<深入理解计算机系统> 第三版 第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了 29 ~ 34 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9866674.html 对于跨越多字节的程序对象,有两个规则必须建立 1.这个对象的地址是多少? 一般使用所有字节中最小的地址作为对象的地址 2.这个对象的内容在内存中如何排列? 有两种排列方法 (1)大端法 最高有效为放在前面 (2)小端法 最低有效位放在前面 Android 和 IOS…
深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第三章 – 布局,块和模板 我们接着研究Magento.根据我们第二章讲的Magento MVC的架构,我们接下来应该讲模型(Model),但是我们跳过模型先来看布局和块.和一些流行的PHP MVC架构不同的是,Magento的执行控制器不直接将数据传给视图,相反的视图将直接引用模型,从模型取数据.这样的设计就导致了视图被拆分成两部分,块(Block)和模板(Template).块是PHP对象,而模板是原始PH…
第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了第 500~507 页,共 8 页) 第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/10165167.html ECF(Exception Control Flow,异常控制流)是I/O.进程和虚拟内存的共用基本概念. 在能够真正理解这些重要概念之前,我们需要真正的理解 ECF. 向磁盘写数据.从网络读取数据.创建一个新进程,以及终止当前进程,都是通过应用程序调用系统调用来实现的. 应用程序是…
1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个寄存器.还要注意的一点是:汇编代码的ATT格式和Intel格式.ATT格式是GCC和objdump等工具的默认格式,在CSAPP中一律使用这种格式.而Intel格式则通常会在Intel的IA32架构文档以及微软的Windows技术文档中碰到.两者的主要区别有: Intel格式忽略指令中暗示操作数长度…
1 本章总述 1) 通过让编译器产生机器级程序的汇编表示, 学习了编译器及其优化能力, 以及机器.数据类型和指令集; 2) 学习了程序如何将数据存储在不同的内存区域中 -- 程序开发人员需要知道一个变量是存储在运行时栈中, 亦或是在某个动态分配的数据结构中, 还是全局程序数据的一部分; 3) 程序是以指令序列来表示的, 每条指令都完成一个单独的操作; 部分程序状态, 比如寄存器和运行时栈, 对程序开发人员来说是直接可见的; 4) 编译器必须使用多条指令来产生和操作各种数据结构, 以及实现包括条件…
这次花了4小时40分钟,看了第 559~575 页,共 17 页 第一遍对应地址 https://www.cnblogs.com/stone94/p/10264044.html 注意:本章的练习题一定要做,并且要在看到的时候立即做,这非常有助于理解刚学的小节的内容,继续往后看的时候,也不至于持续积累懵逼程度     关键术语及其英文表示: 记住这些对看懂本章有很大的帮助,或者把这些当做字典,看书时忘记某个英文缩写代表什么意思时,来看看也行 VM:虚拟内存 PA:物理地址 VA:虚拟地址 MMU:…
第七章--链接 0.总结 链接编译时可以采用静态链接或动态链接. 连接器主要任务:符号解析和重定位. 多个目标文件可定义相同的符号,可以被连接到一个单独的静态库. 链接器可以生成部分链接的可执行文件 动态链接器通过加载共享库和重定位程序中的引用来完成链接任务. 1.编译器驱动程序 编译系统提供的调用预处理器.编译器.汇编器和链接器来构造目标文件的程序. 2.静态链接 3.目标文件 三种形式: 1.可重定位目标文件: 2.可执行目标文件: 3.共享目标文件: 4.可重定位目标文件 ELF格式 5.…
3.1流程控制 三种基本技术可以改变程序的控制流程: ①   调用方法:调用方法将导致控制流程离开当前方法,转移到被调用的方法: ②   选择:java中有两种做出选择的机制:if/else语句和switch语句.三目运算符也可以用于选择,但它通常是if/else的一个简写版本: ③   循环:java中有三种循环语句:for循环.while循环.do/while循环. 3.2布尔逻辑运算 和:符号&,只有在组合表达式的每个部分都为真时,组合表达式才为真: 短路和:符号&&,即如果…
1.编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*- 2.标识符 第一个字符必须是字母表中字母或下划线'_'. 标识符的其他的部分有字母.数字和下划线组成. 标识符对大小写敏感. 在Python 3中,非-ASCII 标识符也是允许的了.有个不成文的规矩: 常量用全部大写 全局变量用两个下划线开头 变量.类名等命名采用驼峰命名法 3.python保…
参考: https://blog.csdn.net/zhouzhaoxiong1227/article/details/22820533 一..初始化数组变量 在实际的软件开发项目中,变量在使用前应初始化,防止未经初始化的变量被引用. 对于数组变量来说,恰当的初始化样例如下:           char szString[100] = {0}; 定义了一个名为szString的包含100个字节的数组变量,并将该数组中每个变量的初始值赋为0. 二. 定义和初始化结构体变量 结构体变量的定义方法的…
三种构造并发程序的方法及其优缺点 1.进程 用这种方法,每个逻辑控制流都是一个进程,由内核来调度和维护.因为进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信机制. 优点: 由于进程有独立的地址空间,所以一个进程不可能不小心覆盖另一个进程的虚拟内存,这就消除了许多令人迷惑的错误 缺点: (1)还是由于进程有独立的地址空间,使得进程共享状态信息变得更加困难.为了共享信息,它们必须使用显式的 IPC(进程间通信)机制. (2)由于进程控制和 IPC 的开销很高,所以这种方…
客户端和服务器通过因特网这个全球网络来通信.从程序员的观点来看,我们可以把因特网看成是一个全球范围的主机集合,具有以下几个属性: 1.每个因特网主机都有一个唯一的 32 为名字,称为它的 IP 地址 2.IP 地址的集合被映射为一个因特网域名的集合 3.不同因特网主机上的进程能够通过链接互相通信 客户端和服务器通过套接字接口建立连接.一个套接字是连接的一个端点,连接以文件描述符的形式提供给应用程序.套接字接口提供了打开和关闭套接字描述符的函数.客户端和服务器通过读写这些描述符来实现彼此间的通信…
参见上学期的学习笔记: http://www.cnblogs.com/20135202yjx/p/4836058.html…
[前言] 我们都知道,面向对象(类)的三大特征:封装.继承.多态 继承:子类继承父类的私有属性和公有方法 封装:把相同的代码写在一个函数中 多态: ->重载:JS严格意义上是没有重载,但可以通过传递不同参数实现不同功能 ->重写:子类重写父类的方法(这里只要把父类的原型一改,父类的其他实例会受到影响,又因为子类的原型链继承父类的实例,这就会导致同样会影响到子类的实例,本质是因为在JS原型继承中,由于它的核心原理,继承并不是从父类中拿过一份一模一样的东西拷贝过来,而是让子类和父类之间增加了一个原…