【操作系统教程】第3章 程序的机器级表示Ⅱ:控制 2017.09.20

合集下载

操作系统课件 第2章进程的描述与控制0920

操作系统课件  第2章进程的描述与控制0920

J.1 作业的基本概念
对于被调度 的作业,
源程序
子程序 库函数
动态
库函 数
输入数据
OS要对它
在系统中整
编译
目标 程序
装配
目标 程序
运行
运行结果
个运行过程

实行控制。
编译 程序
输出信息
装配 程序
输出信息
运行 程序
输出信息
结束
图J-1 作业的控制过程
J.1 作业的基本概念
J.1.2 作业的分类(批处理作业,交互式作业)
• 其主要任务是按照某种策略和方法选取一个处于 就绪状态的进程占用处理机。
• 在确立了占用处理机之后,系统必须进行进程上 下文切换以建立与占用处理机进程相适应的执行 环境。
J.3 作业调度算法
中级调度(内外存交换调度)
• 其主要任务是按照给定的原则和策略,将处于外 存交换区中的就绪状态或等待状态或内存等待状 态的进程交换到外存交换区。
能忍受响应时间
注意系统资源平衡使用: 应将计算量大作业和输入输出繁忙作业搭配起来。
应保证提交作业在规定截止时间内完成,且应设法缩短作业
的平均周转时间。
考虑越多会使系统实现越复杂,反而增加系统开销,大多 数系统都采用相对简单的调度算法。
J.3 调度算法
• 交换调度主要涉及到内存管理与扩充。 • 因此,在有些书本中也把它归入内存管理部分。
J.3 作业调度算法
J.3.1 作业调度算法的设计目标与设计因素
作业调度的目标 单位时间内运行尽可能多的作业:
可以考虑选择尽可能短的作业先运行。长作业如何呢?
使处理机保持“忙”: 可以考虑选择计算量大的作业先运行,IO设备如何呢?。

【操作系统教程】HITCS-第3章 程序的机器级表示Ⅰ:基础-part02

【操作系统教程】HITCS-第3章 程序的机器级表示Ⅰ:基础-part02
▪ 存储最近的算术或逻辑运算的状态信息 ▪ 用于条件分支
▪ 内存(Memory)
▪ 可按字节寻址的数组 ▪ 程序和数据 ▪ 栈(Stack,用于过程的实现)
6
将 C 变为目标代码(Object Code)
▪ 程序文件: p1.c p2.c ▪ 编译命令: gcc –Og p1.c p2.c -o p
变量(Variable)
▪ 可定义并使用不同的数据类型
运算(Operation)
▪ 赋值、算术表达式计算
控制
▪ 循环 ▪ 过程(函数)的调用/返回
9
代码例子
//C code int accum = 0; int sum(int x, int y) { int t = x+y; accum += t; return t; }
%al %cl %dl %bl
来源 (大多过时)
accumulate
counter data
base
Source index Destination index Stack pointer
Base pointer
16-位虚拟寄存器 (向后兼容)
23
AT&T汇编格式
操作数类型和表示
▪ 立即数(Immediate):整型常数,以$开头
操作数类型(三大类)
▪ 立即数(Immediate):整型常数 ▪ 寄存器(Register) : 16个整数寄存器之一
▪ 不能用%rsp(系统保留)
▪ 其他特殊指令专用寄存器
▪ 内存(Memory): 多种寻址模式
%rdx %rsi %rdi %rsp %rbp
movb $1, %al
%rN
movw $1, %ax

操作系统课件 第3章(最新最完整的课件)

操作系统课件  第3章(最新最完整的课件)

