80x86汇编语言程序设计 第2版 教学课件 ppt 作者 王成耀 第10章

上传人:E**** 文档编号:89336065 上传时间:2019-05-23 格式:PPT 页数:29 大小:103.50KB
返回 下载 相关 举报
80x86汇编语言程序设计 第2版  教学课件 ppt 作者  王成耀 第10章_第1页
第1页 / 共29页
80x86汇编语言程序设计 第2版  教学课件 ppt 作者  王成耀 第10章_第2页
第2页 / 共29页
80x86汇编语言程序设计 第2版  教学课件 ppt 作者  王成耀 第10章_第3页
第3页 / 共29页
80x86汇编语言程序设计 第2版  教学课件 ppt 作者  王成耀 第10章_第4页
第4页 / 共29页
80x86汇编语言程序设计 第2版  教学课件 ppt 作者  王成耀 第10章_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《80x86汇编语言程序设计 第2版 教学课件 ppt 作者 王成耀 第10章》由会员分享,可在线阅读,更多相关《80x86汇编语言程序设计 第2版 教学课件 ppt 作者 王成耀 第10章(29页珍藏版)》请在金锄头文库上搜索。

1、本章要点,要学习本章,需要具备一定的C/C+语言程序设计基础 了解Microsoft Visual C+ 6.0环境下汇编语言与C/C+语言混合编程的基本方法 了解设计并发程序必须考虑的问题 了解并发环境下实现进程(或线程)同步的基本方法 本章关于并发程序设计方面的知识,对于学习操作系统课程会有所帮助,第10章 汇编语言编程高级主题,第10章 汇编语言编程高级主题,10.1 汇编语言与C/C+语言混合编程 10.2 并发程序设计 10.3 本章小结,10.1 汇编语言与C/C+语言的混合编程,基于Windows 9x/2000/XP/2003等32位环境,以Microsoft Visual C

2、+ 6.0为例。 int类型的数据占4个字节,short类型的数据占2个字节,char类型的数据占1个字节。 所有地址都是32位偏移地址。 基本方法: 嵌入汇编语言 模块连接,10.1 汇编语言与C/C+语言的混合编程,1.嵌入汇编语言,(1)格式 _asm ; 汇编语言指令序列 例如: _asm mov ax, 1a69h mov dx, 378h out dx, ax 也可以将_asm放在每条汇编语言指令前。例如: _asm mov ax, 1a69h _asm mov dx, 378h _asm out dx, ax,10.1 汇编语言与C/C+语言的混合编程,1.嵌入汇编语言,说明:

3、在嵌入的汇编语言指令中,可以使用C/C+语言的数据格式。例如,1a69h可以书写为0x1a69。 嵌入的汇编语言代码不能使用MASM的伪指令来定义数据。 在嵌入的汇编语言代码中,不需要保护寄存器EAX、EBX、ECX、EDX、ESI和EDI的值,必要时由C/C+编译器负责生成保护指令。需要保护寄存器DS、SS、ESP、EBP以及方向标志DF的值。,10.1 汇编语言与C/C+语言的混合编程,1.嵌入汇编语言,(2)汇编语言代码访问C/C+程序中定义的数据 嵌入在C/C+程序中的汇编语言指令,除了可以使用立即数与寄存器外,还可以使用C/C+程序中定义的标识符,如常量、变量、标号、函数名与函数参数

4、等。C/C+编译器自动将它们转换成相应汇编语言指令的操作数,并在标识符前自动加下划线。 一般来说,只要汇编语言指令可以使用内存操作数,就可以使用C/C+程序中的变量。 例 (略)。,10.1 汇编语言与C/C+语言的混合编程,1.嵌入汇编语言,(3)利用嵌入的汇编语言代码编写C语言函数 通过嵌入汇编语言代码编写C/C+函数时,可以直接按名引用函数参数。 C/C+函数对返回值的约定: 不超过32位的数据被扩展为32位,存放在EAX寄存器中返回; 48个字节的返回值存放在EDX:EAX中返回; 对于更大的结构,则将其地址指针存放在EAX中返回。 例 (略)。,10.1 汇编语言与C/C+语言的混合

