汇编课件第10章

上传人:油条 文档编号:47696511 上传时间:2018-07-04 格式:PPT 页数:29 大小:103.50KB
返回 下载 相关 举报
汇编课件第10章_第1页
第1页 / 共29页
汇编课件第10章_第2页
第2页 / 共29页
汇编课件第10章_第3页
第3页 / 共29页
汇编课件第10章_第4页
第4页 / 共29页
汇编课件第10章_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《汇编课件第10章》由会员分享,可在线阅读,更多相关《汇编课件第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+ 6.

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

3、/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+程序中定义的标识符,如常量、变量、标号、函数名与函数参数等。 C/C+编译器自动将它们

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

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

6、言过程(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位环境下,汇编语言访问堆栈时要使用32位寄存器EBP。例 (略)。10.2 并发程序设计1.程序的顺序执行

7、 指具有独立功能的程序独占处理机直到执行结束的过程。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:临界区内无进程,初始值 1:临界区内有进程while (flag); flag = 1;flag = 0;错误原因:对flag的测试和设置不是原

11、子操作(Atomic Operation)。10.2 并发程序设计4互斥的实现方法实现互斥的基本方法有两种:关中断与机器指令。(1)关中断cli; 关中断sti; 开中断该方法对于多处理机系统是无效的。在多处理机系统中,有可能存在一个以上的进程在不同处理机中并行执行,关中断仅 仅对执行本指令的CPU有效,一个在其他CPU上运行的进程可以随时修改共享变量。10.2 并发程序设计4互斥的实现方法(2)机器指令TSL(Test and Set Lock,测试并加锁)指令:TSLreg, mem ; reg = mem, mem = 1TSL指令的功能:从指定的内存地址读入一个值到寄存器中,然后将一个

12、非零值存入该内存地址。 执行TSL指令的CPU将锁住内存总线以禁止其他CPU在该指令结束之前访问内存,从而 保证读写操作是不可分割的。10.2 并发程序设计4互斥的实现方法用TSL指令实现互斥的代码:EnterRegionproc InUse: TSLeax, flag cmpeax, 0 jnzInUse ret EnterRegionendpLeaveRegionproc movflag, 0 ret LeaveRegionendpcall EnterRegion ; 进入临界区call LeaveRegion; 离开临界区 10.2 并发程序设计4互斥的实现方法80x86 CPU没有专门

13、的TSL指令,类似的有btc、btr、bts和xchg等。EnterRegionprocmoveax, 1InUse:xchgeax, flagcmpeax, 0jnzInUseretEnterRegionendp 1)使用xchg指令实现EnterRegion过程10.2 并发程序设计4互斥的实现方法EnterRegionprocInUse:lockbtsflag, 0jcInUseretEnterRegionendp2)使用位测试指令实现EnterRegion过程 注意,在bts指令前使用lock前缀,其目的是保证在多处理机系统中,该指令也能作 为原子操作执行。在单处理机系统中不需要loc

14、k前缀。10.2 并发程序设计5信号量(1)什么是信号量把信号量看作一个具有整数值的变量,除了初始化外,只能通过两个原子操 作down(s)和up(s)来访问。这两个原子操作常常被分别称为P、V操作。down(s)和up(s)操作可描述如下。1)down(s)while (s flag); for (; ;) _asm moveax, pflag InUse:lockbtseax, 0 jcInUse if (sem-value 0) sem-value-; break; sem-flag = 0; Sleep(1); / 主动放弃处理机,以改善性能 sem-flag = 0; 10.2 并发

15、程序设计5信号量(3)信号量的实现 void up(SEMAPHORE *sem) int* pflag= _asm moveax, pflag InUse: lockbtseax, 0 jcInUse sem-value+; sem-flag = 0; 通过使用lock bts指令,以确保一个信号量同一时刻最多有一个进程或线程对其进 行操作。 10.2 并发程序设计5信号量(4)说明信号量的应用。例 生产者-消费者问题。(略)。10.3 本章小结 在Microsoft Visual C+环境下,汇编语言与C/C+语言的混合编程通常有两种方法。 一种方法是使用_asm关键字,在C/C+程序中嵌

16、入汇编语言代码;另一种方法是采用 不同语言编写程序模块,但要特别注意对接口、参数传递和返回值处理等的约定。 并发指的是多个事件在同一时间间隔内发生。 必须互斥访问的共享资源称为临界资源。进程中访问临界资源的那段代码称为临界 区。互斥的关键是确保一个以上的进程不同时处于临界区。 实现互斥的基本方法有两种:关中断与机器指令。关中断对于多处理机系统是无法 实现互斥的。 80x86 CPU的xchg指令以及带lock前缀的btc、btr和bts等指令,即使在多处理机系统 中也可以作为原子操作执行,这是高级语言语句所不能实现的。 信号量可以看作是一个具有整数值的变量,除了初始化外,只能通过两个原子操作 down和up来访问。 一般来说,信号量的值表示某种资源的当前可用数

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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