事件2出现 … 事件n出现 … …
等待事件2
… 等待事件n
注意:该模型与上一模型的主要区别在于如下两个方面 就绪队列的形式;设臵多个阻塞队列
3. 同时具有三级调度的调度队列模型
作业调度 批量作业 后备队列 交互型作业 时间片完 就绪队列 Readya队列 进程调度 挂起 事件出现 进程完成 CPU
3.3 调度算法 3.3.1 先来先服务和短作业(进程)优先调度算法 1. 先来先服务调度算法(FCFS) 2. 短作业(进程)优先调度算法(SJF或SPF)
1. 先来先服务调度算法(FCFS) 先来先服务(FCFS)调度算法是一种最简单的调 度算法,该算法既可用于作业调度,也可用于进程 调度。 当在作业调度中采用该算法时,每次调度都是 从后备作业队列中选择一个或多个最先进入该队列 的作业,将它们调入内存,为它们分配资源、创建 进程,然后放入就绪队列。 在进程调度中采用FCFS算法时,则每次调度 是从就绪队列中选择一个最先进入该队列的进程, 为之分配处理机,使之投入运行。该进程一直运行 到完成或发生某事件而阻塞后才放弃处理机。
3.3 调度算法 3.3.2 高优先权优先调度算法
1. 优先权调度算法的类型
1) 非抢占式优先权算法 一旦分配,直至完成或阻塞才可重新分配 CPU使用权。 2) 抢占式优先权调度算法 更高优先权的进程可以抢占当前进程的CPU使 用权。
3.3 调度算法 3.3.2 高优先权优先调度算法 2. 优先权的类型 1) 静态优先权 静态优先权是在创建进程时确定的,且在进 程的整个运行期间保持不变。 确定进程优先权的依据有如下三个方面: (1) 进程类型。 (2) 进程对资源的需求。 (3) 用户要求。
第三章 处理机调度与死锁
3.1 处理机调度的层次

操作系统课件第三章

操作系统课件第三章
处理机调度与死锁

进程名 到达时 服务时 开始执 完成时 周转时 带权周


行时间 间

转时间
A
0
1
0
1
1
1
B
1
100 1
101 100 1
C
2
1
101 102 100 100
C
3
100 102 202 199 1.99
处理机调度与死锁
FCFS SJF
图3.4FCFS和SJF比较
进程名 到达时间 服务时间 完成时间 周转时间 带权周转时间 完成时间 周转时间 带权周转时间
1、先来先服务调度算法 2、时间片轮转调度算法(时间片为1ms) 3、非剥夺式SJF调度算法 4、剥夺式优先级调度算法
处理机调度与死锁
表1
进程
创建时间
运Hale Waihona Puke 时间(ms)优先级P1
0
3
3
P2
2
6
5
P3
4
4
1
P4
6
5
2
P5
8
2
4
解: (1) FCFS调度算法,进程的运行过程如图所示:
处理机调度与死锁
(2) 时间片轮转调度算法,进程的运行情况如图所示:
❖3.截止时间的保证(特别于实时系统) ❖4.优先权准则:(即需要抢占调度)
处理机调度与死锁
3.1.3选择调度方式和算法的若干准则
❖ 二、面向系统的准则
❖1.吞吐量高(特别于批处理):单位时间完成作 业数
❖2.处理机利用率好:(因CPU贵,特别于大中型 多用户系统)
❖3.各类资源的平衡利用。(?折算标准)

操作系统教程_孙钟秀(第四版)课后习题答案

操作系统教程_孙钟秀(第四版)课后习题答案

首页入门学习程序员计算机考研计算机电子书下载硬件知识网络知识专业课程答案下载视频教程下载第一章作者:佚名来源:网络1、有一台计算机,具有IMB 内存,操作系统占用200KB ,每个用户进程各占200KB 。

如果用户进程等待I/O 的时间为80 % ,若增加1MB 内存,则CPU 的利用率提高多少答:设每个进程等待I/O 的百分比为P ,则n 个进程同时等待刀O 的概率是Pn ,当n 个进程同时等待I/O 期间CPU 是空闲的,故CPU 的利用率为1-Pn。

由题意可知,除去操作系统,内存还能容纳4 个用户进程,由于每个用户进程等待I/O的时间为80 % , 故:CPU利用率=l-(80%)4 =若再增加1MB 内存,系统中可同时运行9 个用户进程,此时:cPu 利用率=l-(1-80%)9 =故增加IMB 内存使CPU 的利用率提高了47 % :87 %/59 %=147 %147 %-100 % = 47 %2 一个计算机系统,有一台输入机和一台打印机,现有两道程序投入运行,且程序A 先开始做,程序B 后开始运行。

程序A 的运行轨迹为:计算50ms 、打印100ms 、再计算50ms 、打印100ms ,结束。

程序B 的运行轨迹为:计算50ms 、输入80ms 、再计算100ms ,结束。

试说明(1 )两道程序运行时,CPU有无空闲等待若有,在哪段时间内等待为什么会等待( 2 )程序A 、B 有无等待CPU 的情况若有,指出发生等待的时刻。

