收藏 分享(赏)

3.1 汇编语言概述3.2 汇编语言程序结构与语句格式3.3 伪指令.ppt

上传人:Facebook 文档编号:9627381 上传时间:2019-08-19 格式:PPT 页数:140 大小:579.50KB
下载 相关 举报
3.1 汇编语言概述3.2 汇编语言程序结构与语句格式3.3 伪指令.ppt_第1页
第1页 / 共140页
3.1 汇编语言概述3.2 汇编语言程序结构与语句格式3.3 伪指令.ppt_第2页
第2页 / 共140页
3.1 汇编语言概述3.2 汇编语言程序结构与语句格式3.3 伪指令.ppt_第3页
第3页 / 共140页
3.1 汇编语言概述3.2 汇编语言程序结构与语句格式3.3 伪指令.ppt_第4页
第4页 / 共140页
3.1 汇编语言概述3.2 汇编语言程序结构与语句格式3.3 伪指令.ppt_第5页
第5页 / 共140页
点击查看更多>>
资源描述

1、3.1 汇编语言概述 3.2 汇编语言程序结构与语句格式 3.3 伪指令语句 3.4 汇编语言程序设计基础 3.5 模块化程序设计技术,第三章 汇编语言程序设计入门,2,3.1 汇编语言概述,特点: 一种介于机器语言和高级语言之间的计算机编程语言;用助记符代替机器语言指令的二进制代码。,用途:主要用于一些对内存容量和速度要求比较高的编程场合,如:系统软件、实时控制软件、I/O接口驱动程序等。,3.2 汇编语言程序结构与语句格式,DATA SEGMENTBLOCK DB 12H,23H,87H,98H,55HPLUS_DATA DB 5 DUP (?)MINUS_DATA DB 5 DUP(?)

2、 DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS DATAMOV BX,OFFSET MINUS DATAMOV CX,5,GOON:LODSB TEST AL,80H JNZ MINUS STOSB JMP AGAIN MINUS:XCHG BX,DI STOSB XCHG BX,DI AGAIN:DEC CX JNZ GOONMOV AH,4CHINT 21HCODE ENDSEND START,一个简单的例子:,5,3

3、.2.1 源程序结构,汇编语言源程序结构特点:,6,3.2.1 源程序结构,指令语句-可执行语句,汇编时译成目标码;,空行语句-为保持程序书写清晰,仅包含回车 换行符的语句行。,注释语句-以“;”开始的说明性语句,只起注释作用;,宏指令语句-实际上是一个指令序列,汇编时产生对应的目标代码序列;,伪指令语句-CPU不执行的语句,汇编时给汇 编程序提供汇编信息,不产生目标代码;,各语句可以是:,.486 DATA SEGMENT USE16/USE32 ;定义数据段 (数据定义伪指令序列) DATA ENDS STACK SEGMENT USE16/USE32STACK ;定义堆栈段 (数据定义伪

4、指令序列) STACK ENDS CODE SEGMENT USE16/USE32 ;定义代码段ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATA ;段寄存器说明 START: MOV AX,DATA ;建立数据段和附加数据段的可寻址性MOV DS,AX ;置DS和ES初值MOV ES,AX (核心程序段)MOV AH,4CH ;返回操作系统INT 21H CODE ENDSEND START ;程序结束,一个标准的、以MASM为基础的单模块汇编语言源程序的结构形式:,3.2.1 源程序结构,7,8,由该标准源程序框架可看出:,1. 80X86汇编语言源程序一般具有

5、数据段、附加数据段、堆栈段和代码段。,3.2.1 源程序结构,实际中,只有代码段必不可少;其它段可以没有;每种逻辑段分别允许定义多个;最多允许同时定义6个段。,9,2.必须用段寄存器说明伪指令ASSUME说明各段寄存器与逻辑段的关系;3.定义的数据段寄存器均要在程序代码段的起始处赋初值,以建立这些逻辑段的可寻址性;4.每个源程序在其代码段中都必须含有返回到DOS操作系统的指令语句。,3.2.1 源程序结构,10,采用DOS 4CH号功能调用 将主程序定义为远过程 利用20号软中断调用 利用DOS的0号功能调用,终止当前程序,使其正确返回DOS状态的方法通常有以下4种:,3.2.1 源程序结构,

