《深入理解计算机系统》第五周学习笔记

第三章 程序的机器级表示

一、知识点总结

(一)

  1.计算机执行机器代码,用字节序列编码低级的操作,,包括处理数据、管理存储器、读写存储设备上的数据、利用网络通信。

  2.GCC C语言编译器以汇编代码的形式产生输出,汇编代码是机器代码的文本表示。给出程序中每条指令,然后GCC调用汇编器和链接器,从而根据汇编代码生成可执行的机器代码

  3.逆向过程——通过研究系统和逆向工作来了解系统的创建过程

(二)程序编码

  1.gcc -01 -o p p1.c p2.c  (-01告诉编译器使用第一级优化)

  2.Gcc调用一系列程序将源代码转化为可执行代码。①C预处理器扩展源代码 ②编译器产生两个源代码的汇编代码p1.s、p2.s ③汇编器将汇编代码转为二进制目标代码p1.o、p2.o④链接器将两个目标代码文件与实现库函数的代码合并,并产生最终可执行代码文件p

  3.机器级编程的两种抽象:①指令集体系结构②机器级程序使用的存储器地址是虚拟地址,存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来

  4.gcc -01 -S code.c使用-S选项就能得到C语言编译器产生的汇编代码,产生一个code.s

  5.gcc -01 -c code.c使用-c选项会产生目标代码文件code.o

  6.反汇编器确定程序的字节表示,linux系统中-d可以充当这个角色objdump -d code.o

(三)数据格式

  1.intel用“字”表示16位数据类型,32位数是“双字”

  2.大多数GCC生成的汇编代码指令都有一个字符后缀,表明操作数的大小。数据传送指令:movb(传送字节)、movw(传送字)、movl(传送双字)。注意:汇编代码也用后缀l表示4字节整数和8字节双精度浮点数

(四)访问信息

  1.一个CPU包含一组8个存储32位值的寄存器,用来存储整数数据和指针

  2.操作数类型:立即数($后面跟一个用标准C表示法表示的整数)、寄存器(%ax……)、存储器

  3.数据传送指令

    ①MOV相当于C语言的赋值“=”

    ②注意ATT格式中的方向

    ③注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下

    ④MOV:将源操作数的值复制到目的操作数中。pushl:将数据压入栈。popl:弹出数据

  4.有效地址 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s;Imm是立即数偏移,Eb是基址寄存器,Ei是变址寄存器,s是比例因子(必须是1、2、4或8)

  5.pushl功能是把数据压入栈上,popl是弹出数据,这些指令都只有一个操作数。注意栈顶元素的地址是所有栈中元素地址中最低的。

  6.指针就是地址;局部变量保存在寄存器中

(五)算术和逻辑操作

  1.加载有效地址(P141)

  2.一元操作和二元操作(P142)

  3.移位操作(P143)

  4.特殊的算术操作(P145)

(六)控制

  1.条件码(详见P147)

  2.访问条件码:根据条件码的某个组合将一个字节设置为0或1、条件跳转到程序某个其他的部分、有条件地传送数据

  3.跳转指令及其编码

  有条件跳转(实现if,switch,while,for),无条件跳转jmp(实现goto)。有条件跳转的条件看条件码寄存器,注意leal不改变条件码寄存器。

  4.循环:do while、while、for

  5.条件传送指令

  6.Switch语句:多重分支

(七)过程

  一个过程调用包括将数据(以过程参数和返回值的形式)和控制从代码的一部分传递到另一部分。必须在进入时为过程的局部变量分配空间,并在退出时释放这些空间。

IA32通过栈来实现过程调用。

  1.栈帧结构:栈支持过程调用,机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复和本地存储。为单个过程分配的部分成为栈帧。寄存器%ebp为帧指针,寄存器%esp为栈指针,栈指针可移动

  2.转移控制

  call/ret; 函数返回值存在%eax中

  3.寄存器使用惯例

  注意:一个调用者调用一个被调用者时,被调用者不会覆盖某个调用者稍后会使用的寄存器的值。

  %eax,%edx,%ecx  调用者保存寄存器(Q可覆盖,P的数据不会被破坏)%ebx,%esi,%edi  被调用者保存寄存器(Q在覆盖这些值前必须压入栈并在返回前回复他们)%ebp,%esp   惯例保持%eax用来保存返回值

  即要保存一个值以待以后运算可用的时候,有两种选择:

    ①由调用者保存。在调用之前就压进栈。

    ②由被调用者保存,在刚被调用的时候就压进栈,并在返回之前恢复。

  4.过程示例(注意:GCC分配从不使用的空间)

  5.递归过程