答:画出两道程序并发执行图如下:(1)两道程序运行期间,CPU存在空闲等待,时间为100 至150ms 之间(见图中有色部分)(2)程序A 无等待现象,但程序B 有等待。

程序B 有等待时间段为180rns 至200ms 间(见图中有色部分)3 设有三道程序,按A 、B 、C优先次序运行,其内部计算和UO操作时间由图给出。

试画出按多道运行的时间关系图(忽略调度执行时间)。

操作系统教程3

操作系统教程3

操作系统教程3操作系统是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石。

在这篇教程中,我们将深入探讨操作系统的一些重要概念和功能。

首先,让我们来了解一下操作系统的任务管理。

当我们同时运行多个程序时,操作系统需要合理地分配计算机的资源,如 CPU 时间、内存空间等,以确保每个程序都能顺利运行。

这就涉及到进程和线程的概念。

进程可以理解为正在运行的程序的实例,而线程则是进程中的执行单元。

操作系统通过调度算法来决定哪个进程或线程在什么时候获得 CPU 的使用权,常见的调度算法有先来先服务、短作业优先、时间片轮转等。

内存管理是操作系统的另一个关键功能。

计算机的内存是有限的,而操作系统需要确保各个程序能够有效地使用内存,并且不会相互干扰。

为此,操作系统采用了虚拟内存技术,将硬盘空间作为内存的扩展。

当物理内存不足时,操作系统会将暂时不用的数据转移到硬盘上的虚拟内存中,为正在运行的程序腾出空间。

同时,内存分配算法如首次适应、最佳适应和最坏适应等,用于为新的程序或数据分配内存空间。

文件系统也是操作系统不可或缺的一部分。

文件系统负责管理计算机中的文件和目录,使得用户能够方便地存储、检索和操作文件。

它包括文件的组织方式,如连续分配、链式分配和索引分配等,以及文件的访问控制,确保只有授权的用户能够访问特定的文件。

文件系统还提供了文件的备份和恢复机制,以防止数据丢失。

设备管理是操作系统与硬件设备交互的桥梁。

无论是输入设备(如键盘、鼠标)还是输出设备(如显示器、打印机),操作系统都需要对其进行有效的管理。

设备驱动程序是实现这一管理的关键,它们将操作系统的通用指令转换为特定设备能够理解的控制信号。

操作系统还通过缓冲区来协调设备与 CPU 的速度差异,提高数据传输的效率。

操作系统的安全性也是至关重要的。

它需要防止未经授权的访问、恶意软件的攻击以及用户的误操作。

用户认证和授权机制用于确定用户的身份和其对系统资源的访问权限。

操作系统教程第3章复习

操作系统教程第3章复习

第三章 处理机调度与死锁
★ 产生死锁的四个必要条件: 产生死锁的四个必要条件: 互斥条件、不剥夺条件(不可抢占)、部分分配、循环等待。 ★ 进程的死锁问题可以用有向图更加准确而形象地描述,这种 进程的死锁问题可以用有向图更加准确而形象地描述, 有向图称为资源分配图。 有向图称为资源分配图。 ★ 解决死锁的方法一般可分为预防、避免、检测与解除等三种 。 解决死锁的方法一般可分为预防、避免、检测与解除等三种。 (1) 死锁的预防 : 预先确定一些资源分配策略,进程按规定申请 死锁的预防: 预先确定一些资源分配策略, 资源,系统按预定的策略进行分配, 资源,系统按预定的策略进行分配,这些功能策略均能使死锁的 4个必要条件中的一个条件不成立,从而使系统不发生死锁; 个必要条件中的一个条件不成立,从而使系统不发生死锁;
第三章 处理机调度与死锁
(2)死锁的避免: 当进程提出资源申请时系统动态测 死锁的避免: 试资源分配情况, 试资源分配情况 , 仅当能确保系统安全时才把资源 分配给进程, 银行家算法虽然很保守 , 分配给进程 , 银行家算法 虽然很保守, 但它可保证 系统时时刻刻都处于安全状态; 系统时时刻刻都处于安全状态; (3)死锁的检测与解除: 多资源的申请和分配不加限 死锁的检测与解除: 制 , 只要有剩余的资源就可把资源分配给申请者 , 只要有剩余的资源就可把资源分配给申请者, 这样就可能出现死锁, 于是, 这样就可能出现死锁 , 于是 , 系统要定时运行一个 “ 死锁检测程序 ” , 检测时没有发现死锁则系统可 死锁检测程序” 继续工作, 继续工作 , 检测时发现有死锁则必须先解除死锁再 继续工作。 继续工作。
第三章 处理机调度与死锁 ★ 所谓一个作业,就是:用户在一次上机算题过程中或一次事 所谓一个作业,就是:用户在一次上机算题过程中或一次事 物处理过程中,要求计算机系统所做工作的总称。 ★ 一个作业一般可分成若干个作业步。在批处理系统中,把一 一个作业一般可分成若干个作业步。在批处理系统中,把一 批作业安排在输入设备上,然后依次读入系统进行处理,从而 形成了作业流。 形成了作业流。 ★ 作业由三部分组成,即:程序、数据、作业说明书。操作系 作业由三部分组成,即:程序、数据、作业说明书。操作系 统根据作业说明书生成一个称为作业控制块JCB的表格,系统为 统根据作业说明书生成一个称为作业控制块JCB的表格,系统为 每一个作业建立一个JCB,JCB是作业在系统中存在的标志。 每一个作业建立一个JCB,JCB是作业在系统中存在的标志。