6、11,1)采用DOS 4CH号功能调用;,这是返回DOS最有效且兼容性最好的一种方法。,MOV AH,4CH ;功能号4CHAH INT 21H ;中断调用,这种方法在代码段结束前加调用语句:,返回DOS状态的方法:采用DOS 4CH号功能调用 将主程序定义为远过程 利用20号软中断调用 利用DOS的0号功能调用,3.2.1 源程序结构,12,CODE SEGMENTASSUME 主过程名 PROC FARPUSH DSMOV AX,0PUSH AXRET 主过程名 ENDPEND 主过程名,一般也称之为“标准序“方法。,2)将主程序定义为远过程,这种方法在代码段开始处按下述方式定义主程序:,

7、返回DOS状态的方法:采用DOS 4CH号功能调用 将主程序定义为远过程 利用20号软中断调用 利用DOS的0号功能调用,3.2.1 源程序结构,标准序,13,3)利用20号软中断调用,这种方式在产生扩展名为.EXE的可执行文件中是不能使用的,但可用于小模式的扩展名为.COM的可执行文件中,作为返回DOS的一种方法。,调用方式:INT 20H,返回DOS状态的方法:采用DOS 4CH号功能调用 将主程序定义为远过程 利用20号软中断调用 利用DOS的0号功能调用,3.2.1 源程序结构,14,4)利用DOS的0号功能调用,该方式也是只有在.COM格式的可执行文件中才可使用。,调用方式: MOV

8、 AH,0 INT 21H,返回DOS状态的方法:采用DOS 4CH号功能调用 将主程序定义为远过程 利用20号软中断调用 利用DOS的0号功能调用,3.2.1 源程序结构,15,3.2.2 语句格式,只介绍指令语句和伪指令语句格式。,均由4部分(又称4个域)组成:,指令语句: 标号:助记符操作数;注释,伪指令语句:名字 定义符操作数;注释,常量 寄存器 存储器 表达式,标号、变量:段值、偏移值、类型三种属性 表达式:数字表达式、地址表达式,16,3.2.2 语句格式,1.标号和名字,标号和名字分别是给指令单元和伪指令起的符号名称,统称为标识符。,标号指出了指令的起始地址,程序员可通过标号来引

9、用所标识的指令;而伪指令语句中的名字一般用作定义变量名、结构名、记录名等,而不作为跳转、调用指令的操作数使用。,标号可以任选或省略,而名字则具体取决于汇编语言中实际规定的定义符。,17,字母AZ或az(汇编程序不区分大、小写);,注意:标号不允许用数字开头,也不允许用特殊 符号单独作为标识符,更不允许用汇编 语言中有特定意义的保留字作为标识符。,特殊符号 $ _ . : ? ( ) ; / + - * % &等。,数字09;,标号和名字均可由不超过31个的字符串组成,可选字符集为:,3.2.2 语句格式,18,2.助记符和定义符,助记符和定义符分别用于规定指令语句的操作性质和伪指令语句的伪操作

10、功能,故统称为操作符。,指令语句的助记符前面,还可根据需要加“前缀“。,3.2.2 语句格式,19,1)常量操作数:二、八、十或十六进制的整型常数、十六进制实数、字符串(必须用单引号括起来,其值为字符的ASCII码值)、已赋值的常数标识符、寄存器名和I/O端口地址等。,3.操作数(参数),助记符和定义符均可后跟一个或多个操作数,作为操作处理的对象,各操作数之间用“,”分隔开。,根据寻址方式等因素的不同,操作数可分为4类:,常量、寄存器、存储器、表达式,3.2.2 语句格式,20,段值-段基址,可用SEG运算符求得。 偏移值-段内偏移地址,可用OFFSET运算符求得。类型-对变量有字节、字、双字

11、、四字、十字节等五种类 型;对标号有NEAR和FAR两种类型。可用TYPE运算 符求得。,2)存储器操作数,3.2.2 语句格式,21,它由各种操作数、界限符和运算符组成;汇编时,每个表达式都能产生一个确定的值。MASM汇编程序支持的运算符表见教材。,3)表达式操作数,不同的运算符具有不同的优先级,优先级相同的运算符操作顺序为先左后右。,注意:有些运算符与指令的名字相同,但他们与指令有本质区别,指令是在程序运行时执行的语句,而运算符是在汇编时由汇编程序完成其功能的。,3.2.2 语句格式,22,1 LENGTH,SIZE,WIDTH,MASK,( ), , 2 PTR,OFFSET,SEG,T