(八)数组分配和访问

  1.对数据类型T和整型常数N的声明5:T  A[N];

  2.指针运算:单操作数的操作符&和*可以产生指针和间接引用指针。leal指令用来产生地址,movl用来引用存储器

  3.嵌套的数组

  4.定长数组(程序要用一个常数作为数组的维度或缓冲区大小时最好使用#define声明将这个常数与一个名字联系起来,后面使用该名字代替常数的数值)

  5.变长数组(允许数组的维度是表达式)

(九)异质的数据结构

  1.两种结合不同类型的对象来创建数据类型的机制:结构(structure)、联合(union)

  2.结构:结构的各个字段的选取是在编译时处理的,机器代码不包含关于字段声明或字段名字的信息

  3.联合:允许以多种类型来引用一个对象,是用不同的字段来引用相同的存储器块。一个联合的总的大小等于它最大字段的大小。联合还可以用来访问不同数据类型的位模式。

  4.数据对齐:某种类型对象必须是某个K值(通常是2、4或8)的倍数。这种对齐限制简化了形成处理器和存储器系统之间接口的硬件设计

(十)综合:理解指针

  1.每个指针都对应一个类型

  2.每个指针都有一个值

  3.指针用&运算符创建

  4.运算符*用于指针的间接引用

  5.数组与指针紧密联系

  6.将指针从一种类型强制转换成另一种类型,只改变它的类型而不改变它的值

  7.指针也可以指向函数

(十一)应用:使用GDB调试器

  用gdb prog启动GDB

  关于栈帧的gdb命令如下:

 二、实验过程

  实验环境中编写的源代码如下:

  执行gcc -S -o main.s main.c -m32命令后编译成汇编代码

三、遇到的问题

  对于实验中如何抽出汇编代码序列不甚了解,也不太清楚每条指令对应的相应栈帧情况,希望老师在课上能为我们讲解一下具体过程。

时间: 2024-08-10 02:11:24

《深入理解计算机系统》第五周学习笔记的相关文章

机电传动控制第五周学习笔记

1.比较感兴趣的电机 伺服电机是现在生产生活中使用较多的一种电机,小功率的应用一般选用伺服直流电机,而中大功率的应该一般选择交流伺服电机:对长期可靠性要求较高的选用无刷伺服电机,而对于成本敏感的选用伺服有刷直流电机或伺服交流感应电机,对性能要求高的选用伺服无刷直流电机或者伺服交流永磁同步电机. 而伺服电机在生产生活中应用的例子有很多,包括:各种类型的数控机床,机器人关节,喷绘机,B超监护仪等医疗仪器,跑步机划船机等运动设备以及很多很多其他领域的应用. ? 2.电器图纸的组成 目录 概略图 功能图

机电传动控制课程第一周学习笔记

机电传动课程第一周学习笔记 本周的学习内容主要是第一章绪论和第二章机电传动系统的动力学基础,结合课程学习和预习复习回顾内容如下: 1.绪论:学习了机电传动控制目的与任务.发展历程和我们该如何学习这门课程. 2.机电传动系统的动力学基础: a.运动方程式:对于单一拖动系统或者多拖动系统,在分析时一般都折算到一根轴(电动机轴)上,折算的基本原则是,折算前的多轴系统同折算后的单轴系统在能量关系上或功率关系上保持不变.而对于单 走拖动系统的运动方程式如下. b.判断TM/TL的符号:主要概括为三条:规定

机电传动控制第六周学习笔记——《机电传动控制》和其他课程的联系

机电传动控制就目前学习的情况来看电学方面的东西比较多,但是与其他非电类的课程也有很多联系. 1.电机原理的部分主要是和基础物理学里面的内容有很大关系,比如电磁感应,楞次定律等等,从基础的物理原理讲起: 2.进入控制部分以后我们见到了很多电机,建模的时候有数学建模的思想,利用自定义的参数的变化得到电机随时间的运行状况仿真,并通过探讨这些参数的敏感性牺牲不敏感参数找到整体的最优解: 3.编程的思想和C语言很类似.逻辑性和面向过程编程都很重要: 4.控制时使用的继电器-接触器控制电路与电路的分析很类似

机电传动控制第七周学习笔记——PLC

上周末体测所以忘了写每周的学习笔记(⊙﹏⊙),所以我先行卖个萌. PLC算是不可不知的一类控制方式了,现在开始正式地学习它让我感到很激动.然而老师上课给了习题做,所以错过了一些课程内容,不过学习笔记嘛,课后自学的和查阅的应该也算. 一.基本构成 1.电源部件 可编程逻辑控制器的电源在整个系统中起着十分重要的作用.因为中央处理单元等等用的都是直流电,而且还需要电源部件消除电压波动,温度变化对输出电压的影响等等,保护元件.电源内部还有备用电池防止断电时RAM信息丢失. 2.中央处理单元(CPU) 中

机电传动控制第三周学习笔记

特斯拉传记阅读 第三章高等移民中特斯拉在收入微薄,生活艰苦的条件下仍然努力地做着交流电动机的创造发明工作,在生活穷困潦倒,自己的发明创造不为人所知的情况下特斯拉仍能坚持下去,在自己的创造发明中得到巨大的精神快乐,这所要求的不仅仅是一个科研工作者丰富的想象力,大胆的创新能力,坚实的知识储备,更要求有对自己所做事业的无限的兴趣和激情,在面对挫折和困境时毫不退缩的勇气.在自己的创造发明遭受同时代发明大师爱迪生的抵制和反感时特斯拉仍然没有放弃自己将交流电系统应用于生产生活,推广向全世界的伟大梦想,在一贫

机电传动控制第五周作业

应用兴趣点:日常生活中,洗衣机的电机,如何控制噪声,还有工作电机的类型,调速和电机相关的工作状态,想深入了解工作电机.  冰箱中需要几个电机控制其正常工作,关于制冷电机的工作特性并想深入了解.  汽车中的自动调节座位功能和自动调节车窗需要的电机要多少,还有需不需要同时工作,及工作状态的变化.  水泵中用的电机也较感兴趣,它的控制原理,还有效率怎么控制,想知道有没有什么方式来提高它的工作性能如效率.  还有如光盘驱动,打印机所需的电机怎么控制高精度的加工,一些工作特性,想深入了解精度提升的方式和创

机电传动控制作业第九周作业补充

机电传动控制作业第九周作业补充: 手绘波形图: 3. 直流电机开环调压调速系统模型搭建 搭建的电路图: 仿真结果之一: 问题: 我按照上图所示的电路进行仿真时,在调节电源电压的大小和触发角时,发现很难调节到使电机转速刚好在额定转速下运行,尤其在引入电感后,更加难以调节.所以我想问下老师我这个电路图搭建的有没有问题?我需要从何处改进呢?

20165326 java第五周学习笔记

第五周学习笔记 ch7 内部类(&外嵌类) 内部类的类体不可以声明类变量和方法 内部类如同类的变量或方法 内部类和外嵌类在编译时生成两个class文件 匿名类 异常类 断言 原文地址:https://www.cnblogs.com/Czzzz/p/8688184.html

第五周学习笔记

一·感兴趣的控制电机 这周学习的控制电动机,让我想到了这段时间一直都很感兴趣的舵机. 舵机也叫伺服电机,最早用于船舶上实现其转向功能,舵机的大小由外舾装按照船级社的规范决定,选型时主要考虑扭矩大小. 在航天方面,舵机应用广泛.航天方面,导弹姿态变换的俯仰.偏航.滚转运动都是靠舵机相互配合完成的.舵机在许多工程上都有应用,不仅限于船舶.并且由于可以通过程序连续控制其转角,因而被广泛应用智能小车以实现转向以及机器人各类关节运动中. 一般工业上船用舵机分类:船用舵机目前多用电液式,即液压设备由电动设备

机电传动控制第六周作业

关于<机电传动控制>和其他课程的联系的感悟: 1.电机原理部分与之前学的<电路原理>和<大学物理>课程有较大关系,主要体现在定子电路转子电路和控制电路的分析上,电路分析的基尔霍夫定律和电磁学的电子转换麦克斯韦方程对理解和分析电机原理电路有相当大的帮助. 2.电机控制部分与<模拟电路技术>中学到的三相电的特性和星形三角形连接有一定联系. 3.PLC部分与<数控技术>和<数字电路技术>两门课程有很多联系.数电中学到的逻辑变换与逻辑电路能帮