操作系统课件第3章

操作系统课件第3章

操作系统课件第3章第三章处理调机与度锁死第三章理处调机与死锁度3.1处理机调度层的次3.2调度列队型模调和准则度.33调算度法3.实时调度34.5产生死锁的因和必原条要件36预.防死的方法3锁7.死锁检测与的解除第三处理机调度与死锁章3.处1理调度机层的次不同作业系的统,常通需要经不历的处同机理度调,作才能获业处理机得而执。

批量型行作:业需后经先历业作调度高(调级)度进程、调(低级度度)调才能,得处理机获。

终端作型业只:经过进程调需。

在度完较的操善系统作,往中还设置往了级调度中。

第章三处机调度与死理锁.1处理3机度的层次3调..1高1调级度.1作业作业和步(1)业作Job)(。

业是一作个比序程为广泛更概念,的它不仅包了含通的常程和数序,而据还且应配一有份作说业书,明统系据根说明该书来程对序运行的进控制行在。

处批理统系,是中以业为作基本位从外单存入调存的内。

第三章理处机调与度锁死第章三理处机调度与锁2死.作业控块制JB(JobCoCnrotlBlok)c为管了理调和作度,在业多道批理系处统为中每作个业设了一置个作业控块,制同进程如控制是进块在系统中程存在的志一标样,是作业它系在中存在的标统,其中保志了存系对作统进业管理和行调度需的所全信部息在。

JCB所中含包的内因系容统而异,通应常包的内容含有作业标:、识用名称户、用户帐户作、业类(型CPU繁忙型I/O、繁忙、批量型型终、端)型、作状态、调度业信息优先(级、作已运业时行间)、资源需求预(计行时间、要求运内存小、要大求/OI备设的型类和量等)、进数入系统时间、开处始理时间作、完成业时、间业作出时退、资源间使情况用等。

三章第理处调机度与死锁每当作进业系统入,系时统便为个每业建立一作J个C,B根据作业型类将插入相它应的后队备列。

作中调业度程依据一序定的度算法来调度它们,被调度到调的作业将装入会内。

在存业运作行期间系统,按照JC就B的中信对息业作进行制控当一。

第三章 程序的机器级表示

第三章 程序的机器级表示

第三章程序的机器级表示一、教材导读本章学习内容是汇编语言,现在直接写汇编的机会不多了,但一定要能读懂,信息安全的核心思维方式“逆向”在这有很好很直接的体现,反汇编就是直接的逆向工程。

本章重点是3.7,但没有3.1-3.6的基础也是不行,如果想真正的提高动手能力,3.11如何用GDB调试汇编要好好练习一下,不过大多GDB 技巧大家都会了。

3.1-3.7中练习,重点:3.1,3.3,3.5,3.6,3.9,3.14,3.15,3.16,3.22,3.23,3.27,3.29,3.30,3.33,3.34p104, p105: X86 寻址方式经历三代:1 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全2 8086的分段模式3 IA32的带保护模式的平坦模式p106: ISA的定义,ISA需要大家能总结规律,举一反三,比如能对比学习ARM的ISA;PC寄存器要好好理解;p107:gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧,应该理解、熟记。

注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.cMAC OS中没有objdump, 有个基本等价的命令otoolUbuntu中 gcc -S code.c (不带-O1)产生的代码更接近教材中代码(删除"."开头的语句)p108: 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。

有些输出内容过多,我们可以使用more或less命令结合管道查看,也可以使用输出重定向来查看od code.o | moreod code.o > code.txtp109: gcc -S 产生的汇编中可以把以”.“开始的语句都删除了再阅读p110: 了解Linux和Windows的汇编格式有点区别:ATT格式和Intel 格式p111: 表中不同数据的汇编代码后缀p112: 这几个寄存器要深入理解,知道它们的用处。

【操作系统教程】HITCS-第3章 程序的机器级表示Ⅰ:基础-part01

【操作系统教程】HITCS-第3章 程序的机器级表示Ⅰ:基础-part01
程序的机器级表示 I:基础 Machine-Level Programming
1
程序的机器级表示 I : 基础
Intel CPU及架构的发展史 IA32处理器体系结构 汇编语言 Linux汇编程序
2
Intel x86 处理器
笔记本、台机、服务器市场的统治者 进化设计
▪ 向后兼容,直至1978年推出的8086CPU ▪ 与时俱进:不断引入新特征
38
段值的确定
一个执行文件.exe在双击执行时,首先由操作 系统分析本程序的段占用情况:包括多少段、 各段长度、代码段第一条指令的偏移
2001: Intel激进地尝试从IA32跨到IA64
▪ 采用完全不同的架构(Itanium) ▪ 仅将运行IA32程序作为一种遗产 ▪ 性能令人失望
2003: AMD采用了进化的解决方案
▪ x86-64 (现在称为 “AMD64”)
Intel 被动聚焦于IA64
▪ 难以承认错误或承认AMD更好
386
1985
275K
16-33
▪ 第一个32位intel处理器, 称为IA32
▪ 增加 “平坦寻址”(flat addressing),可运行Unix
Pentium 4E 2004
125M
2800-3800
▪ 第一个64位Intel x86处理器,称为 x86-64,超线程(hyperthreading)
复杂指令集计算机(Complex instruction set computer,CISC)
▪ 指令多、指令格式多
▪ Linux程序设计只用到其中较小的子集
▪ 性能难与精简指令计算机(Reduced Instruction Set
Computers,RISC)相比

操作系统教程第3章

操作系统教程第3章

对用户而言,总希望自己作业的周转时间尽可能 的少,最好周转时间就等于作业的执行时间。然而对 系统来说,则希望作业的平均周转时间尽可能少,有 利于提高CPU 的利用率和系统的吞吐量。为此,每
个系统在选择作业调度算法时,既应考虑用户的要求,
又能确保系统具有较高的效率。在每次执行作业调度 时,都须做出以下两个决定。
表3.4 最短进程优先调度算法 单位:h(以十进制计)
进 程 1 2 3 4 提交时 运行时 开始时 完成时 周转时 带权周转 间 间 刻 间 间 时间 8.00 8.50 9.00 9.50 2.00 0.50 0.10 0.20 8.00 10.00 2.00 2.30 1.10 0.80 1.00 4.60 11.00 4.00
5.进程调度性能衡量的指标
• 周转时间 • 响应时间
• CPU-I/O执行期
6.进程调度模型
1)只有进程调度的调度队列模型
图 3 - 1 仅具有进程调度的调度队列模型
2)具有高低级调度的调度队列模型
图 3-2 具有高、低两级调度的调度队列模型
3)具有三级调度的调度队列模型
图 3-3 具有三级调度时的调度队列模型
7.选择进程调度方式的准则
• 面向用户的准则:周转时间短;响 应时间快;截止时间的保证;优先 权准则 • 面向系统的准则:系统吞吐量高;
处理机利用率好;各类资源的平衡
利用
3.2 进程调度算法
• 先进先出(FIFO)算法 • 最短CPU运行期优先调度算法源自• 最高优先权优先调度算法
• 轮转法
• 多级反馈队列
这样,进程的平均周转时间T为 T=ΣTi/n 其中,n为进入系统的进程个数。 令Tri为进程i的实际运行时间,则进程i的带权周转时 间Wi定义为: Wi=Ti/Tri 这样进程平均带权周转时间W为 W=ΣWi /n 对用户来说,总是希望他的进程周转时间越短越好, 而对系统来说,应选择那些使进程的平均周转时间 (或平均带权周转时间)短的某种算法。平均周转 时间越短,说明进程在系统内停留的时间越短,系 统资源的利用率也就越高。