12、YPE,THIS 3 HIGH,LOW 4 +,-(单目) 5 *,/,MOD,SHL,SHR 6 +,-(双目) 7 EQ,NE,LT,LE,GT,GE 8 NOT 9 AND 10 OR,XOR 11 SHORT,运算符的优先级,3.2.2 语句格式,23,注释部分以分号“;”开始,其作用与注 释语句相同,用于对语句的功能加以说明, 增加程序的可读性,本身不被汇编程序汇编 也不被执行。,4.注释,3.2.2 语句格式,3.3 伪指令语句,程序结构伪指令语句符号/数据/标号伪指令语句结构性数据伪指令语句过程和宏定义伪指令语句条件汇编伪指令语句列表伪指令语句,25,3.3.1 程序结构伪指令语

13、句,1. 方式选择伪指令 2. 逻辑段定义伪指令 3. 指定地址伪指令 4. 模块定义伪指令 5. 模块连接伪指令,-用于说明CPU的类型、段结构、源程序(或 模块)起止信息和段内存的安排等。,3.3.1 程序结构伪指令语句,1.方式选择伪指令,伪指令格式 功 能 .8086 是默认方式。他告诉汇编程序只接受8086/8088指令 .286/.286C 告诉汇编程序只接受8086/8088及80286非保护方式(即实地址方式)下的指令。用.8086可删除该伪指令 .286P 允许汇编程序接受8086/8088及80286的所有指令(包括保护 方式和非保护方式下的指令)。该伪指令一般只有系统程序

14、员使用,并 可用.8086伪指令删除 .386/.386C 允许汇编8086/8088及非保护方式下的80286/80386指令。与.286/.286C类似,在此方式下将禁止所有保护方式下的指令出现,否则出错。可用.8086删除 .386P 除具有.386/.386C功能外,还允许汇编保护方式下的80286/80386指令。一般只有系统程序员使用,并可用.8086伪指令删除,26,27,方式选择伪指令(续表),3.3.1 程序结构伪指令语句,伪指令格式 功 能 .8087 选8087指令集,并指定实数的二进制码为IEEE格式 .287 选80287指令集,并指定实数的二进制码为IEEE格式 .

15、387 选80387指令集,并指定实数的二进制码为IEEE格式 .486/.486C 与.386/.386C类似,允许汇编80486非保护方式下的指令。MASM6.0可用 .486P 与.386P类似,允许汇编80486的全部指令。MASM6.0可用,28,2.逻辑段定义伪指令,1)完整段定义伪指令(适用于MASM任何版本),段定义语句(SEGMENT/END),功能:指出段名及段的各种属性,并表示段 的开始和结束位置(地址)。,3.3.1 程序结构伪指令语句,定位类型,3.3.1 程序结构伪指令语句,29,组合类型:告诉LINK程序本段与其它模块中同名段的组 合连接关系。此属性缺省,表示段是

16、独立的。,3.3.1 程序结构伪指令语句,30,3.3.1 程序结构伪指令语句,31,32,字长选择:用于定义段中使用的偏移地址和寄 存器的字长。只用于设置含有.386 和.486语句的段。,有两种字长选择:,USE16-该段字长为16位,按16位方式寻址, 最大段长为64KB,USE32-该段字长为32位,按32位方式寻址, 最大段长为4GB,字长选择缺省,则在使用.386/.486伪指令 时默认为USE32。,类别:用于控制段的存放次序,此项缺省则表 明该段类别为空。,3.3.1 程序结构伪指令语句,33,段寄存器说明语句(ASSUME),格式:ASSUME 段寄存器:段名/组名,段寄存

17、器:段名/组名,,功能:说明源程序中定义的段或组由哪个段寄存 器去寻址。,说明:,3.3.1 程序结构伪指令语句,34,组定义语句(GROUP),格式:组名 GROUP 段名,段名,,功能:将GROUP定义符后指定的所有段分配在一个64K字 节的物理段中,并赋予该段一个名字-组名。,说明:,组名是指出组的始址的一种符号,必须唯一,不能与任何标号、段名及变量等同名。,组定义语句不影响各段的次序,故组内各段不一定连续存放,但都必须包含在64KB中。,本语句可使定义在源程序中不同类型的段运行时共用同一个段寄存器,但这些段仍为独立的段。,当源程序结构需要多个逻辑段时,使用本语句可节省段寄存器的使用,实

