CSAPP:第三章程序的机器级表示2】的更多相关文章

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过程需要的存储空间超出寄存器能够存放的…
本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. [一]程序编码 -O1表示1级optimize,一般第二级优化比较好. 1.机器级代码 两种抽象尤为重要:1.机器级程序的格式和行为 --指令集体系结构.2.储存器地址是虚拟的,字节数组. 机器级代码可控部分: 程序计数器(pc, %eip) 整数寄存器文件:8个命名的位置,分别存储32位的值,可…
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9943779.html 本章汇编代码中常出现的几个指令及其含义 1.push 操作数的个数:1 将操作数(一般是寄存器)的值压入栈中,由于栈向下生长,所以这时栈顶指针会减小一点 2.move 操作数的个数:2 第一个操作数是源操作数,第二个操作数是目的操作数,该指令将源操作数的值赋给目的操作数 3.call 操作数的个数:1 调用某个方法,栈的变化没有完全弄明白 4.pop 操作数的个数:1 将栈顶元素赋给…
如题所示,这一章讲解了程序在机器中是怎样表示的,主要讲汇编语言与机器语言. 学习什么,为什么学,以及学了之后有什么用 我们不用学习如何创建机器级的代码,但是我们要能够阅读和理解机器级的代码. 虽然现代的优化编译器能够很有效的将高级代码翻译成机器级的代码,但是,为了能够达到以下 2 点目的,我们还是要能够阅读和理解机器级的代码: 1.通过查看程序对应的汇编代码,可以了解程序的运行效率,然后可以采取相应措施提高其效率 2.系统程序中的漏洞会被人利用,导致安全问题.了解这些漏洞是如何出现的,以及如何防…
第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9905345.html 机器级代码 计算机系统使用了多种不同形式的抽象,利用更简单的抽象模型来隐藏实现的细节.对于机器级编程来说,其中两种抽象尤为重要.第一种是由指令集体系结构或指令集架构(Instruction Set Architecture,ISA)来定义机器级程序的格式和行为,它定义了处理器状态.指令的格式,以及每条指令都是按顺序执行的,一条指令结束后,下一条再开始.处理器的硬件远比描述的精细复杂,…
目录 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 的起始地址:调用结束之后,程序计数器需指向过…
Linux下程序的机器级表示学习心得 上周学习完Linux程序的机器级表示后,对于其中有些还是掌握的不太透彻.对于老师提出的关于本章一些细节的问题还是有不会,所以又重新温习了一下上周的学习内容,以下为学习心得. 分析反汇编 操作过程 分析反汇编采用了书上的一个简单案例.C语言代码如下. int a(int x) { returnx+1; } int b(int x) { return a(x); } int main (void) { return b(8)+14; } 使用vim编辑器编译代码…
程序的机器级表示 AT&T与Intel格式的汇编代码 我们的表述是ATT(根据"AT&T"命名的, AT&T是运营贝尔实验室多年的公 司)格式的汇编代码,这是GCC. OBJDUMP和其他一些我们使用的工具的默认格式. 其他一些编程工具,包括Microsoft的工具,以及来自Intel的文档,其汇编代码都是Intel格式的.这两种格式在许多方面有所不同.比如下面的几点: intel代码省略了指示大小的后缀.比如使用push和pop,而不是pushl和popl.…
3.1 程序的机器级表示 发展历史 Intel,AMD,ARM 等企业各有又是,CPU 从 8 位发展到 16 位,再到 32 位,近几年发展到 64 位,当下的 CPU 体系被称为 x86-64 体系结构,主要是 Intel 和 AMD 两家的产品. IA32 处理器体系结构是 32 位芯片. CPU 的微观视图架构 当下的计算机大多是采用冯诺伊曼体系结构,计算机由存储器,运算器,控制器,输入设备,输出设备组成. IA32 的寄存器 通用寄存器的特殊用法 EAX:扩展累加寄存器.在乘法和除法指…
1 本章总述 1) 通过让编译器产生机器级程序的汇编表示, 学习了编译器及其优化能力, 以及机器.数据类型和指令集; 2) 学习了程序如何将数据存储在不同的内存区域中 -- 程序开发人员需要知道一个变量是存储在运行时栈中, 亦或是在某个动态分配的数据结构中, 还是全局程序数据的一部分; 3) 程序是以指令序列来表示的, 每条指令都完成一个单独的操作; 部分程序状态, 比如寄存器和运行时栈, 对程序开发人员来说是直接可见的; 4) 编译器必须使用多条指令来产生和操作各种数据结构, 以及实现包括条件…
1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个寄存器.还要注意的一点是:汇编代码的ATT格式和Intel格式.ATT格式是GCC和objdump等工具的默认格式,在CSAPP中一律使用这种格式.而Intel格式则通常会在Intel的IA32架构文档以及微软的Windows技术文档中碰到.两者的主要区别有: Intel格式忽略指令中暗示操作数长度…
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. 二. 定义和初始化结构体变量 结构体变量的定义方法的…
<深入理解计算机系统(第二版)>CSAPP 第三章 家庭作业 这一章介绍了AT&T的汇编指令 比较重要 本人完成了<深入理解计算机系统(第二版)>(以下简称CSAPP)第三章的家庭作业,并与网上的一些答案进行了对比修正. 感谢博主summerhust的整理,以下贴出AT&T常用汇编指令 AT&T常用汇编指令 数据传送指令 指令 效果 描述 movl S,D D <-- S 传双字 movw S,D D <-- S 传字 movb S,D D &l…
[-1]相关声明 本文总结于csapp: 了解详情,或有兴趣,建议看原版书籍: [0]程序编码 GCC调用了一系列程序,将源代码转化成可执行代码的流程如下: (1)C预处理器扩展源代码,插入所有用#include命令指定的文件,并扩展声明的宏: (2)编译器产生两个源代码的汇编代码:*.s: (3)汇编器将汇编代码转化为二进制目标代码 :*.o ; (目标代码是机器代码的一种形式,它包含所有指令的二进制表示,但没有填入地址的全局值) (4)链接器将目标代码与实现库函数的代码合并,最终产生可执行代…
程序员编程艺术:第三章续.Top K算法问题的实现 作者:July,zhouzhenren,yansha.     致谢:微软100题实现组,狂想曲创作组.     时间:2011年05月08日     微博:http://weibo.com/julyweibo .     出处:http://blog.csdn.net/v_JULY_v .     wiki:http://tctop.wikispaces.com/. --------------------------------------…
<java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组: 数据类型:4 种整形,2种浮点型,1种字符类型 字符类型:char "A"表示含有A的字符串,其末尾含有字符串结束符,'A'则表示单个A字符 特殊字符需要转义,如: 转义序列 名称 Unicode值 \b 退格 \u0008 \t 制表 \u0009 \n 换行…
▶ 书中第三章部分程序,加上自己补充的代码,包含双向索引表.文建索引.稀疏向量类型 ● 双向索引表 package package01; import edu.princeton.cs.algs4.ST; import edu.princeton.cs.algs4.Queue; import edu.princeton.cs.algs4.In; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; p…
▶ 书中第三章部分程序,加上自己补充的代码,包含公共符号表.集合类型 ● 公共符号表,用于普通查找表的基本类 package package01; import java.util.NoSuchElementException; import java.util.TreeMap; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; public class class01<Key extends C…
▶ 书中第三章部分程序,加上自己补充的代码,包括散列表.线性探查表 ● 散列表 package package01; import edu.princeton.cs.algs4.Queue; import edu.princeton.cs.algs4.SequentialSearchST; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; public class class01<Key, Val…
▶ 书中第三章部分程序,加上自己补充的代码,红黑树 ● 红黑树,大部分方法与注释与二叉树相同 package package01; import java.util.NoSuchElementException; import edu.princeton.cs.algs4.Queue; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; public class class01<Key extend…
▶ 书中第三章部分程序,加上自己补充的代码,平衡二叉搜索树 ● 平衡二叉搜索树 package package01; import java.util.NoSuchElementException; import edu.princeton.cs.algs4.Queue; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.StdOut; public class class01<Key extends Compa…
▶ 书中第三章部分程序,加上自己补充的代码,包括单词频率统计,(单链表)顺序查找表,二分查找表 ● 单词频率统计 package package01; import edu.princeton.cs.algs4.StdIn; import edu.princeton.cs.algs4.ST; import edu.princeton.cs.algs4.StdOut; public class class01 { private class01() {} public static void ma…
本书使用的文件.代码:https://github.com/huangtao36/data_wrangling 机器可读(machine readable)文件格式: 1.逗号分隔值(Comma-Separated Values, CSV) 2.JavaScript对象符号(JavaScript Object Notation, JSON) 3.可扩展标记语言(eXtensible Markup Language, XML)   第三章使用的数据文件: XML数据 XML是一种标记语言,它具有包…
本书使用的文件.代码:https://github.com/huangtao36/data_wrangling 机器可读(machine readable)文件格式: 1.逗号分隔值(Comma-Separated Values, CSV) 2.JavaScript对象符号(JavaScript Object Notation, JSON) 3.可扩展标记语言(eXtensible Markup Language, XML)   第三章使用的数据文件:   一.CSV数据 CSV文件:将数据列用…