5、编程,2.C/C+程序调用汇编语言过程,(1)调用约定 Microsoft Visual C+的调用约定主要包括_cdecl和_stdcall两种。 C/C+函数缺省采用_cdecl调用约定,这种约定在函数名前自动加一个下划线,从右到左将实在参数压入堆栈,由函数的调用者负责堆栈的平衡。 Win32 API函数采用_stdcall调用约定,这种约定从右到左将实在参数压入堆栈,由函数本身负责移去调用者压入堆栈的参数,函数名在编译后被转换为如下形式: _函数名参数长度 其中,参数长度是指参数表的字节数(十进制)。例如,设函数fun有两个32位参数,则供外部模块调用的名称为_fun8。,10.1 汇编

6、语言与C/C+语言的混合编程,2.C/C+程序调用汇编语言过程,(2)声明约定 在Microsoft Visual C+中,需要用extern “C“对所要调用的外部过程、函数和变量予以声明。 形式: extern “C“ 返回值类型 调用约定 函数名(形式参数表); extern “C“ 变量类型 变量名; 在用汇编语言编写的程序中,必须用public声明供外部模块使用的标识符。,10.1 汇编语言与C/C+语言的混合编程,2.C/C+程序调用汇编语言过程,(3)参数的约定 C/C+函数通过堆栈传递参数,函数通过寄存器EAX或EDX:EAX返回值。 注意,在32位环境下,汇编语言访问堆栈时要

7、使用32位寄存器EBP。 例 (略)。,10.2 并发程序设计,1.程序的顺序执行,指具有独立功能的程序独占处理机直到执行结束的过程。CPU按照先后次序逐条执行指令,仅当一条指令执行完后,才能执行下一条指令。 特征: 1)顺序性 一条指令执行结束是下一条指令开始执行的前提条件。 2)封闭性 独占系统的全部资源,执行结果由给定的初始条件决定,不受任何其他程序等外界因素的影响。 3)可再现性 程序顺序执行的结果与执行速度、时间无关。,10.2 并发程序设计,2程序的并发执行,(1)并发与并行 并行是指两个或多个事件在同一时刻发生; 并发是指两个或多个事件在同一时间间隔内发生。 在多任务环境下,并发

8、是指宏观上在一段时间内有多道程序同时运行。但在单处理机系统中,每一时刻仅能执行一道程序,故在微观上,这些程序是交替执行的。 程序的并发执行指的是:一组在逻辑上相互独立的程序或程序段在执行过程中,其执行时间互相重叠或交替,即一个程序的执行尚未结束、另一个程序的执行已经开始的执行方式。,10.2 并发程序设计,2程序的并发执行,(2)程序的并发执行所带来的问题 在某些情况下,程序的并发执行会使执行结果不再具有封闭性和可再现性。 在单处理机系统中,出现问题的原因是中断可能会在程序中任何一条指令(注意,不是语句)执行结束时发生,从而导致系统暂停当前程序、切换到另一个程序去执行。 在多处理机环境下,除了

9、存在中断的因素外,两个程序对同一个共享变量的同时访问也会引发问题。因此,必须有效控制对共享资源的访问。,10.2 并发程序设计,3进程(或线程)同步的概念,(1)进程与线程 进程是程序的一次执行,或者说是程序执行的一个实例。 每个进程都有自己的地址空间。 线程是进程的一条执行路径。 一个进程可以有多个线程,其中至少有一个是主线程(Primary Thread)。 一个进程内的多个线程共享该进程的地址空间。,10.2 并发程序设计,3进程(或线程)同步的概念,(2)同步与互斥 两个事件之间的同步是指两个事件的发生存在某种时序上的关系。 进程同步是指系统中的多个进程为了共同完成一个任务,它们之间必

10、须协同动作、互相配合,甚至需要交换信息。 互斥可以看作是一种特殊的同步关系。由于各进程需要共享资源,而有些资源要求排他性地使用,或者说是互斥地使用,必须以某种手段确保当一个进程在使用共享资源时,其他进程不能作同样的操作。,10.2 并发程序设计,3进程(或线程)同步的概念,(3)临界资源和临界区 必须互斥访问的共享资源称为临界资源(Critical Resource)。 进程中访问临界资源的那段代码称为临界区(Critical Region)。 实现互斥的关键是确保一个以上的进程不同时处于临界区。,10.2 并发程序设计,4互斥的实现方法,一个实现互斥的错误方案:,设置共享变量flag =,0