18、际中最好代码段为一组,堆栈段为一组,数据段为一组或两组。,3.3.1 程序结构伪指令语句,35,2)简化段定义伪指令(适用于MASM5.0以上版本), 段次序语句(DOSSEG),格式:DOSSEG,功能:各段在内存的顺序按DOS段次序约定排列。,说明:本语句用于主模块前面,其它模块不必使用。,3.3.1 程序结构伪指令语句,36,内存模式语句(.MODEL),格式:.MODEL 模式类型,高级语言,功能:指定数据和代码允许使用的长度,高级语言是可选项,可使用C、BASIC、FORTRAN等关键字来指定与哪种高级程序设计语言接口,还可用关键字OS_OS2或OS_DOS告诉MASM使用的是哪种操

19、作系统。程序中凡数据或代码的长度不大于64KB时为近程,否则为远程。,本语句一般放在用户程序中其它简化段定义语句前。,当独立的汇编语言程序不与高级语言程序连接时,多数情况下只用小模式即可,而且小模式的效率也最高。,说明:,3.3.1 程序结构伪指令语句,内存模式类型,3.3.1 程序结构伪指令语句,37,3.3.1 程序结构伪指令语句,38,39,3.3.1 程序结构伪指令语句,.MODEL SMALL .STACK 100H ; 定义堆栈段及其大小 .DATA ; 定义数据段. . . .CODE ; 定义代码段 START: ; 起始执行地址标号 MOV AX, DATA ; 数据段地址

20、MOV DS, AX ; 存入数据段寄存器 . . . MOV AX, 4C00H INT 21H END START ; 程序结束,40,3.指定地址伪指令(ORG),功能:该伪指令以其指定的偏移地址或由$给出 的当前地址加上指定的偏移地址作为当前 开始分配和使用的偏移地址。,说明:该伪指令语句不占内存,它指定下一个占 内存语句的偏移地址。偏移地址可写成表 达式形式,但其取值范围在065535之间, 通常不必使用该语句,只在需要指定存储 空间或保留一段存储空间时才使用它。该 语句不能使用标号,否则语句无效。,3.3.1 程序结构伪指令语句,41,3.3.1 程序结构伪指令语句,地址计数器 汇

21、编语言允许用户直接用来引用地址计数器的值,例如指令: JMP + 6 它的转向地址是JMP指令的首地址加上6。当用在指令中时,它表示本条指令的第一个字节的地址。在这里,+ 6必须是另一条指令的首地址。否则,汇编程序将指示出错信息。 当用在伪指令的参数字段时,则和它用在指令中的情况不同,它所表示的是地址计数器的当前值。例如指令: ARRAY DW 1, 2, + 4, 3, 4, + 4,42,4.模块定义伪指令,汇编源程序可由多个模块组成,每个模块是一个独立的汇编单位。,1)模块开始语句(NAME),格式:NAME 模块名,功能:表示源程序开始并指出模块名,说明:本语句一般可省略,2)模块结束

22、语句(END),格式:END 标号/过程名,功能:表示源程序到此结束,并可指 出程序的启动地址,说明:一个源程序必须有且只能有一个END 语句来指出源程序文件的结束。,3.3.1 程序结构伪指令语句,43,5.模块连接伪指令(外部引用伪指令),-解决多模块连接问题,实现多模块之间数据和过程的共享,1)全局符说明语句(PUBLIC),格式:PUBLIC 符号名1,符号名2,功能:将本文件中定义的符号名说明为全局符号, 允许程序中其它模块使用。,2)外部符说明语句(EXTRN),格式:EXTRN 符号名1:类型,符号名2:类型,功能:本语句中指定的符号名是在其它模块中用 PUBLIC伪指令语句定义

23、过的。,3.3.1 程序结构伪指令语句,43,44,3)包含语句(INCLUDE),格式:INCLUDE 文件名,功能:将指定文件的内容完整地插入到本语 句出现的位置。,4)公用符号说明语句(COMM),格式:COMMNEAR/FAR 符号名:尺寸:元素数,功能:将语句中的符号名说明为公用符号,公用符 号既是全局的又是外部非初始化的。,3.3.1 程序结构伪指令语句,45,3.3.2 符号/数据/标号伪指令语句,1.符号定义伪指令,功能:与EQU语句的功能相同,只是其符 号名可以再定义。,格式:符号名表达式,2)等号语句(),说明:EQU语句不能重新定义,使用时必 须先赋值。,格式:符号名 E

