[工学]第5章 汇编语言与程序设计.ppt_第1页
[工学]第5章 汇编语言与程序设计.ppt_第2页
[工学]第5章 汇编语言与程序设计.ppt_第3页
[工学]第5章 汇编语言与程序设计.ppt_第4页
[工学]第5章 汇编语言与程序设计.ppt_第5页
已阅读5页,还剩122页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 汇编语言与程序设计,本章学习要点,1、 INTEL 8086 微处理器的寄存器和主存储器 2、 汇编语言语句格式 3、 8086 的指令系统及寻址方式 4、 8086 汇编语言的数据、表达式和运算符 5、 8086 汇编语言的伪指令 6、 汇编语言程序设计技术 7、 汇编与C/C+接口,5.1 概述,程序设计语言通常分为3类: 机器语言(Machine Language) 汇编语言(Assembler Language) 高级语言(High Level Language) 。 1机器语言 (1)机器指令 机器指令是指用二进制编码的指令,以表示计算机所要进行操作数及操作 对象(数据或数据地址)。,基本概念,(2)指令系统和机器语言 指令系统是指特定计算机上机器指令的集合。机器语言是由指令系统以 及机器指令的使用规则构成的。 机器语言是计算机惟一能识别的语言,只有用机器语言描述的程序,计 算机才能直接执行。 (3)机器语言的主要特点 机器语言主要具有下列两个特点: 机器语言与机器密切相关 机器语言设计程序非常困难,但容易实现高性能,2 汇编语言,以助记符描述的指令称作汇编格式指令或符号指令,通常简称指令。指令和伪指令的集合及其程序设计规则便构成了汇编语言。用汇编语言编写的程序就是汇编语言源程序。,5.2 INTEL8086寄存器和主存储器,8086通用寄存器 8086的标志寄存器 存储器组织与段寄存器,5.2.1. 8086通用寄存器,5.2.2 8086的标志寄存器,8086CPU中有一个16位标志寄存器,由6位条件码标志(flag)和3位控制标志构成.,5.2.3 存储器组织与段寄存器,数据类型,【例5.1】各独立段的分配情况示例。,设CS=B000H、DS=1CDEH、SS=4200H、ES=0150H,它们分别为代码段、数据段、堆栈段和附加段的段首址。自每个段首址开始,各段均占64KB的范围,各段之间互不重叠。如图所示。,5.3 汇编语言语句格式,汇编语言源程序由语句序列构成。每条语句一般占一行,分表达硬指令的执行性语句和表达伪指令的说明性语句两种格式。语句一般由分隔符分成的四个部分组成,它们有两种格式: 执行性语句由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中: 标号:硬指令助记符 操作数,操作数,. ;注释 说明性语句由伪指令构成的语句,它通常指示汇编程序如何汇编源程序: 名字 伪指令助记符 参数,参数,. ;注释,5.3.1.段定义的简化,在MASM 5.0及以上版本中,段的定义可以非常简单,方便了程序设计。使用简化段定义伪指令前,必须先说明用户程序使用的内存模式。 内存模式定义伪指令MODEL 内存模式指用户程序的代码和数据的存放格式,及他们占用内存的大小。 .MODEL ,语言类型,操作系统类型,堆栈类型,5.3.2简化的段定义 1. 简化段定义伪指令,简化段定义伪指令在 .MODEL 语句之后,如下所列。 每个简化段伪指令都可用来表示一个段的开始,同时也说明前一个段结束。 .STACK长度 ;定义堆栈段,长度缺省值为1KB .CODE名字 ;定义代码段 .DATA ;定义数据段 .DATA? ;定义数据段,初值不确定 .FARDATA名字 ;定义远调用数据段 .FARDATA?名字 ;定义远调用数据段,初值不确定 .CONST ;定义只读常数数据段 .STARTUP ;程序起始点,并初始化DS、SS .EXIT 0 ;程序结束点,返回操作系统 上述简化段定义伪指令中带方括号的项可省略。 伪指令.EXIT 0相当于MOV AX,4C00H和INT 21H两条指令。,2.缺省段名,5.3.3完整的段定义,使用完整的段定义伪指令来定义一个段,可具体控制汇编程序MASM和连接程序LINK在内存中组织代码和数据的方式。整个逻辑段必须用段定义语句括起来。 SEGMENTENDS伪指令 SEGMENT 定位类型 组合方式 段长度 分类名 段体 ENDS,5.3.4 源程序编程格式,1. .EXE文件编程格式 该格式下源程序允许使用多个逻辑段,适合编写大型程 序,汇编-连接后生成扩展名为.EXE的可执行文件。 2. .COM文件编程格式 该格式只允许源程序设置一个代码段(堆栈在代码段 内),代码段的目标模块要小于64KB,适合编写中小程 序。在.MODEL TINY伪指令定义的内存模式下即可生 成.COM结构的源程序。,5.3.5返回操作系统方式,1使用功能号为4CH的DOS功能调用,2将主程序定义为远过程,3利用20H号BIOS中断调用,4利用0号DOS系统功能调用,5.3.6建立汇编语言的工作环境,为运行汇编语言程序至少要在磁盘上提供以下文件: 1.编辑程序文件,如EDIT.EXE。 2.汇编程序文件,如MASM.EXE。 3.连接程序文件,如LINK.EXE。 4.调试程序文件,如DEBUG.COM。 必要时,还可建立如CREF.EXE和EXR2BIN.EXE等文件。,5.3.7汇编语言源程序上机过程,在计算机上运行汇编语言程序的步骤是: 1.用编辑程序建立ASM源文件; 2.用MASM程序把ASM文件转汇编成OBJ文件; 3.用LINK程序把OBJ文件转连接成EXE文件; 4.用DOS命令直接键入文件名就可执行该程序。,5.4 8086 的指令系统及寻址方式,8086 CPU的指令系统的基本指令包括数据传送类指令、算术运算类指令、位操作类指令、串操作类指令、控制转移类指令、处理机控制类指令。,5.4.1 指令中操作数的符号说明,计算机中的一条指令通常包含两部分:,操作码,操作数,5.4.2 三类操作数的寻址方式,寻找指令中所需操作数存放地址的方式或程序转移时寻找转移地址的方式称为寻址方式。 因而寻址方式分为两大类,一类是数据寻址方式,另一类是转移地址寻址方 式。 由于80X86指令涉及四种操作数:立即操作数、寄存器操作数、存储器操作数和隐含操作数,因此,数据寻址方式又可对应四种寻址方式,即:立即寻址、寄存器寻址、存储器寻址和固定寻址。本节只介绍前三种。,5.4.3 数据传送类指令,8086指令系统按功能可分为六大类: 数据传送类指令、算术运算类指令、位操作指令、串操作指令、控制转移指令、处理器控制指令。 8086指令按操作数个数可划分为三种类型: 双操作数指令、单操作数指令、无操作数指令。,1通用数据传送指令,(1)传送指令MOV (2)查表转换指令XLAT,2地址传送指令,(1)传送有效地址指令LEA (2)传送偏移地址及数据段首址指令LDS (3)传送偏移地址及附加段首址指令LES,3标志位传送指令,(1)标志送AH指令LAHF (2)AH标志送指令SAHF (3)标志进栈指令PUSHF (4)标志出栈指令POPF,4.堆栈操作指令,(1)进栈指令PUSH (2)出栈指令POP,5.4.4算术运算类指令,8086的算术运算类指令能够对二进制或十进制(BCD码)数进行加、减、乘、除运算,操作数的数据形式可以是8位或16位的无符号数或带符号数。对于单操作数指令,不允许使用立即数形式;对于双操作数指令,只有源操作可以使用立即数,两个操作数中必须有一个在寄存器中。,1.加法运算指令,(1)加法指令ADD (2)带进位加法指令ADC (3)加1指令INC,2.减法运算指令,(1)减法指令SUB (2)带借位减法指令SBB (3)减1指令DEC (4)求负数指令NEG (5)比较指令CMP,3.乘法运算指令,(1)无符号数乘法指令MUL (2)有符号数乘法指令IMUL,4.除法运算指令,(1)无符号数除法指令DIV (2)有符号除指令IDIV,5.符号扩展指令,(1)字节转换成字指令CBW (2)字转换成双字指令CWD,6.十进制算术运算调整指令,(1)非压缩BCD码调整指令 (2)压缩BCD码调整指令,5.4.5逻辑运算类指令,8086提供的位操作指令包括逻辑运算指令和移位指令,这类指令可直接对寄存器或存储器中的位进行操作。 逻辑运算指令包括:AND指令、OR指令、XOR指令、TEST指令和NOT指令,其中前四种指令是双操作数指令,符合双操作数指令的一般规律,这四条指令执行后将使CF和OF位为0,AF位不确定,而SF、ZF和PF位则根据运算结果设置;NOT指令是单操作数指令,符合单操作数指令的一般规律,它的执行不影响标志位。,1.逻辑与指令,格式:AND OPD,OPS 功能:将目的操作数与源操作数按位相与,结果送目的操作数。即: OPD(OPD)(OPS)。,2.逻辑或指令,格式:OR OPD,OPS 功能:将目的操作数与源操作数按位相或,结果送目的操作数。即: OPD(OPD)(OPS)。,3.逻辑异或指令,格式:XOR OPD,OPS 功能:将目的操作数与源操作数按位相异或,结果送目的操作数。即: OPD(OPD)(OPS)。,4.测试指令,格式:TEST OPD,OPS 功能:目的操作数与源操作数按位相与,结果反映在标志位上,但不送回目的操作数。 即:(OPD)(OPS),5.逻辑非指令,格式:NOT OPD 功能:将目的操作数各位取反,结果送目的操作数。即: OPD(OPD),5.4.6移位操作类指令,移位指令包括逻辑移位指令、算术移位指令和循环移位指令。这些指令都对目的操作数按操作符规定的方式向左或向右移动指定位数的操作。这些指令均有统一的语句格式: 标号:操作符OPD,1或 标号:操作符OPD,CL,(1)逻辑左移指令 (2)算术左移指令 (3)逻辑右移指令 (4)算术右移指令 (5)循环左移指令ROL (6)循环右移指令ROR (7)带进位的循环左移指令RCL (8)带进位的循环右移指令RCR,5.4.7串操作类指令,串操作指令中,源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越;目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越。每执行一次串操作指令,作为源地址指针的SI和作为目的地址指针的DI将自动修改:1(对于字节串)或2(对于字串)。地址指针是增加还是减少则取决于方向DF标志。在系统初始化后或者执行指令CLD指令后,DF=0,此时地址指针增1或2;在执行指令STD指令后,DF=1,此时地址指针减少1或2。,1传送指令MOVS 2.往目的串中存数指令STOS 3.从源串中取数指令LODS 4.串比较指令CMPS 5.串搜索指令SCAS 6重复前缀指令REP/REPZ/REPNZ,5.4.8控制转移类指令及其寻址方式,Intel 8086中,程序的执行序列是由代码段寄存器CS和指令指针IP确定的。CS包含当前指令所在代码段的段地址,IP则是要执行的下一条指令的偏移地址。程序的执行一般是以指令序列顺序执行,但有时需要改变程序的流程。控制转移类指令通过修改CS和IP寄存器的值来改变程序的执行顺序,包括5组指令:无条件转移指令,有条件转移指令,循环指令,子程序指令和中断指令。,1.控制转移指令,(1)控制转移指令 (2)无条件转移指令 (3)条件转移指令(conditional jump),2.指令寻址方式,(1)段内直接寻址 (2)段间直接寻址 (3)段内间接寻址 (4)段间间接寻址,5.4.9处理机控制类指令,处理机控制类指令用来控制各种CPU的操作,如暂停、等待或空操作等。,汇编语言的指令语句和伪指令语句操作数一般为常量、变量、标号、表达式。,5.5 8086 汇编语言的数据、 表达式和运算符,5.5.1常数,常量是没有任何属性的纯数值,它的值在汇编期间已能完全确定,且在程序运行中也不会发生变化。常量分为数值常量、字符串常量和符号常量,它主要用于指令语句中的立即数或伪指令语句中给变量赋初值等。,1.数值常量 2.字符串常量 3.符号常量,5.5.2变量,在汇编语言中,变量是一个数据存储单元的名称,即数据存放地址的符号表示。它代表存放在某些存储单元的数据,这些数据在程序运行期间随时可以改变。为方便访问变量,在程序中通过变量名来使用变量。,5.5.2变量,变量名-为用户自定义标识符,表示初值表首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。变量名可以没有,这种情况,汇编程序将直接为初值表分配空间,无符号地址。设置变量名是为了方便存取它指示的存储单元。 初值表-是用逗号分隔的参数,主要由数值常数、表达式或?、DUP组成。其中?表示初值不确定,即未赋初值;重复初值可以用DUP进行定义。DUP的格式为: 重复次数 DUP(重复参数) 变量定义伪指令-有DB / DW / DD / DF / DQ / DT,它们根据申请的主存空间单位分类。,5.5.3标号,标号是一条指令语句的符号地址,在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在控制转移指令中直接引用这个标号。标号一般在代码段中定义和引用。由于标号代表了指令的符号地址,所以标号也有3个属性: 段属性(SEG):标号的段属性是指标号定义所在段的段首地址。 偏移属性(OFFSET):标号的偏移属性是指标号所在段的段首地址到该标号的字节距离。 类型属性(TYPE):标号的类型属性表示了它的转移特性,即该标号是作为段内还是段间转移(或调用)指令的目标地址。标号的类型属性有2种:NEAR类型和FAR类型。,5.5.4表达式与运算符,1.数值表达式 2.地址表达式 (1)属性运算符 (2)数值返回运算符 (3)分离运算符 (4)其他运算符,5.6 8086 汇编语言的伪指令,伪指令又称为伪操作,伪指令是汇编语言程序设计的一个重要部分,由于汇编程序在汇编过程中无法区分源程序中的分段情况,哪些是数据,哪些是指令,也无法识别数据的类型,以及源程序在哪结束,因此,80X86宏汇编语言提供了多种伪指令,它主要告诉汇编程序如何正确地将汇编源程序汇编成目标程序。,5.6.1 数据定义及存储器分配伪指令,常用的数据定义伪指令有DB、DW、DD、DQ、DT。它们的定义如上节所示。 格式:变量 数据定义伪指令 表达式 ,表达式, 功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。,5.6.2 表达式赋值伪指令,1等价伪指令EQU 格式:符号名 EQU 表达式 功能:为常量或表达式及其它各种符号定义一个等价的符号名,但它不申请分配存储单元。,2等号伪指令 格式:符号名 = 表达式 功能:该语句的功能与EQU语句类似,不同的是等号伪指令能对所定义的符号名多次重新定义,且以最后一次定义的值为准。,5.6.3 段定义伪指令,编制一个80X86汇编语言源程序,段是基础,这有两方面含义:一是必须按段来构造程序,二是在程序执行时,要凭借四个段寄存器对各个段的存储单元进行访问。段结构伪指令主要有两条语句,即段定义伪指令和假定伪指令。,1段定义伪指令SEGMENT/ ENDS 格式:段名 SEGMENT 定位类型 组合类型 类别 段体 段名 ENDS 功能:定义一个逻辑段,指定段的名字和范围,段在内存中的起始位置、段与段之间的连接关系。,2假定伪指令ASSUME 假定伪指令主要用于指示汇编程序哪些段是当前段以及这些段与段寄存器之间的对应关系。 格式:ASSUME 段寄存器名:段名,段寄存器名:段名, ,5.6.4 程序开始和结束伪指令,1源程序开始伪指令 (1)NAME伪指令 (2)TITLE伪指令 2源程序结束伪指令 格式:END 地址表达式 功能:该语句为源程序的最后一个语句,用以标 志整个程序的结束,即告诉汇编程序汇编工作到 此结束。,5.6.5 过程定义伪指令,在程序设计中,经常将一些重复出现的语句组定义为子程序。子程序又称为过程,可以采用CALL指令来调用。 使用格式: 过程名 PROC NEAR/FAR (语句系列) RET (语句系列) 过程名 ENDP 调用一个过程的格式为: CALL 过程名,5.6.6 宏指令,在编写汇编语言程序的过程中,有时某个程序段要出现许多次,有时只是参数不同,但功能完全一样,则这样的程序段可以定义成一个指令,并且称它为宏指令。,1.宏的定义,宏定义由一对宏汇编伪指令MACRO / ENDM来完成: 宏名 MACRO 形参表 宏定义体 ENDM,2.宏的调用,(1)宏调用 在汇编语言中使用已定义过的宏指令,称为宏调用。按照宏指令定义的格式,宏调用也可分为两种格式。 无参数宏调用:宏指令名 带参数宏调用:宏指令名 实参1,实参2,,宏展开,当宏汇编程序扫描到宏指令语句(即宏调用)时,宏汇编程序就把宏指令定义中宏体的程序段代码替代宏指令语句。若是带参数的宏调用,则同时用相应的实参替代宏体中对应形参的位置,并对原有宏体代码作修改。下面是一个源程序的列表文件,它展示了宏定义、宏调用和宏展开的全部过程。,3.常用宏操作符,&替换操作符,用于将参数与其他字符分开。如果参数紧接在其他字符之前或之后,或者参数出现在带引号的字符串中,就必须使用该伪操作符。 字符串传递操作符,用于括起字符串。在宏调用中,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整。,常用宏操作符,!转义操作符,用于指示其后的一个字符作为一般字符,而不含特殊意义。 %表达式操作符,用在宏调用中,表示将后跟的一个表达式的值作为实参,而不是将表达式本身作为参数。 ;宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现。,4.宏的参数,宏的参数功能强大,即可以无参数,又可以带有一个或多个参数;而且参数的形式非常灵活,可以是常数、变量、存储单元、指令(操作码)或它们的一部分,也可以是表达式。,5.宏汇编中的伪指令,(1)MACRO和ENDM 在前面的宏指令的定义中已经介绍过,这是宏操作时必不可少的指令,而且成对出现。 (2)PURGE PURGE的功能是取消多个宏定义,即一个宏指令定义可以用伪指令PURGE来取消,然后就再重新定义。 格式: PURGE 宏指令名1 ,宏指令名2 取消宏定义的含义是使该宏定义成为空,程序中如果出现一个已被 取消宏定义的宏调 用,则汇编程序将不会指示出错,但它将忽略该宏调用,当然也不会予以展开。,5.7 汇编语言程序设计技术,在汇编语言程序设计中,程序有顺序、分支、循环和子程序四种基本结构形式。,5.7.1 源程序设计步骤,1.用编辑程序(EDIT.EXE或WPS.EXE等)建立ASM源文件(文件名ASM)。 2.用汇编程序(MASM.EXE或ASM.EXE)对源文件进行汇编,如有错误,再回到第1步进行修改,直到无语法错误,产生目标文件(文件名OBJ)。 3.用连接程序(LINK.EXE)把目标文件转换为可执行文件(文件名EXE)。 4.用调试程序(DEBUG.COM)对可执行文件进行调试,如发现错误,再进行第1-4步骤,对源程序进行修改、汇编、连接和调试,直到无错误为止。此时的可执行文件在DOS命令下可直接执行。,5.7.2 顺序程序设计,顺序程序设计也称为简单程序设计,这种结构的程序不使用分支、循环结构,程序本身的逻辑非常简单,所以只能完成一些简单操作。其特点是程序顺序执行,由前向后逐条执行指令。,5.7.3 分支程序设计,分支程序结构有两种形式:二分支程序结构和多分支程序结构 。 程序的分支一般是通过执行转移指令来实现的。,5.7.4 循环程序设计,当需要重复执行某段程序时,就可以利用循环程序结构。循环结构一般是根据某一条件判断为真或假来确定是否重复执行循环体,条件永真或无条件的重复循环就是逻辑上的死循环(永真循环、无条件循环)。循环程序结构是满足一定条件的情况下,重复执行某段程序。 1.循环程序的组成 一个循环程序通常由以下5个部分组成: (1)初始化部分 (2)工作部分 (3)修改部分 (4)控制部分 (5)结束处理部分,5.7.5 子程序设计,把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序。子程序可以实现源程序的模块化,可简化源程序结构,可以提高编程效率。主程序(调用程序)需要利用CALL指令调用子程序(被调用程序)。子程序需要利用RET指令返回主程序。,5.7.6 系统功能调用,汇编程序提供给汇编语言程序员的功能非常有限,程序员需要利用ROM-BIOS和操作系统提供的资源,系统功能调用是程序设计的一个重要方面。 通常按照如下4个步骤进行: 在AH寄存器中设置系统功能调用号。 在指定寄存器中设置入口参数。 用中断调用指令( INT i8)执行功能调用。 根据出口参数分析功能调用执行情况。,5.7.7 汇编语言程序的开发,1.源程序的开发流程 一般汇编语言的上机过程是首先用某一个文本编辑器形成一个以ASM为扩展名的源程序文件,然后用汇编程序翻译源程序,将ASM文件转换为OBJ模块文件,最后用连接程序将一个或多个目标文件链接成一个可执行文件。 2.源程序的编辑 源程序文件的形成(编辑)可以通过任何一个文本编辑器实现。 例如,DOS中的全屏幕文本编辑器EDIT,或读者已经熟悉的其他程序开发工具中的编辑环境(象Turbo C),也可以采用Windows的记事本NOTEPAD.EXE。注意源程序文件要以ASM为扩展名。,汇编语言程序的开发,3. 源程序的汇编 汇编是将源程序翻译成由机器代码组成的目标模块文件的过程。MASM 6.x提供的汇编程序是ML.EXE。进入已建立的程序所在目录,键入如下命令及相应参数即可以完成源程序的汇编:ML /c lt301a.asm。如果源程序中没有语法错误,MASM将自动生成一个目标模块文件(lt301a.obj),否则MASM将给出相应的错误信息。这时应根据错误信息,重新编辑修改源程序后,再进行汇编。注意,仅利用ML实现源程序的汇编,参数/c(小写字母c)是必须有的;否则,ML将自动调用连接程序LINK.EXE进行连接。,汇编语言程序的开发,4.目标文件的连接 连接程序能把一个或多个目标文件和库文件合成一个可执行文(.EXE、.COM文件)。在程序目录下有了lt301a.obj文件,键入如下命令实现目标文件的连接:LINK lt301a.obj如果不带文件名,LINK连接程序将提示输入OBJ文件名,它还会提示生成的可执行文件名以及列表文件名,一般采用缺省文件名就可以。如果没有严重错误,LINK将生成一个可执行文件(lt301a.exe);否则将提示相应的错误信息,这时需要根据错误信息重新修改源程序后再汇编、链接,直到生成可执行文件。 ML汇编程序可以自动调用LINK连接程序,实现汇编和连接的依次进行。ML汇编程序还可以生成列表文件和影像文件。,汇编语言程序的开发,5.可执行程序的调试 经汇编、连接生成的可执行程序在操作系统下只要输入文件名就可以运行。 操作系统装载该文件进入主存,开始运行。如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误。利用调试程序可以观察寄存器值、数据所在的,5.8 汇编与C/C+接口,C功能强大,产生的代码效率高,是目前最流行的编程语言之一。但是效率最高的语言不是C/C,而是汇编语言。只不过C/C比起汇编语言来易移植,容易学习;汇编语言比C/C功能更强大,冗余更少。因此,许多软件可以兼顾二者的优点,用C/C和汇编语言混合编程。混合编程主要要解决的问题是二者的接口和参数传递,参数传递包括值传递、指针传递、引用传递等。,5.8.1 C/C+程序中内嵌汇编,1. 嵌入汇编语句的格式 Turbo C语言程序中,嵌入汇编语言指令是在汇编语句前加一个asm关键字,格式如下: asm 操作码 操作数 ,2.访问C语言的数据,内嵌的汇编语句除可以使用指令允许的立即数、寄存器名外,还可以使用C语言程序中的任何符号(标识符),包括变量、常量、标号、函数名、寄存器变量、函数参数等;C编译程序自动将它们转换成相应汇编语言指令的操作数,并在标识符名前加下划线。一般来说,只要汇编语句能够使用存储器操作数(地址操作数),就可以采用一个C语言程序中的符号;同样,只要汇编语句可以用寄存器作为合法的操作数,就可以使用一个寄存器变量。,【例5.10】用嵌入汇编方式实现取两数较小值的函数min,/* LT701.C */ int min(int var1,int var2) /* 用嵌入汇编语句实现的求较小值 */ asm mov ax,var1 asm cmp ax,var2 asm jle minexit asm mov ax,var2 minexit: return(_AX); /* 将寄存器AX的内容作为函数的返回值 */ main() /* C语言主程序 */ min(100,200); ,3.嵌入汇编的编译过程,C语言程序中含有嵌入式汇编语言语句时,C编译器首先将C代码的源程序(.c)编译成汇编语言源文件(.asm),然后激活汇编程序Turbo Assembler将产生的汇编语言源文件编译成目标文件(.obj),最后激活Tlink将目标文件链接成可执行文件(.exe)。,4.命名约定,在C语言程序中,C对所要调用的外部过程、函数、变量均采用EXTERN予以说明,并且放在主调用程序之前,一般放在各函数体外部,说明形式如下: extern 返回值类型 函数名称(参数类型表); extern 变量类型 变量名;,5.声明约定,在C语言程序中,C对所要调用的外部过程、函数、变量均采用EXTERN予以说明,并且放在主调用程序之前,一般放在各函数体外部,说明形式如下: extern 返回值类型 函数名称(参数类型表); extern 变量类型 变量名;,6.寄存器使用约定,作为一个独立的汇编语言子程序,当然要注意寄存器的保护和恢复。 对于BP、SP、DS、CS和SS,汇编语言子程序如果要使用它们,并且有可能改变它们的值,Turbo C要求进行保护。这些寄存器经保护后,可以利用,但退出前必须加以恢复。 寄存器AX、BX、CX、DX和ES,在汇编语言子程序中通常可以任意使用。其中的AX和DX寄存器承担了传递返回值的任务。标志寄存器也可以任意改变。,7.存储模式约定,存储模式处理程序、数据、堆栈在主存中的分配和存取,决定代码和数据的默认指针类型,例如段寄存器CS、DS、SS、ES的设置就与所采用的存储模式有关。存储模式在C语言中也称为编译模式或主存模式。Turbo C提供了六种存储模式,分别是:微型模式(Tiny)、小型模式(Small)、紧凑模式(Compact)、中型模式(Medium)、大型模式(Large)和巨型模式(Huge)。,8.编译和连接过程,按照前面所论述的各种约定,让我们编写一个C语言程序调用汇编语言子程序的简单例子,这里没有参数传递的问题。,5.8.2 独立汇编模块的汇编与C/C+混合编程,两种语言分别编写独立的程序模块,分别产生目标代码OBJ文件,然后进行连接,形成一个完整的程序。使用灵活、功能强,要解决参数传递问题。混合编程的关键问题是建立不同语言之间的接口,在不同格式的两种语言间提供有效的通讯方式,作出符合两种语言调用约定的某种形式说明,实现两种语言间的程序模块互相调用、变量的相互传送以及参数和返回值的正确使用。,1.模块连接的注意事项,必须遵循共同的约定规则:命名约定、声明约定、寄存器使用约定、存储模式约定、参数传递约定、采用一致的调用规范、声明共用函数和变量、正确传递入口参数和返回参数。,2.汇编和C的相互调用可以分以下几种情况:,(1)汇编程序中访问c程序中的变量和函数。 (2)c程序中访问汇编程序中的变量 (3)在线汇编,3.汇编语言程序调用C程序的原则,为了使C函数对汇编语言程序可见,汇编语言程序需要对所调用的C语言函数、变量用关键字EXTERN进行说明,形式如下: EXTERN 被调用函数名函数属 EXTERN 变量名变量属性,4.嵌入汇编语言的格式,C+语言是C语言的超集,它是在C语言的基础上扩展形成的面向对象程序设计语言。微软Visual C+ 5.06.0则是Windows 9.x平台上广泛应用的开发系统。本节以Visual C+ 5.06.0为例,说明32位Windows 9.x环境下汇编语言与C+的混合编程。它也分为嵌入汇编和模块调用两种方式。 Visual C+直接支持嵌入汇编方式,不需要独立的汇编系统和另外的连接步骤。所以,嵌入式汇编比模块连接方式更简单方便。Visual C+的嵌入汇编方式与其他CC+编译系统的基本原理是一样的,当然有些细节的差别。嵌入汇编指令采用_asm关键字( 注意,_asm前是两个下划线;但Visual C+ 5.06.0也支持一个下划线的格式_asm,目的是与以前版本保持兼容)。,5.1指令系统的发展与性能要求,指令系统决定了计算机的基本功能,指令系统的设计是计算机系统设计的一个核心问题。它不仅与计算机的硬件设计紧密相关,而且直接影响到系统软件设计的难易程度。 完善的计算机的指令系统应具备: 1、完备性:一台计算机中最基本的、必不可少的指令构成了指令系统的完备性。 2、有效性:指利用该指令系统所提供的指令编制的程序能够产生高效率。高效率主要表现在空间和时间方面,即占用存储空间小、执行速度快。 3、规整性:指令操作的对称性和匀齐性,指令格式与数据格式的一致性。 (1)对称性:在指令系统中,所有寄存器和存储单元都可同等对待,这对简化程序设计,提高程序的可读性非常有用。 (2)匀齐性:是指一种操作性质的指令可以支持各种数据类型。 (3)指令的格式与数据格式的一致性:指令长度与数据长度有一定关系,以方便存取和处理。 4、兼容性:兼容性一般是指计算机的体系结构设计基本相同,机器之间具有相同的基本结构、数据表示和共同的基本指令集合。,程序、指令、指令系统、指令格式,计算机的程序是由一系列的指令组成 指令是要计算机执行某种操作的命令 指令系统是一台计算机中所有指令的集合 决定计算机的基本功能,软件与硬件的界面 是计算机系统设计的一个核心问题 指令格式是用二进制代码表示的指令形式 由操作码字段和地址码字段组成 操作码:表示指令进行什么性质的操作 地址码:指定参与操作的操作数地址,指令格式,计算机的指令格式与机器的字长、存储器的容量及指令的功能密切相关 两个字段:操作码字段+操作数地址字段: 1.操作码 操作码是指明指令操作性质的命令码。它提供指令的操作控制信息。 (1)每条指令都要求它的操作码必须是独一无二的位组合。 (2)指令系统中指令的个数N与操作码的位数n,必须满足关系式: N2n 2.操作数地址码 (1)地址码:用来描述该指令的操作对象。 (2)指令字长=操作码的位数+(操作数地址个数)*(操作数地址码位数),地址码,三地址指令,二地址指令,单地址指令,零地址指令,指令操作码与地址码,指令格式设计准则 1、指令字长要短,以得到时间和空间上的优势。 2、指令字长必须有足够的长度。 3、指令字长一般应是机器字符长度的整数倍以便存储系统的管理。若机器中字符码长是L位,则机器字长最好是L,2L,4L,8L等。 4、指令格式的设计还与如何选定指令中操作数地址的位数有关。 例如,对同一容量(如64KB)的存储器 (1)若取存储单元为一字节长,则需要16位地址码, (2)若存储单元长度为32位,则只需14位地址码。 方案(1)对字符操作方便,但地址码位数多, 方案(2)地址码位数少,很有利,但字符操作困难,分辩率低。,指令字长与扩展方法,一、操作码和地址码间的权衡(操作码有两种编码格式) 1、固定格式:操作码长度固定,且集中放在指令字的一个字段中。 2、可变格式:即操作码长度可变,且分散地放在指令字的不同字段中。 二、扩展操作码 1、要点: (1)操作码位数随地址码个数变化采取可变长度的类型; (2)指令间指令码一定不重复; (3)根据需要灵活变通。,指令字长与扩展方法,2、比较 假设一台计算机指令字长16位,操作码与地址码都为4位,如图所示。 (1)方法一:固定格式,则最多可以设计16条三地址指令,指令字长与扩展方法,(2)方法二:扩展操作码,具体方法如下: A、4位OC中用0000-1110定义15条三地址指令,留编码1111作为扩展标志与下一个4位组成一个8位操作码,引出二地址指令,则: B、(a)若将AC1全部用作2地址指令的OC,能再定义16条2地址指令; (b)8位OC中用11110000-11111110定义15条二地址指令,剩下的一个编码11111111与下一个4位组成一个12位的操作码,引出一地址指令; (c)选1111000011111101共14条2地址指令,留11111110,11111111为扩展标志,再与AC2组合,以此类推。 C、若选B(c),则可定义31条1地址指令,留一个编码111111111111为扩展标志,与下一个4位组成16位操作码,引出16条零地址指令;,例1,某指令系统指令字长20位,具有双操作数、单操作数和无操作数3种指令格式,每个操作数的地址规定为6位,问这三种指令的和最大值是多少?,例2,若机器字长36位,采用三地址格式访存指令,共完成54种操作,操作数可以在1K的地址范围寻址,画出指令格式。,例1 分析指令格式的特点,单字长二地址指令 操作码字段OP长度为7位,可指定128条指令 源寄存器和目标寄存器都是通用寄存器(可分别指定16个)。两个操作数均在寄存器中,所以是寄存器寄存器型指令 这种指令结构常用于算术逻辑运算类指令,例2 分析指令格式的特点,双字长二地址指令,用于访问存储器 操作码字段OP为6位,可以指定64种操作 一个操作数在源寄存器(共16个),另一个操作数在存储器中(由变址寄存器和位移量决定),所以是寄存器存储器型指令,5.3 指令和数据的寻址方式,某个操作数或某条指令存放在某个存储单元时,其存储单元的编号,就是该操作数或指令在存储器中的地址 寻址方式:形成指令或操作数的内存地址的方式,或者说查找指令或数据的方式 寻址方式的类别 指令寻址方式:用于形成指令在内存中的地址 数据(操作数)寻址方式:用于形成操作数在内存中的地址,一般也包括数据在寄存器的情况,指令的顺序寻址方式,指令的跳跃寻址方式(程序的控制转移),指令的相对寻址方式,程序计数器PC的内容加上偏移量形成指令的目的地址,5.3.2 操作数寻址方式,指令中操作数字段的地址码,是由形式地址(偏移量)和变址、间址等组合形成 操作数的寻址:把操作数的形式地址,根据间址和变址等组合变换为操作数有效地址的过程,常用数据寻址方式,隐含寻

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论