《第3章汇编语言及编程优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第3章汇编语言及编程优秀PPT.ppt(81页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章汇编语言及编程现在学习的是第1页,共81页3.1 3.1 汇编语言程序结构与汇编语句汇编语言程序结构与汇编语句3.1.1 3.1.1 汇编语言源程序结构汇编语言源程序结构 3.1.2 3.1.2 汇编语言的语句汇编语言的语句现在学习的是第2页,共81页3.1.1 3.1.1 汇编语言源程序结构汇编语言源程序结构 80 80X86/PentiumX86/Pentium系列系列MPUMPU汇编语言都是以逻辑段汇编语言都是以逻辑段为基础,按段的概念来组织代码和数据的。因此,源为基础,按段的概念来组织代码和数据的。因此,源程序结构与逻辑段的定义方法密切相关,而宏汇编语程序结构与逻辑段的定义方法密
2、切相关,而宏汇编语言言MASM 5.0MASM 5.0以上的版本中,逻辑段既可用以上的版本中,逻辑段既可用完整段完整段定义,又可用定义,又可用简化段简化段定义。定义。现在学习的是第3页,共81页1.1.标准的单模块源程序框架标准的单模块源程序框架 .586 .586DATA SEGMENT USE16/USE32DATA SEGMENT USE16/USE32;定义数据段;定义数据段 ;数据定义伪指令序列;数据定义伪指令序列DATA ENDSDATA ENDSSTACK SEGMENT USE16/USE32 STACKSTACK SEGMENT USE16/USE32 STACK;定义堆栈段
3、;定义堆栈段 ;数据定义伪指令序列;数据定义伪指令序列STACK ENDSSTACK ENDSCODE SEGMENT USE16/USE32CODE SEGMENT USE16/USE32;定义代码段;定义代码段 ASSUME CSASSUME CS:CODECODE,SSSS:STACKSTACK,DSDS:DATADATA,ESES:DATADATASTART:MOV AXSTART:MOV AX,DATADATA;取数据段基址;取数据段基址 MOV DSMOV DS,AXAX;建立;建立DSDS的可寻址性的可寻址性 MOV ESMOV ES,AX AX;建立;建立ESES段的可寻址性段
4、的可寻址性 ;核心程序段;核心程序段 MOV AHMOV AH,4CH4CH;返回;返回DOSDOS操作系统操作系统 INT 21HINT 21HCODE ENDSCODE ENDS END STARTEND START一个源程序由若干逻辑段组成。一个源程序由若干逻辑段组成。一般一个源程序具有数据段、附加数一般一个源程序具有数据段、附加数据段、堆栈段和代码段;据段、堆栈段和代码段;但只有代码但只有代码段是必不可少的。段是必不可少的。采用完整段定义时,对程序采用完整段定义时,对程序中定义的逻辑段,要说明中定义的逻辑段,要说明逻辑逻辑段与段寄存器的寻址关系。段与段寄存器的寻址关系。ASSUME C
5、SASSUME CS:CODECODE,SSSS:STACKSTACK,DSDS:DATADATA,ESES:DATADATA对数据段对数据段(有时还有堆栈段有时还有堆栈段),程,程序中要包含序中要包含初始化段寄存器初始化段寄存器的语句。的语句。MOV AXMOV AX,DATADATAMOV DSMOV DS,AXAXMOV ESMOV ES,AXAX程序中要包含程序中要包含返返回回DOSDOS的语句。的语句。MOV AHMOV AH,4CH4CHINT 21HINT 21H源程序(模块)源程序(模块)以以ENDEND伪指令结束伪指令结束END STARTEND START3.1.1 3.1
6、.1 汇编语言源程序结构汇编语言源程序结构现在学习的是第4页,共81页3.1.1 3.1.1 汇编语言源程序结构汇编语言源程序结构(1)(1)使用使用DOSDOS的的4 4CHCH号功能调用号功能调用这种方法是在代码段结束前加调用语句:这种方法是在代码段结束前加调用语句:MOV AHMOV AH,4CH 4CH ;功能号;功能号4 4CHAHCHAH INT 21H INT 21H ;中断调用;中断调用(2)(2)使用使用2020H H号软功能调用号软功能调用调用方式是在代码段结束前加调用语句:调用方式是在代码段结束前加调用语句:INT 20HINT 20H(3)(3)使用使用DOSDOS的的
7、0 0号功能调用号功能调用调用方式是在代码段结束前加调用语句:调用方式是在代码段结束前加调用语句:MOV AHMOV AH,0 0 INT 21H INT 21H2.2.返回返回DOSDOS状态的方法状态的方法 现在学习的是第5页,共81页(4)(4)将主程序定义为远过程将主程序定义为远过程 也称为也称为“标准序标准序”方法。这种方法是在代码段开始处方法。这种方法是在代码段开始处按下述方式定义主程序:按下述方式定义主程序:CODE CODE SEGMENT SEGMENT ASSUME ASSUME 主过程名主过程名PROC FARPROC FARPUSH DS PUSH DS SUB AXS
8、UB AX,AX AX ;标准序;标准序 PUSH AXPUSH AX RET RET主过程名主过程名 ENDPENDPEND END 主过程名主过程名3.1.1 3.1.1 汇编语言源程序结构汇编语言源程序结构现在学习的是第6页,共81页指令语句指令语句伪指令语句伪指令语句宏指令语句宏指令语句3.1.2 3.1.2 汇编语言的语句汇编语言的语句 语句是汇编语言程序的基本组成单位,用于规定汇编语言的语句是汇编语言程序的基本组成单位,用于规定汇编语言的一个基本操作。汇编语言包含三种基本语句:一个基本操作。汇编语言包含三种基本语句:是是可可执执行行语语句句,由由硬硬件件(CPU)CPU)完完成成其
9、其功功能能,汇汇编编时产生目标代码时产生目标代码 。不可执行语句,不可执行语句,其功能由相应软其功能由相应软件完成,件完成,不产生目不产生目标代码标代码。用户定义的新指令,汇编时产用户定义的新指令,汇编时产生相应的目标代码。生相应的目标代码。现在学习的是第7页,共81页标号和名字标号和名字分别是给指令单元和伪指令起的符号分别是给指令单元和伪指令起的符号名称,统称为标识符。名称,统称为标识符。(注意组成的语法规则注意组成的语法规则)助记符和定义符助记符和定义符分别用于规定指令语句的操作性质分别用于规定指令语句的操作性质和伪指令语句的伪操作功能,统称操作符。和伪指令语句的伪操作功能,统称操作符。操
10、作数操作数操作数允许有多个,这时各操作数之间要用逗操作数允许有多个,这时各操作数之间要用逗号号“,”隔开。隔开。3.1.2 3.1.2 汇编语言的语句汇编语言的语句指令语句:指令语句:标号:标号:助记符助记符 操作数操作数 ;注释;注释 伪指令语句:伪指令语句:名字名字 定义符定义符 操作数操作数 ;注释;注释 1.1.语句格式语句格式现在学习的是第8页,共81页2.2.数数 据据 汇编语言中使用的数据有常数、变量和标号。汇编语言中使用的数据有常数、变量和标号。(1)(1)常数常数 常数是指那些在汇编过程中已常数是指那些在汇编过程中已有确定数值的量有确定数值的量,分,分为数值常数和字符串常数两
11、类。主要用作为数值常数和字符串常数两类。主要用作:指令语句中的立即操作数指令语句中的立即操作数基址、变址或基址加变址寻址中的位移量基址、变址或基址加变址寻址中的位移量伪指令语句中用于给变量赋初值伪指令语句中用于给变量赋初值3.1.2 3.1.2 汇编语言的语句汇编语言的语句现在学习的是第9页,共81页 标号标号是指令的符号化地址,一定在代码段,而是指令的符号化地址,一定在代码段,而变量变量是数据是数据的符号化地址,的符号化地址,一般在数据段,有时也可在代码段定义一般在数据段,有时也可在代码段定义。q变量与标号有三个共同属性:变量与标号有三个共同属性:段基址:段基址:所在段的起始地址所在段的起始
12、地址(SEG)SEG)偏移值:偏移值:相对于段基址的位移量相对于段基址的位移量(OFFSET)OFFSET)类型:类型:所占字节数所占字节数(TYPE)TYPE)(2)(2)变量与标号变量与标号3.1.2 3.1.2 汇编语言的语句汇编语言的语句现在学习的是第10页,共81页q变量与标号区别变量与标号区别标号可以用作标号可以用作转移控制类指令的操作数转移控制类指令的操作数,但变量不但变量不能。能。变量可以用作变量可以用作基址、变址或基址加变址寻址的位移基址、变址或基址加变址寻址的位移量量,但标号不能。但标号不能。3.1.2 3.1.2 汇编语言的语句汇编语言的语句现在学习的是第11页,共81页
13、 例例3.13.1 假设假设VAR1VAR1和和VAR2VAR2为字变量,为字变量,LABLAB为程序中的一为程序中的一个标号,判断下列指令是否正确,若错误请指出错误之处:个标号,判断下列指令是否正确,若错误请指出错误之处:ADD VAR1 ADD VAR1,VAR2VAR2 SUB AL SUB AL,VAR1 VAR1 JNZ VAR1 JNZ VAR1 JMP LABSI JMP LABSI JMP NEAR LAB JMP NEAR LAB MOV AX MOV AX,VAR1BXVAR1BX JMP VAR2BX JMP VAR2BX错,不允许存储器变量间直接传数错,不允许存储器变量
14、间直接传数错,源与目的操作数类错,源与目的操作数类型不一致型不一致错,变量不能用作条件错,变量不能用作条件转移指令的操作数转移指令的操作数错,标号不能用作变址错,标号不能用作变址寻址的位移量寻址的位移量错,缺错,缺PTRPTR运算符运算符正确正确正确正确3.1.2 3.1.2 汇编语言的语句汇编语言的语句现在学习的是第12页,共81页3.3.表达式表达式 表达式是汇编语句操作数的基本形式,由运算表达式是汇编语句操作数的基本形式,由运算符和运算对象组成。符和运算对象组成。算术运算符算术运算符逻辑运算符逻辑运算符关系运算符关系运算符汇编语言特定的运算符汇编语言特定的运算符运算符运算符常数、变量和标
15、号常数、变量和标号操作数操作数构成程序的段和偏移量构成程序的段和偏移量 运算对象运算对象3.1.2 3.1.2 汇编语言的语句汇编语言的语句现在学习的是第13页,共81页 指在汇编过程中能够由汇编程序计算出数值的表达式。指在汇编过程中能够由汇编程序计算出数值的表达式。可作为可作为指令中的立即操作数和数据区中的初值使用。指令中的立即操作数和数据区中的初值使用。例如:例如:MOV BXMOV BX,0FFF0H AND 0B234H0FFF0H AND 0B234H MOV AL MOV AL,4CH EQ 24CH EQ 2 MOV AH MOV AH,4CH GT 14CH GT 1 MOV
16、AX MOV AX,SEG LABLESEG LABLE表达式又分为数值表达式和地址表达式:表达式又分为数值表达式和地址表达式:3.1.2 3.1.2 汇编语言的语句汇编语言的语句q数值表达式数值表达式现在学习的是第14页,共81页 其值表示存储器地址,一般都是段内的偏移地址。其值表示存储器地址,一般都是段内的偏移地址。与变量一样,地址表达式也具有段值、偏移值和类型与变量一样,地址表达式也具有段值、偏移值和类型属性。地址表达式主要用来表示指令语句中的操作数,属性。地址表达式主要用来表示指令语句中的操作数,例如:例如:MOV AXMOV AX,BASEEAXEBXBASEEAXEBX JMP J
17、MP BASEEAXBASEEAX LEA BXLEA BX,BASE+12BASE+123.1.2 3.1.2 汇编语言的语句汇编语言的语句q地址表达式地址表达式现在学习的是第15页,共81页3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句3.2.2 3.2.2 符号定义伪指令符号定义伪指令3.2.3 3.2.3 数据定义伪指令数据定义伪指令3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令3.2.5 3.2.5 结构定义伪指令结构定义伪指令 3.2 3.2 伪指令语句伪指令语句现在学习的是第16页,共81页3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句方
18、式选择伪指令方式选择伪指令完整段定义伪指令完整段定义伪指令指定地址伪指令指定地址伪指令模块定义伪指令模块定义伪指令 这类语句是与程序结构紧密相关的基本伪指令语句,用这类语句是与程序结构紧密相关的基本伪指令语句,用于说明于说明CPUCPU的类型、逻辑段结构、源程序的类型、逻辑段结构、源程序(或模块或模块)起止信起止信息和段内存的安排等。主要包括息和段内存的安排等。主要包括:现在学习的是第17页,共81页1.1.方式选择伪指令方式选择伪指令 方方式式选选择择伪伪指指令令用用于于通通知知汇汇编编程程序序,当当前前的的源源程程序序指指令令是是哪哪一一种种CPUCPU指指令令,经经过过汇汇编编链链接接之
19、之后后生生成成的的目目标标程程序序在在哪哪一一种种CPUCPU机机型型上上运运行行。不不属属于于选选定定CPUCPU的的指指令令均均为为非非法法指指令令。所所以以,方方式式选选择择伪伪指指令令本本质质上上也也就就是是指指令令集集选择伪指令选择伪指令。通常通常,方式选择伪指令放在程序的头部方式选择伪指令放在程序的头部,作为源程作为源程序的第一条语句。缺省时默认序的第一条语句。缺省时默认80868086指令集。指令集。3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句现在学习的是第18页,共81页2.2.完整段定义伪指令完整段定义伪指令 采用完整段定义伪指令可具体控制汇编程序采用完整段定
20、义伪指令可具体控制汇编程序(MASMMASM)和链接程序()和链接程序(LINKLINK)在内存中组织代码和)在内存中组织代码和数据的方式。数据的方式。主要包括主要包括段定义语句段定义语句和和段寄存器说明语句段寄存器说明语句。3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句现在学习的是第19页,共81页3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句 段定义语句段定义语句 格式:格式:段名段名 SEGMENTSEGMENT 定位类型定位类型,组合类型组合类型,字长选择字长选择,类别类别 段体段体 ;由指令、伪指令和宏指令语句组成;由指令、伪指令和宏指令语句组成段名段名
21、ENDSENDS 说明:说明:(1)(1)SEGMENT/ENDSSEGMENT/ENDS是一对段定义语句是一对段定义语句,一个逻辑段从一个逻辑段从SEGMENTSEGMENT语句开语句开始,到始,到ENDSENDS语句结束。语句结束。(2)(2)段名段名是用户定义的段的标识符,用于指明段的基址。是用户定义的段的标识符,用于指明段的基址。(3)(3)4 4个可选参数个可选参数用于为源程序的汇编、连接提供必要的信息,特别是用于为源程序的汇编、连接提供必要的信息,特别是模块化程序,各个模块如何定位模块化程序,各个模块如何定位,彼此之间如何连接,将较多地涉及到彼此之间如何连接,将较多地涉及到定定位类
22、型位类型和和组合类型组合类型的选择。的选择。指定段起点的边界类型指定段起点的边界类型:BYTE BYTE(字节)(字节)WORDWORD(字)(字)DWORDDWORD(双字)(双字)PARAPARA(节)(节)PAGEPAGE(页)(页)定位类型定位类型告诉链接程序本段与其它模块中同名段的组合连接关系告诉链接程序本段与其它模块中同名段的组合连接关系:PUBLIC PUBLIC 连接到同一个物理段中连接到同一个物理段中 STACK STACK 连接到同一个物理堆栈段中连接到同一个物理堆栈段中,并给并给SS:ESPSS:ESP赋值赋值 COMMON COMMON 产生一个覆盖段。产生一个覆盖段。
23、MEMORY MEMORY AT AT表达式表达式 组合类型组合类型定义段中使用的偏移地址和寄存器的字长定义段中使用的偏移地址和寄存器的字长 USE16 USE16 表示该段字长为表示该段字长为1616位位 USE32 USE32 表示该段字长为表示该段字长为3232位位字长选择字长选择现在学习的是第20页,共81页 组合连接组合连接举例:举例:模块模块2 2(从模块):(从模块):DSEG SEGMENT COMMONDSEG SEGMENT COMMON ARRAY_B DW 200 DUP(?)ARRAY_B DW 200 DUP(?)DSEG ENDSDSEG ENDSSSEG SEG
24、MENT STACKSSEG SEGMENT STACK DW 50 DUP(?)DW 50 DUP(?)SSEG ENDSSSEG ENDSCSEG SEGMENT PUBLICCSEG SEGMENT PUBLIC CSEG ENDSCSEG ENDS ENDEND模块模块1 1(主模块):(主模块):DSEG SEGMENT COMMONDSEG SEGMENT COMMON ARRAY_A DW 100 DUP(?)ARRAY_A DW 100 DUP(?)DSEG ENDSDSEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACK DW 50 DUP(
25、?)DW 50 DUP(?)SSEG ENDSSSEG ENDSCSEG SEGMENT PUBLICCSEG SEGMENT PUBLIC ASSUME CS:CSEG,DS:DSEG,SS:SSEG ASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART:MOV AXSTART:MOV AX,DSEGDSEG MOV DS MOV DS,AXAX CSEG ENDSCSEG ENDS END START END STARTCSEGCSEGDSEGDSEG(共共400400字节字节)模块模块2 2代码代码模块模块2 2数据数据SSEGSSEG(共共200200字节字节)模块模
26、块1 1代码代码模块模块2 2堆栈堆栈模块模块1 1数据数据逻辑段组合示意图逻辑段组合示意图模块模块1 1堆栈堆栈3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句现在学习的是第21页,共81页 段寄存器说明语句段寄存器说明语句 格式:格式:ASSUME ASSUME 段寄存器段寄存器:段名段名,段寄存器,段寄存器:段名,段名,功能功能:说明源程序中定义的段由那个段寄存器去寻址。说明源程序中定义的段由那个段寄存器去寻址。说明:说明:CSCS只能用于包含有程序的段只能用于包含有程序的段,反之含有程序的段也只能以反之含有程序的段也只能以CSCS作为段寄存器。作为段寄存器。SSSS也一样,
27、只能与堆栈段对应。也一样,只能与堆栈段对应。CSCS所对应的段名必须在该语句之前有定义。所对应的段名必须在该语句之前有定义。该语句是说明性语句。该语句是说明性语句。3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句现在学习的是第22页,共81页3.3.指定地址伪指令指定地址伪指令 格式格式:ORG ORG 偏移地址偏移地址 ORG$+ORG$+偏移地址偏移地址功能功能:该伪指令以其指定的偏移地址或由该伪指令以其指定的偏移地址或由$给出的当前地给出的当前地址加上指定的偏移地址作为当前开始分配和使用的偏移地址加上指定的偏移地址作为当前开始分配和使用的偏移地址。址。3.2.1 3.2.1
28、程序结构伪指令语句程序结构伪指令语句现在学习的是第23页,共81页4.4.模块定义伪指令模块定义伪指令 模块定义伪指令包括模块开始和模块结束语句。模块定义伪指令包括模块开始和模块结束语句。(1)(1)模块开始语句模块开始语句(NAME)NAME)格式:格式:NAME NAME 模块名模块名 功能:功能:指示源程序开始,并指出该源程序的模块名。指示源程序开始,并指出该源程序的模块名。(2)(2)模块结束语句模块结束语句(END)END)格式:格式:END END 标号标号/过程名过程名 功能:功能:模块结束语句表示源程序到此结束。模块结束语句表示源程序到此结束。3.2.1 3.2.1 程序结构伪
29、指令语句程序结构伪指令语句现在学习的是第24页,共81页3.2.2 3.2.2 符号定义伪指令符号定义伪指令格式格式:赋值语句:赋值语句:符号名符号名 EQU EQU 表达式表达式 功能功能:都是用符号名代替表达式的值。但都是用符号名代替表达式的值。但赋值语句定赋值语句定义的符号名不能重新定义义的符号名不能重新定义,而等号语句允许。,而等号语句允许。1.1.符号常数定义伪指令符号常数定义伪指令等号语句:等号语句:符号名符号名=表达式表达式 现在学习的是第25页,共81页 例例3.23.2 赋值语句与等号语句举例。赋值语句与等号语句举例。赋值语句:赋值语句:X EQU 50X EQU 50Y E
30、QU X+10Y EQU X+10COUNT EQU$-ARRYCOUNT EQU$-ARRY等号语句:等号语句:CON=5CON=5BASE=200HBASE=200H BASE=BASE+10HBASE=BASE+10H;重新定义;重新定义BASEBASE3.2.2 3.2.2 符号定义伪指令符号定义伪指令现在学习的是第26页,共81页2.定义符号名伪指令定义符号名伪指令格式:格式:符号名符号名 LABEL LABEL 类型类型 功能:功能:将紧跟在本伪指令后的标号、操作码、过程或变量建立将紧跟在本伪指令后的标号、操作码、过程或变量建立新的符号名,并刷新其类型,但它并不为新指定的变量或标号
31、新的符号名,并刷新其类型,但它并不为新指定的变量或标号分配存储空间。分配存储空间。例如:例如:SUB_FARLABELFAR;远调用入口;远调用入口SUB_NEAR:MOVAL,SI;近调用入口;近调用入口两个标号两个标号SUB_FAR和和SUB_NEAR均指向同一条指令,前均指向同一条指令,前者为远标号,后者为近标号。者为远标号,后者为近标号。3.2.2 3.2.2 符号定义伪指令符号定义伪指令现在学习的是第27页,共81页3.2.3 3.2.3 数据定义伪指令数据定义伪指令伪指令格式伪指令格式:DBDBDWDWDDDDDFDFDQDQDTDT数据项数据项,数据项,数据项,数据项,数据项 变
32、量名变量名 功能功能:是为数据项或项表分配存储空间,给它们是为数据项或项表分配存储空间,给它们赋初值,并用一个符号名(称为变量)与之相联系。赋初值,并用一个符号名(称为变量)与之相联系。8 8位(字节)位(字节)1616位(字)位(字)3232位(双字)位(双字)4848位(长字)位(长字)6464位(四字)位(四字)8080位(十字节)位(十字节)现在学习的是第28页,共81页使用说明使用说明:给变量赋初值可以是赋确定的值,也可以是赋不确定的值给变量赋初值可以是赋确定的值,也可以是赋不确定的值(用用“?”表示表示),),还可以是用还可以是用DUPDUP运算符建立的多次拷贝。运算符建立的多次拷
33、贝。例例3.33.3 使用使用8080X86X86汇编语言的伪操作命令定义:汇编语言的伪操作命令定义:VAL DB 93 DUP(5VAL DB 93 DUP(5,2 DUP(2 DUP(1,2 DUP(3),4)2 DUP(2 DUP(1,2 DUP(3),4)则在则在VALVAL存储区内前存储区内前1010个字节单元的数据是个字节单元的数据是?解:由内向外逐层展开,分别相当于:解:由内向外逐层展开,分别相当于:93 93 DUP(5DUP(5,2 DUP(2 DUP(12 DUP(2 DUP(1,3 3,3)3),4)4)93 DUP(5 93 DUP(5,2 DUP(12 DUP(1,3
34、 3,3 3,1 1,3 3,3 3,4)4)93 DUP(5,1,3,3,1,3,3,4,1,3,3,1,3,3,4)93 DUP(5,1,3,3,1,3,3,4,1,3,3,1,3,3,4)即表示重复即表示重复9393个数据序列个数据序列:5 5,1 1,3 3,3 3,1 1,3 3,3 3,4 4,1 1,3 3,3 3,1 1,3 3,3 3,4 43.2.3 3.2.3 数据定义伪指令数据定义伪指令现在学习的是第29页,共81页 使用使用SEGSEG、OFFSETOFFSET、TYPETYPE、LENGTHLENGTH和和SIZESIZE运算运算符求变量的各种属性时,特别要注意:符
35、求变量的各种属性时,特别要注意:对对LENGTHLENGTH运算符,如果变量是用重复数据操作符运算符,如果变量是用重复数据操作符DUPDUP说明的,则返回外层说明的,则返回外层DUPDUP给定的值;如果没有给定的值;如果没有DUPDUP说说明,则返回值总是明,则返回值总是1 1。对对SIZESIZE运算符有:运算符有:SIZE=TYPELENGTHSIZE=TYPELENGTH使用说明使用说明:3.2.3 3.2.3 数据定义伪指令数据定义伪指令现在学习的是第30页,共81页 解解:此此题题有有两两层层DUPDUP定定义义,但但最最外外层层DUPDUP给给定定的的值值为为100100,所以:,
36、所以:(BXBX)=数组数组ARRAYARRAY的偏移地址;的偏移地址;(CXCX)=数组数组ARRAYARRAY的长度的长度 =100=100;(SISI)=数组数组ARRAYARRAY的类型的类型 =2=2。例例3.43.4 若数组若数组ARRAYARRAY在数据段中已作如下定义:在数据段中已作如下定义:ARRAY DW 100 DUP(123HARRAY DW 100 DUP(123H,3 DUP(?)3 DUP(?),1234H1234H试指出下列指令执行后,有关寄存器的内容是多少?试指出下列指令执行后,有关寄存器的内容是多少?MOVMOV BX BX,OFFSET ARRAYOFFS
37、ET ARRAYMOVMOV CX CX,LENGTH ARRAYLENGTH ARRAYMOVMOV SI SI,0 0ADDADD SI SI,TYPE ARRAYTYPE ARRAY3.2.3 3.2.3 数据定义伪指令数据定义伪指令现在学习的是第31页,共81页 操作符操作符“$”是取地址计数器的当前值,常用于表达式定义是取地址计数器的当前值,常用于表达式定义数组长度。数组长度。例例例例3.53.53.53.5 已知:已知:已知:已知:ORG 0100HORG 0100HORG 0100HORG 0100H ARY DW 3ARY DW 3ARY DW 3ARY DW 3,$+4$+4
38、$+4$+4,5 5 5 5,6 6 6 6 CNT EQU$-ARYCNT EQU$-ARYCNT EQU$-ARYCNT EQU$-ARY DB 7 DB 7 DB 7 DB 7,8 8 8 8,CNTCNTCNTCNT,9 9 9 9下列指令执行后下列指令执行后下列指令执行后下列指令执行后,AXAXAXAX、BXBXBXBX寄存器的值为多少?寄存器的值为多少?寄存器的值为多少?寄存器的值为多少?MOV AXMOV AXMOV AXMOV AX,ARY+2 ARY+2 ARY+2 ARY+2 MOV BX MOV BX MOV BX MOV BX,ARY+10ARY+10ARY+10ARY
39、+100100H03H0101H00H0102H06H0103H01H0104H05H0105H00H0106H06H0107H00H0108H07H0109H08H010AH08H010BH09H解:画出数组解:画出数组ARYARY的内存分配图。的内存分配图。(AXAX)=ARY+2=0102H=0106H=ARY+2=0102H=0106H(BXBX)=ARY+10=010AH=0908H=ARY+10=010AH=0908H使用说明使用说明:3.2.3 3.2.3 数据定义伪指令数据定义伪指令现在学习的是第32页,共81页 使用使用DBDB、DWDW、DDDD定义串数据定义串数据(用用
40、定义的定义的字符串字符串)时时,允许定义的串长度不同,字符的存放顺允许定义的串长度不同,字符的存放顺序也不相同:序也不相同:DBDB是从左至右顺序为每个字符分配一个字节单元;是从左至右顺序为每个字符分配一个字节单元;DWDW是从左至右顺序为每是从左至右顺序为每2 2 个字符分配一个字单元,且个字符分配一个字单元,且前面的字符在高字节前面的字符在高字节,串长度不能超过串长度不能超过2 2;DDDD是从左至右顺序为每是从左至右顺序为每4 4 个字符分配一个双字单元,个字符分配一个双字单元,也是按前面的字符在高字节顺序存放,也是按前面的字符在高字节顺序存放,串长度不能超串长度不能超过过4 4。3.2
41、.3 3.2.3 数据定义伪指令数据定义伪指令现在学习的是第33页,共81页 例例3.63.6 今需在变量名为今需在变量名为STRINGSTRING的数据区中顺次存的数据区中顺次存放数据放数据A A、B B、C C、D D、E E、F F、G G、H H,请写出分别用汇编命令,请写出分别用汇编命令DBDB、DWDW和和DDDD实现的语句。实现的语句。解:解:用用DBDB、DWDW和和DDDD实现的语句分别为:实现的语句分别为:STRING DB STRING DB ABCDEFGHABCDEFGH STRING STRING DW DW BABA,DCDC,FEFE,HGHG STRING D
42、D STRING DD DCBADCBA,HGFEHGFE3.2.3 3.2.3 数据定义伪指令数据定义伪指令现在学习的是第34页,共81页3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令过程定义伪指令过程定义伪指令宏定义伪指令宏定义伪指令宏和过程的比较宏和过程的比较现在学习的是第35页,共81页格式:格式:过程名过程名 PROC PROC 属性属性 ;过程体;过程体 RETRET RET RET 过程名过程名 ENDPENDP 说明:说明:过程允许嵌套调用,还可以递归调用。过程允许嵌套调用,还可以递归调用。过程与逻辑段也可以相互嵌套,但决不允许过过程与逻辑段也可以相互嵌套,但决不
43、允许过程与段交叉覆盖。程与段交叉覆盖。过过程程又又称称为为子子程程序序。它它是是一一段段必必须须通通过过CALLCALL指指令令调调用用才才能能执执行行的的程程序序段段,执执行行完完后后通通过过一一条条RETRET指指令令返返回回原原调调用用处处。过过程程需先定义才能调用。需先定义才能调用。过程体中必须至少包含一条过程体中必须至少包含一条RETRET指指令,这是过程的出口。但也允许令,这是过程的出口。但也允许过程有多条过程有多条RETRET指令,即过程有多个指令,即过程有多个出口。出口。1.1.过程定义伪指令过程定义伪指令 3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令 现在学习
44、的是第36页,共81页宏定义格式:宏定义格式:宏名宏名 MACRO MACRO 形式参数表形式参数表 ;宏体;宏体 ENDMENDM 说明:说明:宏定义的宏名必须唯一,称为宏指令。宏指令一经宏定义的宏名必须唯一,称为宏指令。宏指令一经定义就可以在源程序的任何地方调用。相当于由用户给汇编程定义就可以在源程序的任何地方调用。相当于由用户给汇编程序提供了一个新的操作码。序提供了一个新的操作码。宏调用格式:宏调用格式:宏名宏名 实际参数表实际参数表 3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令 宏的概念与过程很相似,也是用一个宏的概念与过程很相似,也是用一个宏名字宏名字来代替源程序中经
45、常来代替源程序中经常要用到的一个程序模块。要用到的一个程序模块。2.2.宏定义伪指令宏定义伪指令现在学习的是第37页,共81页3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令 使用宏定义和宏调用时要注意使用宏定义和宏调用时要注意两个问题两个问题:对带参数的宏指令,宏调用时实际参数与形式参对带参数的宏指令,宏调用时实际参数与形式参数的类型要一致,以免产生无效调用数的类型要一致,以免产生无效调用 。宏调用是用宏体中定义的指令序列替换宏指令,宏调用是用宏体中定义的指令序列替换宏指令,所以所以宏体内的标号要用宏体内的标号要用LOCALLOCAL伪指令说明为局部标号伪指令说明为局部标号,以免
46、多次调用宏时,发生标号重复定义错误。以免多次调用宏时,发生标号重复定义错误。LOCALLOCAL伪指令格式:伪指令格式:LOCAL LOCAL 标号标号11,标号,标号2 2,现在学习的是第38页,共81页 解:解:宏定义如下:宏定义如下:MOVE MACRO MOVE MACRO SARYSARY,DARYDARY LOCAL LPLOCAL LP MOV SI MOV SI,0 0 MOV CX MOV CX,100100 LP LP:MOV ALMOV AL,SARYSISARYSI MOV DARYSI MOV DARYSI,ALAL INC SI INC SI LOOP LP LOO
47、P LP ENDM ENDM 例例3.73.7 定义宏定义宏MOVEMOVE,其功能是将一个有,其功能是将一个有100100个字节元素个字节元素的数组搬移到另一个数据区。的数组搬移到另一个数据区。进行宏调用:进行宏调用:MOVE FIRSTMOVE FIRST,SECONDSECOND宏展开如下:宏展开如下:MOV SIMOV SI,0 0 MOV CX MOV CX,100100?0000:MOV AL?0000:MOV AL,FIRSTSIFIRSTSI MOV SECONDSI MOV SECONDSI,ALAL INC SI INC SI LOOP?0000 LOOP?00003.2.
48、4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令 现在学习的是第39页,共81页3.3.宏和过程的比较宏和过程的比较 宏宏和和过过程程都都可可简简化化源源程程序序的的书书写写,因因而而也也减减少少了了程程序序出出错错的的可可能能性。但两者使用上也有区别性。但两者使用上也有区别:3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令 (1)(1)宏宏操操作作可可以以直直接接传传递递和和接接收收参参数数,而而过过程程不不能能直直接接带带参参数数。当当过过程程之之间间需需要要传传递递参参数数时时,必必须须通通过过堆堆栈栈、寄寄存存器器或或存存储储器器来进行,编程比宏要复杂。来进行,编程比宏
49、要复杂。所所以以,宏宏汇汇编编适适合合于于代代码码较较短短,传传送送参参数数较较多多的的子子功功能能段段使使用用,子子程序适合于代码较长程序适合于代码较长,调用比较频繁的子功能段使用。调用比较频繁的子功能段使用。(3)(3)引引入入宏宏操操作作并并不不会会在在执执行行目目标标代代码码时时增增加加额额外外的的时时间间开开销销,但但过过程程调调用用由由于于要要保保护护和和恢恢复复现现场场及及断断点点,因因此此会会延延长长目目标标程程序的执行时间。序的执行时间。(2)(2)子子程程序序不不管管被被调调用用多多少少次次它它都都只只被被汇汇编编一一次次,即即有有唯唯一一的的一一段段目目标标代代码码;而而
50、宏宏指指令令则则调调用用多多少少次次就就汇汇编编多多少少次次,每每次次调调用用都都要在程序中展开并保留宏体中的每一行。要在程序中展开并保留宏体中的每一行。现在学习的是第40页,共81页3.2.5 3.2.5 结构定义伪指令结构定义伪指令 在一些应用中,常需要将一些不同类型的数据组合成一个在一些应用中,常需要将一些不同类型的数据组合成一个有机整体。这时就要用到汇编语言的结构化数据有机整体。这时就要用到汇编语言的结构化数据结构结构。与与前前述述的的字字节节、字字类类型型数数据据不不同同,一一个个结结构构必必须须先先经经定定义义后后才才可可以以说说明明属属于于这这种种结结构构类类型型的的变变量量,这