24、QU 表达式,功能:用符号名代替表达式的值,供以 后引用。,1)等值语句(EQU),EQU还可给表达式赋予一个名字,EQU的用法举例如下: DATA EQU HEIGHT + 12 ALPHA EQU 7 BETA EQU ALPHA-2 ADDR EQU VAR + BETA B EQU BP + 8 P8 EQU DS:BP + 8,注意:在EQU语句的表达式中,如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。如上例,ALPHA必须在BETA之前定义,否则汇编程序将指示出错。,例如, TMP EQU 5 TMP EQU TMP+1,TMP = 5 TMP = TMP+1,47,

25、3.3.2 符号/数据/标号伪指令语句,与数据项相联系的符号名称为变量。变量有三个属性:,2.数据定义伪指令,格式:符号名 DB/DW/DD/DF/DQ/DT 初值序列,功能:为数据项分配一个或多个字节/字/双字/长字/ 四字/十字节的存储空间,给它们赋初值,并 用一个符号名与之相联系。,数据类型字节/字/双字/长字/四字/十字节 偏移量 段基址,说明:,48,确定数可以是整数、浮点数(只允许DD、DQ和DT伪指令,并只用于80486和80387/80287协处理器上)、字符、字符串或表达式。,初值序列可以是一个元素,也可以是用逗号分隔的多个元素,还可以是用DUP运算符建立单个值的多次拷贝。,

26、给变量赋初值可以赋确定的值,也可以赋不确定的值(用“?“表示)。赋不确定值实质是不赋值,而只预留规定长度的存储空间。,3.3.2 符号/数据/标号伪指令语句,49,说明:LABEL伪指令提供了另一种定义标号或变量名 的方法,但它并不为符号名分配存储空间。,3.标号定义伪指令(LABEL),格式:符号名 LABEL 类型,功能:将紧跟在本伪指令语句后的标号、操作码、过程或变量建立新的符号名,并刷新其类型属性。对标号、操作码或过程,其类型为NEAR、FAR;对变量,其类型为BYTE、WORD、 DWORD、FWORD、 QWORD或TBYTE。,3.3.2 符号/数据/标号伪指令语句,例如: BY

27、TE_ARRAY LABEL BYTE WORD_ARRAY DW 50 DUP (?),在50个字数组中的第一个字节的地址赋予两个不同类型的变量名:字节类型的变量BYTE_ARRAY和字类型变量WORD_ARRAY,在程序中访问数组单元时,要按指令类型来选择变量,如下面两条指令:,MOV WORD_ARRAY + 2,0 ; 字指令, ; 把该数组的第3个和第4个字节置0 MOV BYTE_ARRAY + 2,0 ; 字节指令, ; 把该数组的第3个字节置0,51,说明:保留字STRUC与ENDS是系统规定的,而结构 名和结构体中的域名及长度、类型是由用 户定义的。结构是多字节自定义数据结构

28、, 其最小域为字节,最大长度不限,可放在 数据段前面。,3.3.3 结构性数据伪指令语句,1.结构定义伪指令,1)结构类型说明语句(STRUC/ENDS),功能:定义一个结构的模板,但不真正给结构分 配存储空间,只是说明结构的类型。,52,3.3.3 结构性数据伪指令语句,2)结构变量说明与赋初值语句,说明:,变量名是用户自定的,为任选项,省略它,汇编程序照样分配存储空间;结构名一定是曾用STRUC/ENDS伪指令定义过的;域值表用于给结构变量的各域赋初值,这些初值的类型、顺序必须与结构类型说明时的各域的类型、顺序一致,各初值间以逗号分隔。,如果某域的初值与结构类型说明时的相同,则相应位置可为

29、空,但逗号不能省;若所有域的初值都采用结构类型说明时的初值,则域值表可省略,只写一个尖括号“即可。,53,2.记录定义伪指令,记录与结构相似,但结构用于处理按字节计算的数据信息集合,而记录则用于处理按二进制位计算的数据信息集合。记录可用于定义一个字节、字或双字的记录变量集合,在这些集合中,同一字节、字或双字的不同位可能代表不同的意义。,3.3.3 结构性数据伪指令语句,54,说明:与结构变量说明和赋值语句相似。需特别说明 的是,域值表为可选项,如省略时,其值为0。,2)记录变量说明与赋初值语句,格式:记录变量名 记录名 域值表,功能:定义一个记录变量,并分配存储空间和赋初值。,1)记录类型说明