计算机系统复习笔记-第3章 程序的机器级表示

计算机系统复习笔记-第3章 程序的机器级表示

第3章程序的机器级表示3.1 序言历史观点➢机器代码:用字节序列编码低级的操作,包括处理数据、管理内存、读写存储设备上的数据,以及利用网络通信。

➢汇编代码:GCC C语言编译器...以汇编代码的形式产生输出,汇编代码是机器代码的文本表示,给出程序中的每一条指令。

GCC调用汇编器...,根据汇编代码生成可执行的机器代码。

...和链接器注:①用高级语言编写的程序可以在很多不同的机器上编译和执行,而汇编代码则是与特定机器密切相关的②汇编代码的两种格式:AT&T、Intel生成Intel格式的代码的命令:1inux> gcc -Og -S -masm=intel mstore.c➢IA32:Intel 32位体系结构(Intel Architecture32),Intel在1985年提出➢x86-64:即Intel64,IA32的64位拓展➢后向兼容:较早版本上编译的代码可以在较新的处理器上运行➢摩尔定律(Moore’s Law):1965年,Gordon Moore,Intel公司的创始人,根据当时的芯片技术做出的预测。

在未来10年,芯片上的晶体管数量每年都会翻一番。

事实是,在超过50年中,半导体工业一直能够使得晶体管数目每18个月翻一倍3.2 程序编码➢假设一个C程序,有两个文件p1.c和p2.c,我们用Linux命令将源代码转化成可执行代码linux> gcc -Og -o p p1.c p2.c注:-Og表示优化等级。

