1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个寄存器.还要注意的一点是:汇编代码的ATT格式和Intel格式.ATT格式是GCC和objdump等工具的默认格式,在CSAPP中一律使用这种格式.而Intel格式则通常会在Intel的IA32架构文档以及微软的Windows技术文档中碰到.两者的主要区别有: Intel格式忽略指令中暗示操作数长度…
六星经典CSAPP笔记(1)计算机系统巡游 六星经典CSAPP笔记(2)信息的操作和表示 六星经典CSAPP-笔记(3)程序的机器级表示…
CSAPP即<Computer System: A Programmer Perspective>的简称,中文名为<深入理解计算机系统>.相信很多程序员都拜读过,之前买的旧版没有读完,如今恰好第二版出版,就入手影印版重读经典.一读果然,经典依然是经典,CMU卡内基梅隆大学的本科教材,堪比另一本SICP的六星佳作啊! 1.A Tour of Computer System 1.1 Programs Are Translated by Other Programs into Diffe…
2.Representing and Manipulating Information 本章从二进制.字长.字节序,一直讲到布尔代数.位运算,最后无符号.有符号整数.浮点数的表示和运算.诚然有些地方的数学证明有些枯燥,但总体上看,本章还是干货十足的! 2.1 Decimal vs. Binary Notation 我们习惯十进制只是因为我们有十根手指头(?),所以会对二进制感到不习惯.但是二值信号(two-value signal)在表示.存储.传输方面有巨大优势,从打孔带上的有没有孔洞(代码的…
六星经典CSAPP-笔记(7)加载与链接 1.对象文件(Object File) 1.1 文件类型 对象文件有三种形式: 可重定位对象文件(Relocatable object file):包含二进制代码和数据,能与其他可重定位对象文件在编译时合并创建出一个可执行文件. 可执行对象文件(Executable object file):包含可以直接拷贝进行内存执行的二进制代码和数据. 共享对象文件(Shared object file):一种特殊的可重定位对象文件,能在加载时或运行时,装载进内存进…
六星经典CSAPP-笔记(11)网络编程 参照<深入理解计算机系统>简单学习了下Unix/Linux的网络编程基础知识,进一步深入学习Linux网络编程和TCP/IP协议还得参考Stevens的书. 1.网络基础 (略过,待补充) 2.IP地址 2.1 IP地址的表示 IP地址是一个无符号的32位整数.Linux网络程序使用下面这种IP地址结构存储IP地址: /* Internet address structure */ struct in_addr { unsigned int s_add…
六星经典CSAPP-笔记(12)并发编程(上) 1.并发(Concurrency) 我们经常在不知不觉间就说到或使用并发,但从未深入思考并发.我们经常能"遇见"并发,因为并发不仅仅是操作系统内核的"绝招",它也是应用开发中必不可少的技巧: 访问慢I/O设备:就像当应用程序等待I/O中的数据时内核会切换运行其他进程一样,我们的应用也可以用类似的方式,将I/O请求与其他工作重叠从而挖掘并发的潜能. 推迟工作而减少延迟:我们可以推迟一些耗时工作稍后执行,例如内存分配器不在…
六星经典CSAPP-笔记(10)系统I/O 1.Unix I/O 所有语言的运行时系统都提供了高抽象层次的I/O操作函数.例如,ANSI C在标准I/O库中提供了诸如printf和scanf等I/O缓冲功能的函数:C++中则重载了<<和>>用来支持读写.在Unix系统中,这些高层次的函数基于Unix的系统I/O函数来实现,多数时候我们都无需直接使用底层的Unix I/O.但学习Unix系统I/O能更好地理解一些系统概念,而且当高层次的函数不适用时我们也能轻松地实现想要的功能,例如访…
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的…
程序的机器级表示3 关键点:过程.调试.指针 过程1.运行时栈2.转移控制3.数据传递4.栈上的局部存储5.寄存器中的局部存储空间理解指针使用GDB调试器 过程 1.运行时栈   x86-64的栈向低地址方向增长,而栈指针%rsp指向低地址方向增长,而栈指针%rsp指向栈顶元素.可以用pishq和popq指令将数据存入栈中或是从栈中取出.将栈指针减小一个适当的量可以为没有指定初始值的数据在栈上分配空间.类似地,可以通过增加栈指针来释放空间.  当x86-64过程需要的存储空间超出寄存器能够存放的…
3.1 程序的机器级表示 发展历史 Intel,AMD,ARM 等企业各有又是,CPU 从 8 位发展到 16 位,再到 32 位,近几年发展到 64 位,当下的 CPU 体系被称为 x86-64 体系结构,主要是 Intel 和 AMD 两家的产品. IA32 处理器体系结构是 32 位芯片. CPU 的微观视图架构 当下的计算机大多是采用冯诺伊曼体系结构,计算机由存储器,运算器,控制器,输入设备,输出设备组成. IA32 的寄存器 通用寄存器的特殊用法 EAX:扩展累加寄存器.在乘法和除法指…
Linux下程序的机器级表示学习心得 上周学习完Linux程序的机器级表示后,对于其中有些还是掌握的不太透彻.对于老师提出的关于本章一些细节的问题还是有不会,所以又重新温习了一下上周的学习内容,以下为学习心得. 分析反汇编 操作过程 分析反汇编采用了书上的一个简单案例.C语言代码如下. int a(int x) { returnx+1; } int b(int x) { return a(x); } int main (void) { return b(8)+14; } 使用vim编辑器编译代码…
本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. [一]程序编码 -O1表示1级optimize,一般第二级优化比较好. 1.机器级代码 两种抽象尤为重要:1.机器级程序的格式和行为 --指令集体系结构.2.储存器地址是虚拟的,字节数组. 机器级代码可控部分: 程序计数器(pc, %eip) 整数寄存器文件:8个命名的位置,分别存储32位的值,可…
iOS 程序员 6 级考试(答案和解释)   我是前言 1. 下面的代码分别输出什么? @implementation Son : Father- (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass([self class])); NSLog(@"%@", NSStringFromClass([super class])); } return self;}@end 答案…
1 本章总述 1) 通过让编译器产生机器级程序的汇编表示, 学习了编译器及其优化能力, 以及机器.数据类型和指令集; 2) 学习了程序如何将数据存储在不同的内存区域中 -- 程序开发人员需要知道一个变量是存储在运行时栈中, 亦或是在某个动态分配的数据结构中, 还是全局程序数据的一部分; 3) 程序是以指令序列来表示的, 每条指令都完成一个单独的操作; 部分程序状态, 比如寄存器和运行时栈, 对程序开发人员来说是直接可见的; 4) 编译器必须使用多条指令来产生和操作各种数据结构, 以及实现包括条件…
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般是寄存器)的值压入栈中,由于栈向下生长,所以这时栈顶指针会减小一点 2.move 操作数的个数:2 第一个操作数是源操作数,第二个操作数是目的操作数,该指令将源操作数的值赋给目的操作数 3.call 操作数的个数:1 调用某个方法,栈的变化没有完全弄明白 4.pop 操作数的个数:1 将栈顶元素赋给…
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节.对于机器级编程来说,其中两种抽象尤为重要.第一种是由指令集体系结构或指令集架构(Instruction Set Architecture,ISA)来定义机器级程序的格式和行为,它定义了处理器状态.指令的格式,以及每条指令都是按顺序执行的,一条指令结束后,下一条再开始.处理器的硬件远比描述的精细复杂,…
如题所示,这一章讲解了程序在机器中是怎样表示的,主要讲汇编语言与机器语言. 学习什么,为什么学,以及学了之后有什么用 我们不用学习如何创建机器级的代码,但是我们要能够阅读和理解机器级的代码. 虽然现代的优化编译器能够很有效的将高级代码翻译成机器级的代码,但是,为了能够达到以下 2 点目的,我们还是要能够阅读和理解机器级的代码: 1.通过查看程序对应的汇编代码,可以了解程序的运行效率,然后可以采取相应措施提高其效率 2.系统程序中的漏洞会被人利用,导致安全问题.了解这些漏洞是如何出现的,以及如何防…
目录 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的高级特性…
这周由于时间和精力有限,只读一小节:3.4.4  压入和弹出栈数据 栈是一种特殊的数据结构,遵循“后进先出”的原则,可以用数组实现,总是从数组的一端插入和删除元素,这一端被称为栈顶. 栈有两个常用指令: push:把数据压入栈中 pop:删除数据 这两个指令都只有一个操作数 一般栈在内存中,是向下生长的,所以栈顶元素的地址是所有栈中元素地址中最低的. 结合以上三点,可以看出: 压栈(push)时,栈指针(寄存器 %rsp)会减小 出栈(pop)时,栈指针会增大 由于栈和程序代码以及其他形式的程序…
这周看了刘老师提供的相关视频,以及书中对应的章节“3.7 过程” 这一节分为运行时栈.转移控制.数据传送.栈上的局部存储.寄存器中的局部存储空间和递归过程这 6 个小节 其中前 3 小节看懂了一部分内容,后面两个还没来得及看,下周看完补上 下面记录一下看懂的部分内容 首先,过程作为一种很重要的抽象(方法.函数都是过程),必然存在互相调用的情况,而过程调用有三个要点(以过程 P 调用过程 Q 为例): 传递控制:调用过程 Q 时,需将程序计数器指向 Q 的起始地址:调用结束之后,程序计数器需指向过…
程序的机器级表示 计算机能读懂是机器代码(machine code)-- 用字节序列编码的低级操作 -- 也就是0和1.编译器基于编程语言的规则.目标机器的指令集和操作系统的规则,经过一系列阶段产生机器代码.由于机器语言全是由0和1组成的,所以对于编程人员来说编写机器代码十分困难,也不容易学习.汇编语言(assembly language)就是机器语言的可读形式,学习汇编语言有很多的好处. An assembly (or assembler) language,[1] often abbrevi…
一.继承条件下的构造方法调用 class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extends Grandparen…
<C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 练习6.2: 返回类型错误 无返回类型 形参名字应该不同 函数体需要用花括号包含起来 练习6.4: 实现:编写函数,使得用户输入一个整数,main函数调用函数得到阶乘. #include<iostream> using namespace std; int fact(int n) { int r…
第六章第一个linux个程序:统计单词个数 从本章就开始激动人心的时刻——实战,去慢慢揭开linux神秘的面纱.本章的实例是统计一片文章或者一段文字中的单词个数.  第 1 步:建立 Linu x 驱动骨架 (装载和卸载 Linu x 驱动) 第 2 步:注册和注销设备文件: 第 3 步z 指定与驱动相关的信息: 第 4 步=指定回调函数 : 第 5 步z 编写业务逻辑 : 第 6 步:编写 Makefile文件 : 第 7 步z 编译 Linux 驱动程序 : 第 8 步2 安装和卸载 Lin…
PHP笔记——java程序员看懂PHP程序   php是一种服务器端脚本语言,类型松散的语言. <?php   ?>       xml风格 <script language=”php”></script>   脚本风格 <?       ?>    简短风格 <%              %>    ASP风格 以;结尾: 注释: a)         // b)         # c)         /*     */ 变量是存储数据的…
前言 本文给出一段经典的 Java 风格程序,请读者初步体会 Java 和 C++ 程序的不同. 第一步:编写一个类 // 将这个类打包至 testpackage 包中 package testpackage; // 导入包 import java.util.*; // 定义一个类 public class Employee { private String name; private double salary; private Date hireDay; // 定义构造器 public Em…
CSAPP 5 - 优化程序性能 1. 概述 首当其冲的,还是要编写出好的算法和数据结构,优化内部结构 其次才是编写出能让编译器 易优化的,高效的可执行代码.这点在特定的机器上可能有着特定的不同的优化,但有一些基本的优化仍然是相同的. 消除不必要的工作,让代码消耗时间在期望执行的任务上.包括消除或减少函数调用.条件测试.内存引用:同时熟悉处理器如何工作,利用反汇编知道它究竟如何执行操作,从而调整程序获得最大的速度. 利用好处理器的指令级并行能力,同时执行多条指令 2. 利用好编译器自身优化 gc…
程序员学习汇编代码的需求随着时间的推移发生了变化,开始时只要求程序员能直接用汇编语言编写程序,现在则要求他们能够阅读和理解编译器产生的代码. 下面是针对32位机器 数据格式 Intel用术语“字”(word)表示16位数据类型,32位数称为双字(double words),64位数称为四字(quad words),下面是C语言数据类型在32位机器上的字节长度: 大多数GCC生成的汇编代码指令都有一个字符后缀,表面操作数的大小,例如movb传送字节,movw传送字,movl传送双字,但是汇编代码也…