30、语句(RECORD),说明:记录名和位域名为用户自定的,但不能与其 它名相同;域宽表示相应位域的位数,必须 是常数;表达式为任选项,若被选,则表示 相应位域的初值,否则初值为0。,功能:定义位域集合的模板,但不实际分配存储空 间。定义后可通过位域名单独访问。,格式:记录名 RECORD 位域名:域宽=表达式,3.3.3 结构性数据伪指令语句,55,域 DB ? 域 DW ? 域 BD ? . . . 联合名ENDS,3.联合定义伪指令(MASM6.0新增),-实质上是STRUC定义的一个补充,它与结构可 同时使用,还可嵌套。,1)联合类型说明语句(UNION/ENDS),格式:联合名 UNIO

31、N,说明:联合名和域由用户定义。每个域用一 条数据伪指令定义,一般不应有初值。,功能:定义一个联合的结构模块。,联合体由数据定义语句构成,3.3.3 结构性数据伪指令语句,56,说明: 联合变量及域值表的说明与结构变量的一 样,赋值规定也一致,联合和结构均可以 嵌套,既可自身嵌套,又可相互嵌套。,2)联合变量说明与赋初值语句,格式: 变量名 联合名 域值表,功能: 定义一个联合变量,分配存储空间并给 它的各域变量赋初值。,3.3.3 结构性数据伪指令语句,57,3.3.4过程和宏定义伪指令语句,过程是一种可由其他程序用CALL指令调用的程序,相当于高级语言程序中的子程序。,功能: 定义一个过程

32、(子程序)。,格式:过程名 PROC 属性;过程开始 ; 过程体RET RET过程名 ENDP ; 过程结束,1.过程定义伪指令,58,3.3.4 过程和宏定义伪指令语句,过程名是过程的标识符。,过程可以嵌套,嵌套的深度只受堆栈的限制;过程和段也可以嵌套,但不能交叉嵌套,也不能交叉覆盖。,PROC/ENDP必须成对出现。ENDP指示过程结束,但不会产生HLT或RET指令。,RET为返回指令,是过程的出口点,但不一定是过程的最后一条指令。一个过程可以有多 条RET指令,至少要执行到一条RET指令。,过程的属性可以是NEAR或FAR。NEAR类型为近, 即可在段内使用;FAR类型为远,可跨段调用。

33、缺省时为NEAR(近)。,说明:,59,格式:宏名 MACRO 形式参数表;宏体ENDM ;宏定义结束,2.宏定义伪指令,功能:定义一个宏。,宏的概念与过程很相似。,. . .,3.3.4 过程和宏定义伪指令语句,60,宏经定义后,在程序中就可以通过宏名对它进行任意次的调用,但宏定义必须放在第一条调用它的指令之前。,说明:,宏名必须是唯一的,在其后面的源程序中, 可通过该名字来调用宏。,形式参数表是用逗号(或空格、或制表符)分隔成一个或多个形式参数,它是可选项。当 调用宏时,需用对应的实际参数去取代,以实现向宏中传递信息。,宏体可以是汇编语言所允许的任意指令和伪 指令语句序列,它决定了宏的功能

34、。宏可以嵌套。,3.3.4 过程和宏定义伪指令语句,例:用宏指令定义两个字操作数相乘,得到一个16位的第三个操作数作为结果,MULTIPLY MACRO OPR1,OPR2,RESULT PUSH DX ;保存DX原值 PUSH AX ;保存AX原值 MOV AX, OPR1 ;取第一个操作数,存在AX中 IMUL OPR2 ;与第二个操作数相乘 MOV RESULT, AX ;结果存入结果变量中 POP AX ;恢复AX原值POP DX ;恢复DX原值 ENDM,宏调用:MULTIPLY CX, VAR, XYZBX ;第一次宏调用 MULTIPLY 240, BX, SAVE ;第二次宏调

35、用,宏展开: 1 PUSH DX 1 PUSH AX 1 MOV AX,CX ;第一个操作数在CX中 1 IMUL VAR ;第二个操作数是变量VAR 1 MOV XYZBX, AX ;结果存入实参XYZBX 1 POP AX 1 POP DX . . 1 PUSH DX 1 PUSH AX 1 MOV AX,240 ;第一个操作数是立即数240 1 IMUL BX ;第二个操作数在BX中 1 MOV SAVE, AX ;结果存入变量SAVE 1 POP AX 1 POP DX,63,因此适用场合不同:当程序执行速度比内存容量更重要时,或者要调用的程序段较短且调用的次数不太频繁时,适于选用宏调