11、:临界区内无进程,初始值 1:临界区内有进程,while (flag) ; flag = 1; flag = 0; ,错误原因:对flag的测试和设置不是原子操作(Atomic Operation)。,10.2 并发程序设计,4互斥的实现方法,实现互斥的基本方法有两种:关中断与机器指令。 (1)关中断,cli ; 关中断 sti ; 开中断 ,该方法对于多处理机系统是无效的。 在多处理机系统中,有可能存在一个以上的进程在不同处理机中并行执行,关中断仅仅对执行本指令的CPU有效,一个在其他CPU上运行的进程可以随时修改共享变量。,10.2 并发程序设计,4互斥的实现方法,(2)机器指令 TSL(

12、Test and Set Lock,测试并加锁)指令: TSL reg, mem ; reg = mem, mem = 1 TSL指令的功能: 从指定的内存地址读入一个值到寄存器中,然后将一个非零值存入该内存地址。执行TSL指令的CPU将锁住内存总线以禁止其他CPU在该指令结束之前访问内存,从而保证读写操作是不可分割的。,10.2 并发程序设计,4互斥的实现方法,用TSL指令实现互斥的代码:,EnterRegion proc InUse: TSL eax, flag cmp eax, 0 jnz InUse ret EnterRegion endp LeaveRegion proc mov f

13、lag, 0 ret LeaveRegion endp,call EnterRegion ; 进入临界区 call LeaveRegion ; 离开临界区 ,10.2 并发程序设计,4互斥的实现方法,80x86 CPU没有专门的TSL指令,类似的有btc、btr、bts和xchg等。,EnterRegion proc mov eax, 1 InUse: xchg eax, flag cmp eax, 0 jnz InUse ret EnterRegion endp,1)使用xchg指令实现EnterRegion过程,10.2 并发程序设计,4互斥的实现方法,EnterRegion proc I

14、nUse: lock bts flag, 0 jc InUse ret EnterRegion endp,2)使用位测试指令实现EnterRegion过程,注意,在bts指令前使用lock前缀,其目的是保证在多处理机系统中,该指令也能作为原子操作执行。 在单处理机系统中不需要lock前缀。,10.2 并发程序设计,5信号量,(1)什么是信号量 把信号量看作一个具有整数值的变量,除了初始化外,只能通过两个原子操作down(s)和up(s)来访问。这两个原子操作常常被分别称为P、V操作。 down(s)和up(s)操作可描述如下。 1)down(s) while (s = 0) ; s-; 2)u

15、p(s) s+;,10.2 并发程序设计,5信号量,(2)信号量的含义 一般来说,用信号量s表示系统中的某种资源R; s的值表示资源R当前可用的数量; down(s)意味着请求系统分配一个资源R,因而要将s的值减1,当s=0时说明无可用的资源,请求者必须等待别的进程释放了该资源后才能运行; up(s)表示释放一个资源R。,10.2 并发程序设计,5信号量,(3)信号量的实现,typedef struct int value; int flag; SEMAPHORE;,这里定义了一个信号量类型SEMAPHORE,包含字段value和flag。 value表示信号量的值; flag是为互斥访问va

16、lue而设置的锁变量,初始值为0。,10.2 并发程序设计,5信号量,(3)信号量的实现,void down(SEMAPHORE *sem) int* pflag = ,10.2 并发程序设计,5信号量,(3)信号量的实现,void up(SEMAPHORE *sem) int* pflag= ,通过使用lock bts指令,以确保一个信号量同一时刻最多有一个进程或线程对其进行操作。,10.2 并发程序设计,5信号量,(4)说明信号量的应用。 例 生产者-消费者问题。(略)。,10.3 本章小结,在Microsoft Visual C+环境下,汇编语言与C/C+语言的混合编程通常有两种方法。一种方法是使用_asm关键字,在C/C+程序中嵌入汇编语言代码;另一种方法是采用不同语言编写程序模块,但要特别注意对接口、参数传递和返回值处理等的约定。 并发指的是多个事件在同一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号