为了提高程序的性能,可以选择较高级别的优化(例如,-O1或-O2)✧gcc命令调用了一整套的程序,将源代码转化成可执行代码:①C预处理器(C preprocessor,cpp)扩展源代码,插人所有用#include命令指定的文件,并扩展所有用#define声明指定的宏②编译器(compiler)产生两个源文件的汇编代码,名字分别为p1.s和p2.s③汇编器(assembler)将汇编代码(.s)转化成二进制目标代码文件(.o)p1.o和p2.o 。

计算机系统课件-第3章 程序的机器级表示Ⅰ:基础-part01-s (2)

计算机系统课件-第3章 程序的机器级表示Ⅰ:基础-part01-s (2)
3
CPU的功能结构与程序执行
8086/8内部有两个功能模块,完成 一条指令的取指和执行功能
❖模块之一:总线接口单元BIU,主要 负责读取指令和操作数
❖模块之二:执行单元EU ,主要负责 指令译码和执行
4
8086的寄存器组
对汇编语言程序员来说,8086内部 结构就是可编程的寄存器组
❖ 执行单元EU 8个通用寄存器 ❖ 1个指令指针寄存器 ❖ 1个标志寄存器 ❖ 4个段寄存器/64位增加了fs/gs也16位
29
3. 段寄存器
8086有4个16位段寄存器
▪ CS(代码段)指明代码段的起始地址 ▪ SS(堆栈段)指明堆栈段的起始地址 ▪ DS(数据段)指明数据段的起始地址 ▪ ES(附加段)指明附加段的起始地址
每个段寄存器用来确定一个逻辑段的起始 地址,每种逻辑段均有各自的用途
32/64位CPU采用段选择子—数组下标/段 描述符表—数组(含段地址、范围、权限 等)的形式来确定段地址。
址 SP和BP寄存器与SS段寄存器联合使用以确定堆栈段
中的存储单元地址
10
指令指针IP
指令指针寄存器IP,指示代码段中指令 的偏移地址
它与代码段寄存器CS联用,确定下一 条指令的物理地址
计算机通过CS : IP寄存器来控制指令序 列的执行流程
IP寄存器是一个专用寄存器
12
2. 标志寄存器
2
8086/8088CPU引脚信号与工作模式
GND AD14 AD13 AD12 AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 NMI INTR CLK GND
1
40
2
39
3
38