36、用技术,反之则宜用过程调用。,3.宏和过程的比较,共性: 都能简化源程序,3.3.4 过程和宏定义伪指令语句,64,使用条件汇编语句可使一个源文件产生不同的源程序。为说明性语句,其功能由汇编程序实现。有多种条件汇编语句。,3.3.5 条件汇编伪指令语句,功能:当条件为真时执行汇编语句序列1, 否则执行汇编语句序列2。,3.3.5 条件汇编伪指令语句,65,66,交叉参考列表文件按字母顺序列出源程序中所用的符号清单及其使用情况,并给出它们在程序中使用的地方(行号)。,3.3.6 列表伪指令语句,汇编程序在对源程序进行汇编时,除可产生目标代码程序(.OBJ)外,还可产生一个列表文件(.LST)和一

37、个交叉参考列表文件(.CRE),它们均能被显示或打印,便于程序调试。,列表文件以源程序指令与其相应目标程序指令相对照的形式给出汇编结果,并随后给出程序中所用符号的符号表。,列表伪指令就是用来控制上述两种文件的输出格式和方式的,具体格式及功能见教材。,程序设计一般步骤 程序处理过程 程序设计基本方法 子程序设计与调用技术,3.4 汇编语言程序设计基础,68,3.4.1 程序设计一般步骤,5.编程与调试。,1.分析问题,抽象出描述问题的数学模型;,2.确定解决问题的算法;,3.画出程序流程图;,4.分配内存工作单元和寄存器;,3.4.2 程序处理过程,70,3.4.3 程序设计基本方法,1. 顺序

38、结构 2. 分支结构 3. 循环结构,程序的基本结构形式:,71,1.顺序结构程序设计,顺序结构程序特点:无分支、无循环、也无转移,只按直线作顺序执行。所以又称为直线结构程序。,例:把非压缩十进制数DAT1转换为压缩十进制数。,DOSSEG.MODEL SMALL.STACK 200H.DATADAT1 DW 0506H.CODESTART: MOV AX,DATAMOV DS,AXMOV AX,DAT1 ;(AX)=0506HMOV CL,4 ;(CL)=4,3.4.3 程序设计基本方法,72,SAL AH,CL ;(AH)=05H字节左移4位后值;(50H) ROL AX,CL ;(AX)

39、=5006H字循环左移4位;后值(0065H)ROL AL,CL ;(AL)=65H字节循环左移4位;后值(56H) MOV BYTE PTR DAT1,AL ;(DAT1)=56HMOV AH,4CHINT 21HEND START,3.4.3 程序设计基本方法,73,2.分支结构程序设计,分支程序的结构形式通常有三种:,3.4.3 程序设计基本方法,74,实现分支结构的基本方法:,利用比较与条件转移指令实现分支利用跳转表实现分支,75,1)利用比较与条件转移指令实现分支,例:实现符号函数:,3.4.3 程序设计基本方法,一般在分支较少时使用,76,DATA SEGMENTXX DB X ;

40、X值存于XX单元YY DB ? ;YY单元留作存放函数Y的值DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AL,XXCMP AL,0 JGE BIGRMOV AL,0FFH,3.4.3 程序设计基本方法,77,MOV YY,AL ;X0时,1YYHLT EQUT: MOV YY,AL ;X=0时,0YYHLT CODE ENDSEND START,3.4.3 程序设计基本方法,78,2)利用跳转表实现分支,跳转表实际上是内存中的一段连续单元。根据表中存放的内容性质不同,利用跳转表 实现分支又可

41、分为三种情况:,3.4.3 程序设计基本方法,适于分支较多时用,79,当各分支程序均属近程跳转时, 跳转表中装入的是各分支程序的 入口偏移地址。当属远程跳转时,跳转表内 装入的则应是各分支的完整入口 地址,即段基址和偏移地址。,根据表内地址分支,跳转表内连续存放的是一系列跳转地址,80,根据表内指令分支:,3.4.3 程序设计基本方法,跳转表中连续存放的是主程序转向各分支程序的转移指令代码。,81,根据关键字分支:,3.4.3 程序设计基本方法,跳转表内连续存放的是各分支程序对应的“关键字、入口地址”等数据。,82,例:设某控制程序可完成8种产品的加工,每种加工程序对应一个数字(18)。现要求

