第三章 机器的程序级表示(中)

数据传送指令:

MOV指令:将数据从源位置复制到目的位置,不做任何变化;MOV指令由四条指令组成:movb、movw、movl、movq;它们的区别在于它们操作的数据大小不同,分别为1、2、4、8字节;

压入和弹出栈数据:

遵循“后进先出”原则,通过push操作将数据压入栈中,通过pop操作删除数据;弹出的值,永远是最近被压入而且仍然在栈中的值。其中,栈顶元素的地址是所有栈中元素地址最低的。将一个四字值压入到栈中,首先要将栈指针减8,然后将值写入到新的栈顶指针。因此,指令pushq %rbp的行为等价于:

sub $8,%rsp

movq %rbp,(%rsp)

弹出一个四字的操作包括从栈顶位置读出数据,然后将栈指针加8。因此,指令popq %rax等价于下面两条指令:

movq (%rap),%rax

addq &8,%rsp

算术和逻辑运算:

下图列出了一些整数和逻辑操作。给出的每个指令类都有对这四种不同大小数据的指令。这些操作被分为四组:加载有效地址,一元操作,二元操作和移位;

加载有效地址leaq实际上是对movq指令的变形。它的指令形式是从内存读数据到寄存器,但实际上它根本就没有引用内存。

一元操作:只有一个操作数,既是源,又是目的。如,incq(%rsp)会使栈顶的8字节元素加1。

二元操作:第二个操作数既是源,又是目的。如 subq %rax,%rdx,它表示寄存器%rdx的值减去%rax中的值。

控制:jump指令可以改变一组机器代码指令的执行顺序;

条件码:

CF:进位标志;

ZF:零标志;

SF:符号标志;

OF:溢出标志;

实现条件操作的传统方法是,通过使用控制的条件转移。当条件满足时,程序沿着一条执行路径执行,而当条件不满足时,就走另一个条路径。这种机制简单通用,但是在处理器上它可能低效;

一种替代的策略实使用数据的条件转移。这种方法计算一个条件操作的两种结果,然后再根据条件是否满足从中选取一个。

循环:汇编中是没有相应的循环指令,但是可以用条件指令和跳转组合起来实现循环的效果;

如:

对应:

switch语句:执行switch语句的关键步骤是通过跳转表来访问代码位置;

图3-23则是编译switch_eg时产生的汇编代码:

过程:

过程是软件中一种很重要的抽象,过程的形式多样:函数、方法、子例程、处理函数等等;

要提供对过程的机器级支持,必须要处理许多不同的属性。假设过程P调用过程Q,Q执行后返回到P。这些动作包括下面一个或多个机制:

传递控制、传递数据、分配和释放内存;

运行时栈:先进后出的内存管理原则。

以上,过程P在调用过程Q。当Q在执行时,P以及所有在向上追溯到P的调用链中的过程,都是暂时被挂起的。当Q运行时,它只需要为局部变量分配新的存储空间,或者设置到另一个过程的调用。另一方面,当Q返回时,任何它所分配的局部存储空间都可以被释放。因此,程序可以用栈来管理它的过程所需要的存储空间,栈和程序寄存器存放着传递控制的数据、分配内存所需要的信息。当P调用Q时,控制和数据信息添加到栈尾。

原文地址:https://www.cnblogs.com/sunnyDream/p/9942991.html

时间: 2024-10-10 18:24:11

第三章 机器的程序级表示(中)的相关文章

第三章 pod:运行于kubernetes中的容器

本章内容涵盖 创建. 启动和停止 pod 使用标签组织 pod 和其他资源 使用特定标签对所有 pod 执行操作 使用命名空间将多个 pod 分到不重叠的组中 调度 pod 到指定类型的工作节点 上一章 已经大致介绍了在 Kubemetes 中创建的基本组件,包括它们的基本功 能概述. 那么接下来我们将更加详细地介绍所有类型的 Kubemetes 对象(或资源), 以便你理解在何时. 如何及为何要使用每一个对象. 其中 pod 是 Kubemetes 中最为 重要的核心概念,而其他对象仅仅是在管

深入计算机原理——第三章机器级的表示(二)