第三章程序的转换与机器级表示 ppt课件

第三章程序的转换与机器级表示 ppt课件
属于机器级指令
SKIP
6
回顾:Hardware/Software Interface
temp = v[k]; v[k] = v[k+1]; v[k+1] = temp;
BACK
汇编指令

lw $15, 0($2)
伪指令

lw $16, 4($2) sw $16, 0($2)
swap 0($2),4($2)
• 数据的对齐
– 第五讲:越界访问和缓冲区溢出
15
IA-32/x64指令系统概述
• x86是Intel开发的一类处理器体系结构的泛称
– 包括 Intel 8086、80286、i386和i486等,因此其架构被 称为“x86”
– 由于数字并不能作为注册商标,因此,后来使用了可注册的 名称,如Pentium、PentiumPro、Core 2、Core i7等
第三章 程序的转换与机器级表示
程序转换概述 IA-32 /x86-64指令系统 C语言程序的机器级表示 复杂数据类型的分配和访问 越界访问和缓冲区溢出、x86-64架构
程序的转换与机器级表示
• 主要教学目标 – 了解高级语言与汇编语言、汇编语言与机器语言之间的关系 – 掌握有关指令格式、操作数类型、寻址方式、操作类型等内容 – 了解高级语言源程序中的语句与机器级代码之间的对应关系

… , EXTop=1,ALUSelA=1,ALUSelB=11,ALUop=add,