42、根据输入的值去加工相应产品。假设8种加工程序段与主程序在同一代码段中(近转移)。,.486 DATA SEGMENT USE16 DATA BASE DD SBR1,SBR2,SBR8 ;跳转表,表中为各分支入口地;址(32位) DATA ENDS CODE SEGMENT USE16 CODEASSUME CS:CODE,DS:DATA,3.4.3 程序设计基本方法,83,START: MOV AX,DATAMOV DS,AXMOV AH,1INT 21H ;读入一个字符CMP AL,1JB ERR ;小于1,转出错处理CMP AL,8JA ERR ;大于8,转出错处理AND EAX,000

43、0000FH ;将ASCII码转换为数字DEC EAX,JMP BASEEAX*4 ;利用比例因子寻址 SBR1: SBR2: SBR8: ERR: CODE ENDSEND START,3.4.3 程序设计基本方法,84,3.循环结构程序设计,一般由四部分组成:,3.4.3 程序设计基本方法,85,循环程序的基本结构形式有两种:,先判断后执行结构(WHILE结构),特点 ?,先执行后判断结构(DO-UNTIL结构),3.4.3 程序设计基本方法,86,循环控制方式通常有4种:,计数控制-事先已知循环次数,每循环一次加/减1。,条件控制-事先不知循环次数,根据条件真 假控制循环。,状态控制-根

44、据事先设置或实时检测的状态来控制循环。,逻辑尺控制-当循环条件不规则时,可通过建立位串(逻辑尺)来控制循环。,3.4.3 程序设计基本方法,例:某采集系统采集了12个参数值存于BUFFER起始的缓冲区中,预处理时要求对第1、2、5、7、10个参数值调用函数1(Y=2X)处理,对第3、4、6、8、9、11、12个参数值调用函数2(Y=4X)处理。,.DATA BUFFER DW 11,22,33,44,55,66,77,88,99,1234,5678,9876 BLOCK DW 12 DUP(?) ;Yi的保留单元 COUNT EQU 12 LOGRUL EQU 0011010110110000

45、B ;前12位为逻辑尺,顺序为1、2、;、12.CODEMOV DX,LOGRUL ;逻辑尺DXMOV CX,COUNTLEA BX,BUFFER ;BX指向XiLEA SI,BLOCK ;SI指向Yi(程序接下页),3.4.3 程序设计基本方法,88,AGAIN: MOV AX,BX ;取XiRCL DX,1 ;逻辑尺左移一位CFJC ANOTH ;CF=1,转ANOTHCALL FUN1 ;CF=0,调用FUN1 NEXT: MOV SI,AX ;保存YiINC BXINC BX ;指向下一个XiINC SIINC SI ;指向下一个YiLOOP AGAIN ANOTH: CALL FUN

46、2 ;CF=1调用FUN2JMP NEXT(程序未完,下页续),3.4.3 程序设计基本方法,89,FUN1 PROC ;Y=2XADD AX,AX RET FUN1 ENDP FUN2 PROC ;Y=4XADD AX,AXADD AX,AXRET FUN2 ENDPEND,90,3.4.4 子程序设计与调用技术,4)可重定位子程序:可重定位在内存任意区域的子程序。这种子程序不采用绝对地址,全部采用相对地址。,1.与子程序有关的几个术语,1)子程序嵌套:子程序中调用其它子程序称为嵌套,2)子程序递归调用:子程序中调用该子程序本身称 为递归调用。,3)可重入子程序:可被中断并能再次被中断服务程序所调用的子程序。,91,子程序伪指令:,MAIN PROC FAR ;调用程序CALL SUBR1RET SUBR1 PROC NEAR ;过程SUBR1RET SUBR1 ENDP,92,3.4.4 子程序设计与调用技术,5)必要时还有调用实例。,2.子程序文件,子程序常以文件形式编写;子程序文件由子程序说明和子程序本身构成。,子程序说明包括:,1)功能描述(包括名称、功能、主要性能指标等);,2)所用寄存器和存储单元;,3)入口、出口参数;,4)其中调用的其它子程序;,93,3.子程序设计中的问题,1)主程序与子程序的接口应注意两点:,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报