栈有两个常用指令: push:把数据压入栈中 pop:删除数据 这两个指令都只有一个操作数 条件码 除了整数寄存器,CPU还维护着一组单个位的条件码寄存器,它们描述了最近的算术或逻辑操作的属性.可以检测这些寄存器来执行条件分支指令: 常用条件码有以下几种: CF:进位标志.最近的操作使最高位产生了进位.可用来检查无符号操作的溢出. ZF:零标志.最近的操作得到的结果为0. SF:符号标志.最近的操作得到的结果为负数. OF:溢出标志.最近的操作导致一个补码溢出--正溢出或负溢出. 原文地址:ht

第三章 数据决定程序结构

本章主要讲解一个合适的数据结构对一个程序的重要性.一个好的数据类型能够节省开发时间也能够节省内存的消耗. 文末总结一下四点: 1.使用数组重新编写重复代码.在现在的变成中主要用到的是list.map之类的数据结构来代替数组. 2.封装复杂结构.抽象bean. 3.尽可能使用高级工具.超文本.名字-值对.电子表格.数据库.编程语言等都是特定问题领域中的强大的工具.由于本书出版的年份较早,这里提到的基本都是日常开发需要用到的.比较新的工具redis在现在工程中刚接触到.也是基于键-值对的形式存储数据

第三章 创建应用程序和activity

Android应用程序的组成部分 1.activity 应用程序的表示层,activity使用fragment和视图来布局和显示信息,以及响应用户动作. 2.service 应用程序中不可见的工作者 3.content provider 一个可共享的持久数据存储器 4.intent 一个强大的应用程序间的消息传递机制 5.Broadcast receiver intent的监听器 6.widget 通常添加到设备主屏幕的可视化应用程序组件,用户可以把这些组件添加到他们的主屏幕上 7.notifi

第三章:流程控制语句

第三章:流程控制语句 程序结构 顺序结构 分支结构 if结构if....else结构if...else if....else if...else结构switch结构 循环结构 while循环do....while循环for循环 分支结构 if结构 if结构语法: if(布尔表达式){ //语句;} 执行过程:如果布尔表达式为true执行其下语句,布尔表达式为false时不执行其下语句.{}可以省略,如果省略将执行第一个语句块.为了程序的可读性推荐不要省略{} if...else结构 语法:if(

20165233 Java第二、三章学习总结

2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 第二.三章 ch2 标识符与关键字 基本数据类型: 逻辑类型:boolean 整数类型:int.byte.short.long(注意:long型常量用后缀L来表示:且Java中没有无符号声明) 字符类型:char 浮点类型:float.double(float常量后面必须有后缀f或F ) 类型转换运算 输入.输出数据 数组 ch3 运算符与表达式 if条件分支语句 switch开关语句 循环语句(包括for语句.wh

Pytho核心编程笔记——第三章

第三章 Python基础 1.在Python中,赋值并不是直接将值赋给一个变量,对象是通过引用传递的,赋值时,是将该对象的引用(不是值)赋值给变量: i = 3,当值为3的对象创建后,会将该对象的引用赋值给变量 2.Python的赋值语句并不会返回值,所以a = (x = x +1)在Python中会报错 3.多元赋值时,等号两边的对象都是元组: a,b,c = 1,"str",23 4.Python 不支持重载 原文地址:https://www.cnblogs.com/hhj-stu

第三章程序的机器级表示 学习报告

第三章 程序的机器级表示 3.1 历史观点 Intel处理器系列俗称x86,开始时是第一代单芯片.16位微处理器之一. 每个后继处理器的设计都是后向兼容的——较早版本上编译的代码可以在较新的处理器上运行. X86 寻址方式经历三代: 1  DOS时代的平坦模式,不区分用户空间和内核空间,很不安全 2  8086的分段模式 3  IA32的带保护模式的平坦模式 3.2 程序编码 gcc -01 -o p p1.c -01 表示使用第一级优化.优化的级别与编译时间和最终产生代码的形式都有关系,一般认

第三章—Windows程序

这一章我都不知道该如何写了,呵呵~~ 毕竟,Win32是一个非常深奥的系统,目前还容不得我这种 小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以,我也犯不着怕被人背后指着骂 本章的名字就叫<Windows程序>而不是<Windows程序设计>所以,我只是讲一些关于Windows程序运作的原理: Windows 为什么叫Windows,相信所有用过的朋友都可以明白,那桌面上一个一个的窗口,就是它名字的由来.也就是这一个又一个窗口