IorD=1,Read,MemtoReg=1,RegWr=1,......
微指令
… 1 1 11 100 1 0 1 1 …
7
机器级指令
• 机器指令和汇编指令一一对应,都是机器级指令
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2 3: eb 03 3 5: 48 d1 f8 4 8: 48 85 c0 5 b: 7f f8 6 d: f3 c3
jmp 8 <loop+0x8> sar %rax test %rax,%rax. jg 5 <loop+0x5> repz retq
6 testq %rax, %rax
链接后的程序反汇编
寄存器 用途 %rdi 参数x
cmpq %rsi, %rdi # Compare x:y setg %al # Set when >
%rsi %rax
参数y 返回值
movzbl %al, %eax # Zero rest of %rax
ret
9
主要内容
流程控制:条件码(状态标志位) 条件分支 循环结构的实现 Switch语句
作用
设置条件
ZF
相等 / 结果为0
~ZF
不相等 / 结果不为0
SF
结果为负数
~SF
结果为非负数
SF^OF
小于 (符号数)
(SF^OF)|ZF 小于等于 (符号数)
~(SF^OF)&~ZF 大于 (符号数)
~(SF^OF)
大于等于 (符号数)
~CF&~ZF
大于 (无符号数)
~CF
大于等于 (无符号数)
▪ 执行合适的代码段
15
条件传送指令
条件传送指令
▪ 指令支持的操作:
if (Test) Dest Src
▪ 1995年之后的 x86处理器支
持条件传送
▪ GCC 尽量使用它们
▪ 条件:以安全为前提
Why?
▪ 分支对管道中的指令流非常
有害
▪ 条件传送不需要控制转移
C代码
val = Test ? Then_Expr
movq %rsi, %rdx
subq %rdi, %rdx # eval = y-x
cmpq %rsi, %rdi # x:y
cmovle %rdx, %rax # if <=, result = eval
ret
17
条件传送的不良案例
计算代价大
val = Test(x) ? Hard1(x) : Hard2(x);
rep; ret
21
“Do-While”的通常实现方法
C代码
do
Body while (Test);
Body:
{ 语句1; 语句2; … 语句n;
}
goto版本
loop:
Body if (Test)
goto loop
22
“While” 的实现#1
“跳到中间”翻译法 使用选项 -Og
While版本
: Else_Expr;
不使用goto的版 r本esult = Then_Expr; eval = Else_Expr; nt = !Test; if (nt) result = eval; return result;
16
条件传送——例子
long absdiff (long x, long y)
寄存器 用途
{ long result; if (x > y) result = x-y;
%rdi %rsi %rax
参数x 参数y 返回值
else
result = y-x; absdiff:
return result; movq %rdi, %rax # x
}
subq %rsi, %rax # result = x-y
7 jg .L3
1 4004d0: 48 89 f8 mov %rdi,%rax
8 rep; ret
2 4004d3: eb 03 jmp 4004d8 <loop+0x8>
3 4004d5: 48 dl f8 sar %rax
关键:RIP/EIP的 含义?
4 4004d8: 48 85 c0 test %rax, %rax
while (Test) Body
goto版本
goto test; loop:
(a>0 && b>0 && t<0) || (a<0 && b<0 && t>=0)
指令leaq不设置条件码
4
条件码(隐含赋值: Compare指令)
Compare指令对条件码的隐含赋值
▪cmpq Src1, Src2
cmpq Src1, Src2 计算Src2 - Src1 但不改变目的操作数,仅用 结果设置条件码
5 4004db: 7f f8
jg 4004d5 <loop+0x5>
6 4004dd: f3 c3
repz retq
12
条件分支(旧风格)
生成
shark> gcc –Og -S –fno-if-conversion control.c
long absdiff (long x, long y)
{ long result; if (x > y) result = x-y; else result = y-x; return result;
▪ 根据条件码组合将目的操作数的低位字节设置为0或1 ▪ 不改变其余7字节
6
条件码
指令 sete setne sets setns setl setle setg setge seta setae setb setbe
同义词 Setz setnz
setnge setng setnle setnl setnbe setnb setnae setna
8
读取条件码(续…)
setX的数值
可寻址的单字节寄存器
▪ 不改变寄存器其他字节的数值
▪ 常用指令 movzbl将单字节值零扩展至整个8字节寄存器
▪ 或者用32位指令将寄存器高位置0
int gt (long x, long y) { return x > y; }
▪ 当前程序控制点位置
( %rip, … )
▪ 条件码
当前栈顶
%rbx %rcx %rdx %rsi %rdi %rsp
▪ 状态标志位
%rbp
▪ 最近测试的状态 ( CF, ZF, SF, OF )
%rip
%r8 %r9 %r10 %r11 %r12 %r13 %r14 %r15
指令指针
CF ZF SF OF 条件码
小于 (符号数)
jle
(SF^OF)|ZF
小于等于 (符号数)
ja
~CF&~ZF
大于 (无符号数)
jb
CF
小于 (无符号数)
11
跳转
.o文件的反汇编
跳转指令的编码 1 0: 48 89 f8 mov %rdi,%rax
1 movq %rdi, %rax 2 jmp .L2 3 .L3: 4 sarq %rax 5 .L2:
条件码
Test指令对条件码的隐含赋值
▪testq Src2, Src1
▪根据Src1 & Src2的数值,设置条件码 ▪常用:一个操作数看做是一个掩码
▪ testq b,a
▪ 计算a&b 的结果后仅用于设置条件码,并不保存 ▪ZF=1 如 a&b == 0 ▪SF=1 如 a&b < 0
读取条件码:setX 指令
cmpq b, a
▪ CF=1 如果最高有效位有进位(无符号数比较) ▪ ZF=1 如 a== b ▪ SF=1 如 (a-b) < 0 (结果看做有符号数) ▪ OF=1 如补码 (有符号数)溢出
(a>0 && b<0 && (a-b)<0) || (a<0 && b>0 && (a-b)>0)
5
long result; int ntest = x <= y; if (ntest) goto Else; result = x-y; goto Done; Else: result = y-x; Done: return result; }
14
用分支翻译一般条件表达式
C 代码 val = Test ? Then_Expr : Else_Expr;
movl $0, %eax # result = 0
.L2:
# loop:
movq %rdi, %rdx
andl $1, %edx # t = x & 0x1
addq %rdx, %rax # result += t
shrq %rdi
# x >>= 1
jne .L2
# if (x) goto loop
程序的机器级表示Ⅱ: 控制
1
主要内容
流程控制:条件码(状态标志位) 条件分支 循环结构的实现 Switch语句 Chap 3.2, 3.3
2
处理器状态(x86-64, 一部分)
当前程序的运行状态信息
▪ 临时数据
Registers
( %rax, … )
%rax
▪ 运行时栈的位置
( %rsp )
两个数值均被计算 只有计算非常简单时才有意义。
危险的计算
val = p ? *p : 0; 两个数值均被计算 可能获得期望的效果
有副作用的计算
val = x > 0 ? x*=7 : x+=3; 两个数值均被计算 副作用!
18
主要内容
流程控制:条件码(状态标志位) 条件分支 循环结构的实现 Switch语句
相关文档
最新文档