欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第3章 汇编语言及编程N.pdf

    • 资源ID:70013803       资源大小:1.05MB        全文页数:81页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第3章 汇编语言及编程N.pdf

    第三章第三章汇编语言及编程汇编语言及编程3.1 3.1 汇编语言程序结构与汇编语句汇编语言程序结构与汇编语句3.2 3.2 伪指令语句伪指令语句3 3.3 .3 汇编语言编程环境汇编语言编程环境3 3.4 .4 DOS/BIOSDOS/BIOS功能调用功能调用3.5 3.5 三种基本结构程序的设计三种基本结构程序的设计3 3.6 .6 子程序设计与调用子程序设计与调用3.1 3.1 汇编语言程序结构与汇编语句汇编语言程序结构与汇编语句3 3.1 1.1 1 汇编语言源程序结构汇编语言源程序结构3 3.1 1.2 2 汇编语言的语句汇编语言的语句3.1.1 3.1.1 汇编语言源程序结构汇编语言源程序结构8080X86/PentiumX86/Pentium系列系列MPUMPU汇编语言都是以逻汇编语言都是以逻辑段为基础,按段的概念来组织代码和数据的。辑段为基础,按段的概念来组织代码和数据的。因此,源程序结构与逻辑段的定义方法密切相因此,源程序结构与逻辑段的定义方法密切相关,而宏汇编语言关,而宏汇编语言MASM 5.0MASM 5.0以上的版本中,逻以上的版本中,逻辑段既可用辑段既可用完整段完整段定义,又可用定义,又可用简化段简化段定义。定义。1.1.标准的单模块源程序框架标准的单模块源程序框架.586586 DATADATASEGMENTSEGMENTUSEUSE1616/USE/USE3232;定义数据段定义数据段;数据定义伪指令序列;数据定义伪指令序列DATADATAENDSENDSSTACKSTACKSEGMENTSEGMENTUSEUSE1616/USE/USE3232 STACKSTACK;定义堆栈段定义堆栈段;数据定义伪指令序列;数据定义伪指令序列STACKSTACKENDSENDSCODECODESEGMENTSEGMENTUSEUSE1616/USE/USE3232;定义代码段定义代码段ASSUMEASSUMECSCS:CODECODE,SSSS:STACKSTACK,DSDS:DATADATA,ESES:DATADATASTARTSTART:MOVMOVAXAX,DATADATA;取数据段基址取数据段基址MOVMOVDSDS,AXAX;建立建立DSDS的可寻址性的可寻址性MOVMOVESES,AXAX;建立建立ESES段的可寻址性段的可寻址性;核心程序段;核心程序段MOVMOVAHAH,4 4CHCH;返回返回DOSDOS操作系统操作系统INTINT2121H HCODECODEENDSENDSENDENDSTARTSTART 一个源程序由若干逻辑段一个源程序由若干逻辑段组成。一般一个源程序具有数组成。一般一个源程序具有数据段、附加数据段、堆栈段和据段、附加数据段、堆栈段和代码段;代码段;但只有代码段是必不但只有代码段是必不可少的。可少的。采用完整段定义时,对程序采用完整段定义时,对程序中定义的逻辑段,要说明中定义的逻辑段,要说明逻辑逻辑段与段寄存器的寻址关系。段与段寄存器的寻址关系。ASSUME CSASSUME 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.1 汇编语言源程序结构汇编语言源程序结构3.1.1 3.1.1 汇编语言源程序结构汇编语言源程序结构(1)(1)使用使用DOSDOS的的4 4CHCH号功能调用号功能调用这种方法是在代码段结束前加调用语句:这种方法是在代码段结束前加调用语句:MOVMOVAHAH,4 4CHCH;功能号功能号4 4CHAHCHAHINTINT2121H H;中断调用中断调用(2)(2)使用使用2020H H号软功能调用号软功能调用调用方式是在代码段结束前加调用语句:调用方式是在代码段结束前加调用语句:INT 20HINT 20H(3)(3)使用使用DOSDOS的的0 0号功能调用号功能调用调用方式是在代码段结束前加调用语句:调用方式是在代码段结束前加调用语句:MOV AHMOV AH,0 0INT 21HINT 21H2.2.返回返回DOSDOS状态的方法状态的方法(4)(4)将主程序定义为远过程将主程序定义为远过程也称为也称为“标准序标准序”方法。这种方法是在代码段开方法。这种方法是在代码段开始处按下述方式定义主程序:始处按下述方式定义主程序:CODECODESEGMENTSEGMENTASSUMEASSUME主过程名主过程名PROCPROCFARFARPUSHPUSHDSDSSUBSUBAXAX,AXAX;标准序标准序PUSHPUSHAXAX RETRET主过程名主过程名ENDPENDP ENDEND主过程名主过程名3.1.1 3.1.1 汇编语言源程序结构汇编语言源程序结构 指令语句指令语句 伪指令语句伪指令语句 宏指令语句宏指令语句3.1.2 3.1.2 汇编语言的语句汇编语言的语句语句是汇编语言程序的基本组成单位,用于规定汇编语句是汇编语言程序的基本组成单位,用于规定汇编语言的一个基本操作。汇编语言包含三种基本语句:语言的一个基本操作。汇编语言包含三种基本语句:是可执行语句是可执行语句,由硬件由硬件(CPU)CPU)完成其功能完成其功能,汇汇编时产生目标代码编时产生目标代码。不可执行语句,不可执行语句,其功能由相应软其功能由相应软件完成,件完成,不产生不产生目标代码目标代码。用户定义的新指令,汇编用户定义的新指令,汇编时产生相应的目标代码。时产生相应的目标代码。标号和名字标号和名字分别是给指令单元和伪指令起的分别是给指令单元和伪指令起的符号名称,统称为标识符。符号名称,统称为标识符。(注意组成的语法规则注意组成的语法规则)助记符和定义符助记符和定义符分别用于规定指令语句的操分别用于规定指令语句的操作性质和伪指令语句的伪操作功能,统称操作符。作性质和伪指令语句的伪操作功能,统称操作符。操作数操作数操作数允许有多个,这时各操作数之操作数允许有多个,这时各操作数之间要用逗号间要用逗号“,”隔开。隔开。3.1.2 3.1.2 汇编语言的语句汇编语言的语句指令语句:指令语句:标号:标号:助记符助记符 操作数操作数 ;注释;注释 伪指令语句:伪指令语句:名字名字 定义符定义符 操作数操作数 ;注释;注释 1.1.语句格式语句格式2.2.数数 据据汇编语言中使用的数据有常数、变量和标号。汇编语言中使用的数据有常数、变量和标号。(1)(1)常数常数常数是指那些在汇编过程中已常数是指那些在汇编过程中已有确定数值的有确定数值的量量,分为数值常数和字符串常数两类。主要用作,分为数值常数和字符串常数两类。主要用作:指令语句中的立即操作数指令语句中的立即操作数 基址、变址或基址加变址寻址中的位移量基址、变址或基址加变址寻址中的位移量 伪指令语句中用于给变量赋初值伪指令语句中用于给变量赋初值3.1.2 3.1.2 汇编语言的语句汇编语言的语句标号标号是指令的符号化地址,一定在代码段,而是指令的符号化地址,一定在代码段,而变变量量是数据的符号化地址,是数据的符号化地址,一般在数据段,有时也可在一般在数据段,有时也可在代码段定义代码段定义。变量与标号有三个共同属性:变量与标号有三个共同属性:段基址:段基址:所在段的起始地址所在段的起始地址(SEG)SEG)偏移值:偏移值:相对于段基址的位移量相对于段基址的位移量(OFFSET)OFFSET)类型:类型:所占字节数所占字节数(TYPE)TYPE)(2)(2)变量与标号变量与标号3.1.2 3.1.2 汇编语言的语句汇编语言的语句变量与标号区别变量与标号区别标号可以用作标号可以用作转移控制类指令的操作数转移控制类指令的操作数,但但变量不能。变量不能。变量可以用作变量可以用作基址、变址或基址加变址寻址基址、变址或基址加变址寻址的位移量的位移量,但标号不能。但标号不能。3.1.2 3.1.2 汇编语言的语句汇编语言的语句例例3.13.1假设假设VAR1VAR1和和VAR2VAR2为字变量,为字变量,LABLAB为程序中为程序中的一个标号,判断下列指令是否正确,若错误请指出的一个标号,判断下列指令是否正确,若错误请指出错误之处:错误之处:ADDADDVARVAR1 1,VARVAR2 2SUBSUBALAL,VARVAR1 1JNZJNZVARVAR1 1JMPJMPLABSILABSIJMPJMPNEARNEARLABLABMOVMOVAXAX,VARVAR1 1BXBXJMPJMPVARVAR2 2BXBX错,不允许存储器变量间直接传数错,不允许存储器变量间直接传数错,源与目的操作数错,源与目的操作数类型不一致类型不一致错,变量不能用作条错,变量不能用作条件转移指令的操作数件转移指令的操作数错,标号不能用作变错,标号不能用作变址寻址的位移量址寻址的位移量错,缺错,缺PTRPTR运算符运算符正确正确正确正确3.1.2 3.1.2 汇编语言的语句汇编语言的语句3.3.表达式表达式表达式是汇编语句操作数的基本形式,由运表达式是汇编语句操作数的基本形式,由运算符和运算对象组成。算符和运算对象组成。算术运算符算术运算符逻辑运算符逻辑运算符关系运算符关系运算符汇编语言特定的运算符汇编语言特定的运算符运算符运算符常数、变量和标号常数、变量和标号操作数操作数构成程序的段和偏移量构成程序的段和偏移量运算对象运算对象3.1.2 3.1.2 汇编语言的语句汇编语言的语句指在汇编过程中能够由汇编程序计算出数值的表指在汇编过程中能够由汇编程序计算出数值的表达式。可作为达式。可作为指令中的立即操作数和数据区中的初值指令中的立即操作数和数据区中的初值使用。使用。例如:例如:MOV BXMOV BX,0FFF0H AND 0B234H0FFF0H AND 0B234HMOVMOVALAL,4 4CHCHEQEQ2 2MOVMOVAHAH,4 4CHCHGTGT1 1MOVMOVAXAX,SEGSEG LABLELABLE表达式又分为数值表达式和地址表达式:表达式又分为数值表达式和地址表达式:3.1.2 3.1.2 汇编语言的语句汇编语言的语句数值表达式数值表达式其值表示存储器地址,一般都是段内的偏移地其值表示存储器地址,一般都是段内的偏移地址。与变量一样,地址表达式也具有段值、偏移值址。与变量一样,地址表达式也具有段值、偏移值和类型属性。地址表达式主要用来表示指令语句中和类型属性。地址表达式主要用来表示指令语句中的操作数,的操作数,例如:例如:MOV AXMOV AX,BASEEAXEBXBASEEAXEBXJMP JMP BASEEAXBASEEAXLEA BXLEA BX,BASE+12BASE+123.1.2 3.1.2 汇编语言的语句汇编语言的语句地址表达式地址表达式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 伪指令语句伪指令语句3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句方式选择伪指令方式选择伪指令完整段定义伪指令完整段定义伪指令指定地址伪指令指定地址伪指令模块定义伪指令模块定义伪指令这类语句是与程序结构紧密相关的基本伪指令语这类语句是与程序结构紧密相关的基本伪指令语句,用于说明句,用于说明CPUCPU的类型、逻辑段结构、源程序的类型、逻辑段结构、源程序(或模或模块块)起止信息和段内存的安排等。主要包括起止信息和段内存的安排等。主要包括:1.1.方式选择伪指令方式选择伪指令方式选择伪指令用于通知汇编程序方式选择伪指令用于通知汇编程序,当前的当前的源程序指令是哪一种源程序指令是哪一种CPUCPU指令指令,经过汇编链接之后经过汇编链接之后生成的目标程序在哪一种生成的目标程序在哪一种CPUCPU机型上运行机型上运行。不属于不属于选定选定CPUCPU的指令均为非法指令的指令均为非法指令。所以所以,方式选择伪方式选择伪指令本质上也就是指令集选择伪指令指令本质上也就是指令集选择伪指令。通常通常,方式选择伪指令放在程序的头部方式选择伪指令放在程序的头部,作为作为源程序的第一条语句。缺省时默认源程序的第一条语句。缺省时默认80868086指令集。指令集。3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句2.2.完整段定义伪指令完整段定义伪指令采用完整段定义伪指令可具体控制汇编程序采用完整段定义伪指令可具体控制汇编程序(MASMMASM)和链接程序(和链接程序(LINKLINK)在内存中组织代码在内存中组织代码和数据的方式。和数据的方式。主要包括主要包括段定义语句段定义语句和和段寄存器说明语句段寄存器说明语句。3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句 段定义语句段定义语句 格式:格式:段名段名 SEGMENTSEGMENT 定位类型定位类型,组合类型组合类型,字长选择字长选择,类别类别 段体段体;由指令;由指令、伪指令和宏指令语句组成伪指令和宏指令语句组成段名段名 ENDSENDS 说明:说明:(1)(1)SEGMENT/ENDSSEGMENT/ENDS是一对段定义语句是一对段定义语句,一个逻辑段从一个逻辑段从SEGMENTSEGMENT语句开始,到语句开始,到ENDSENDS语句结束。语句结束。(2)(2)段名段名是用户定义的段的标识符,用于指明段的基址。是用户定义的段的标识符,用于指明段的基址。(3)(3)4 4个可选参数个可选参数用于为源程序的汇编、连接提供必要的信用于为源程序的汇编、连接提供必要的信息,特别是模块化程序,各个模块如何定位息,特别是模块化程序,各个模块如何定位,彼此之间如何连彼此之间如何连接,将较多地涉及到接,将较多地涉及到定位类型定位类型和和组合类型组合类型的选择。的选择。指定段起点的边界类型指定段起点的边界类型:BYTEBYTE(字节)字节)WORDWORD(字)字)DWORDDWORD(双字)双字)PARAPARA(节)节)PAGEPAGE(页)页)定位类型定位类型告诉链接程序本段与其它模块中同名段的组合连接关系告诉链接程序本段与其它模块中同名段的组合连接关系:PUBLIC PUBLIC 连接到同一个物理段中连接到同一个物理段中STACK STACK 连接到同一个物理堆栈段中连接到同一个物理堆栈段中,并给并给SS:ESPSS:ESP赋值赋值COMMON COMMON 产生一个覆盖段。产生一个覆盖段。MEMORY MEMORY ATAT表达式表达式组合类型组合类型定义段中使用的偏移地址和寄存器的字长定义段中使用的偏移地址和寄存器的字长USE16 USE16 表示该段字长为表示该段字长为1616位位USE32 USE32 表示该段字长为表示该段字长为3232位位字长选择字长选择 组合连接组合连接举例:举例:模块模块2 2(从模块):(从模块):DSEG SEGMENT COMMONDSEG SEGMENT COMMONARRAY_B DW 200 DUP(?)ARRAY_B DW 200 DUP(?)DSEG ENDSDSEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACKDW 50 DUP(?)DW 50 DUP(?)SSEG ENDSSSEG ENDSCSEG SEGMENT PUBLICCSEG SEGMENT PUBLIC CSEG ENDSCSEG ENDSENDEND模块模块1 1(主模块):(主模块):DSEG SEGMENT COMMONDSEG SEGMENT COMMONARRAY_A DW 100 DUP(?)ARRAY_A DW 100 DUP(?)DSEG ENDSDSEG ENDSSSEG SEGMENT STACKSSEG SEGMENT STACKDW 50 DUP(?)DW 50 DUP(?)SSEG ENDSSSEG ENDSCSEG SEGMENT PUBLICCSEG SEGMENT PUBLICASSUME CS:CSEG,DS:DSEG,SS:SSEGASSUME CS:CSEG,DS:DSEG,SS:SSEGSTART:MOV AXSTART:MOV AX,DSEGDSEGMOV DSMOV DS,AXAX CSEG ENDSCSEG ENDSEND STARTEND STARTCSEGCSEGDSEGDSEG(共共400400字节字节)模块模块2 2代码代码模块模块2 2数据数据SSEGSSEG(共共200200字节字节)模块模块1 1代码代码模块模块2 2堆栈堆栈模块模块1 1数据数据逻辑段组合示意图逻辑段组合示意图模块模块1 1堆栈堆栈3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句 段寄存器说明语句段寄存器说明语句 格式:格式:ASSUME ASSUME 段寄存器段寄存器:段名段名,段寄存器,段寄存器:段名,段名,功能功能:说明源程序中定义的段由那个段寄存器去寻址。说明源程序中定义的段由那个段寄存器去寻址。说明:说明:CSCS只能用于包含有程序的段只能用于包含有程序的段,反之含有程序的段也反之含有程序的段也只能以只能以CSCS作为段寄存器。作为段寄存器。SSSS也一样,只能与堆栈段对应。也一样,只能与堆栈段对应。CSCS所对应的段名必须在该语句之前有定义。所对应的段名必须在该语句之前有定义。该语句是说明性语句。该语句是说明性语句。3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句3.3.指定地址伪指令指定地址伪指令格式格式:ORG ORG 偏移地址偏移地址ORG$+ORG$+偏移地址偏移地址功能功能:该伪指令以其指定的偏移地址或由该伪指令以其指定的偏移地址或由$给出的给出的当前地址加上指定的偏移地址作为当前开始分配和当前地址加上指定的偏移地址作为当前开始分配和使用的偏移地址。使用的偏移地址。3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句4.4.模块定义伪指令模块定义伪指令模块定义伪指令包括模块开始和模块结束语句模块定义伪指令包括模块开始和模块结束语句。(1 1)模块开始语句模块开始语句(NAME)NAME)格式:格式:NAMENAME 模块名模块名功能:功能:指示源程序开始指示源程序开始,并指出该源程序的模块名并指出该源程序的模块名。(2 2)模块结束语句模块结束语句(END)END)格式:格式:ENDEND 标号标号/过程名过程名功能:功能:模块结束语句表示源程序到此结束。模块结束语句表示源程序到此结束。3.2.1 3.2.1 程序结构伪指令语句程序结构伪指令语句3.2.2 3.2.2 符号定义伪指令符号定义伪指令格式格式:赋值语句:赋值语句:符号名符号名EQU EQU 表达式表达式功能功能:都是用符号名代替表达式的值。但都是用符号名代替表达式的值。但赋值赋值语句定义的符号名不能重新定义语句定义的符号名不能重新定义,而等号语句,而等号语句允许。允许。1.1.符号常数定义伪指令符号常数定义伪指令等号语句:等号语句:符号名符号名=表达式表达式例例3.23.2赋值语句与等号语句举例。赋值语句与等号语句举例。赋值语句:赋值语句:X EQU 50X EQU 50Y EQU X+10Y EQU X+10COUNT EQU$COUNT EQU$-ARRYARRY等号语句:等号语句:CON=5CON=5BASE=200HBASE=200H BASE=BASE+10HBASE=BASE+10H;重新定义重新定义BASEBASE3.2.2 3.2.2 符号定义伪指令符号定义伪指令2.定义符号名伪指令定义符号名伪指令格式:格式:符号名符号名 LABEL LABEL 类型类型功能:功能:将紧跟在本伪指令后的标号、操作码、过程或变将紧跟在本伪指令后的标号、操作码、过程或变量建立新的符号名,并刷新其类型,但它并不为新指定量建立新的符号名,并刷新其类型,但它并不为新指定的变量或标号分配存储空间。的变量或标号分配存储空间。例如:例如:SUB_FAR LABEL FAR;远调用入口远调用入口SUB_NEAR:MOV AL,SI;近调用入口近调用入口两个标号两个标号SUB_FAR和和SUB_NEAR均指向同一条均指向同一条指令,前者为远标号,后者为近标号。指令,前者为远标号,后者为近标号。3.2.2 3.2.2 符号定义伪指令符号定义伪指令3.2.3 3.2.3 数据定义伪指令数据定义伪指令伪指令格式伪指令格式:DBDBDWDWDDDDDFDFDQDQDTDT数据项数据项,数据项,数据项,数据项,数据项 变量名变量名 功能功能:是为数据项或项表分配存储空间,给是为数据项或项表分配存储空间,给它们赋初值,并用一个符号名(称为变量)与之它们赋初值,并用一个符号名(称为变量)与之相联系。相联系。8 8位(字节)位(字节)1616位(字)位(字)3232位(双字)位(双字)4848位(长字)位(长字)6464位(四字)位(四字)8080位(十字节)位(十字节)使用说明使用说明:给变量赋初值可以是赋确定的值,也可以是赋不确给变量赋初值可以是赋确定的值,也可以是赋不确定的值定的值(用用“?”表示表示),),还可以是用还可以是用DUPDUP运算符建立的多次拷运算符建立的多次拷贝。贝。例例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个字节单元的数据是个字节单元的数据是?解:由内向外逐层展开解:由内向外逐层展开,分别相当于:分别相当于:9393 DUP(DUP(5 5,2 2 DUP(DUP(2 2 DUP(DUP(1 1,3 3,3 3),4 4)9393 DUP(DUP(5 5,2 2 DUP(DUP(1 1,3 3,3 3,1 1,3 3,3 3,4 4)9393 DUP(DUP(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 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 数据定义伪指令数据定义伪指令 使用使用SEGSEG、OFFSETOFFSET、TYPETYPE、LENGTHLENGTH和和SIZESIZE运算符求变量的各种属性时,特别要注意:运算符求变量的各种属性时,特别要注意:对对LENGTHLENGTH运算符,如果变量是用重复数据运算符,如果变量是用重复数据操作符操作符DUPDUP说明的,则返回外层说明的,则返回外层DUPDUP给定的给定的值;如果没有值;如果没有DUPDUP说明,则返回值总是说明,则返回值总是1 1。对对SIZESIZE运算符有:运算符有:SIZE=TYPESIZE=TYPELENGTHLENGTH使用说明使用说明:3.2.3 3.2.3 数据定义伪指令数据定义伪指令解解:此题有两层此题有两层DUPDUP定义定义,但最外层但最外层DUPDUP给定的值给定的值为为100100,所以:所以:(BXBX)=数组数组ARRAYARRAY的偏移地址;的偏移地址;(CXCX)=数组数组ARRAYARRAY的长度的长度=100100;(SISI)=数组数组ARRAYARRAY的类型的类型=2 2。例例3.43.4 若数组若数组ARRAYARRAY在数据段中已作如下定义:在数据段中已作如下定义:ARRAY DW 100 DUP(123HARRAY DW 100 DUP(123H,3 DUP(?)3 DUP(?),1234H1234H试指出下列指令执行后,有关寄存器的内容是多少?试指出下列指令执行后,有关寄存器的内容是多少?MOVMOVBXBX,OFFSET ARRAYOFFSET ARRAYMOVMOVCXCX,LENGTH ARRAYLENGTH ARRAYMOVMOVSISI,0 0ADDADDSISI,TYPE ARRAYTYPE ARRAY3.2.3 3.2.3 数据定义伪指令数据定义伪指令 操作符操作符“$”是取地址计数器的当前值,常用于表是取地址计数器的当前值,常用于表达式定义数组长度。达式定义数组长度。例例3.53.5已知:已知:ORGORG01000100H HARYARYDWDW3 3,$+4 4,5 5,6 6CNTCNTEQUEQU$-ARYARYDBDB7 7,8 8,CNTCNT,9 9下列指令执行后下列指令执行后,AXAX、BXBX寄存器的值为多少?寄存器的值为多少?MOV AXMOV AX,ARY+2 ARY+2 MOV BXMOV BX,ARY+10ARY+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 数据定义伪指令数据定义伪指令 使用使用DBDB、DWDW、DDDD定义串数据定义串数据(用用 定定义的字符串义的字符串)时时,允许定义的串长度不同,字符的允许定义的串长度不同,字符的存放顺序也不相同:存放顺序也不相同:DBDB是从左至右顺序为每个字符分配一个字节单是从左至右顺序为每个字符分配一个字节单元;元;DWDW是从左至右顺序为每是从左至右顺序为每2 2 个字符分配一个字单个字符分配一个字单元,且前面的字符在高字节元,且前面的字符在高字节,串长度不能超过串长度不能超过2 2;DDDD是从左至右顺序为每是从左至右顺序为每4 4 个字符分配一个双字个字符分配一个双字单元,也是按前面的字符在高字节顺序存放,单元,也是按前面的字符在高字节顺序存放,串长度不能超过串长度不能超过4 4。3.2.3 3.2.3 数据定义伪指令数据定义伪指令例例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实现的语句分别为:实现的语句分别为:STRINGSTRINGDBDBABCDEFGHABCDEFGHSTRINGSTRINGDWDWBABA,DCDC,FEFE,HGHGSTRINGSTRINGDDDDDCBADCBA,HGFEHGFE3.2.3 3.2.3 数据定义伪指令数据定义伪指令3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令过程定义伪指令过程定义伪指令宏定义伪指令宏定义伪指令宏和过程的比较宏和过程的比较格式:格式:过程名过程名PROC PROC 属性属性;过程体;过程体 RETRETRETRET过程名过程名ENDPENDP说明:说明:过程允许嵌套调用,还可以递归调用。过程允许嵌套调用,还可以递归调用。过程与逻辑段也可以相互嵌套,但决不允过程与逻辑段也可以相互嵌套,但决不允许过程与段交叉覆盖。许过程与段交叉覆盖。过程又称为子程序过程又称为子程序。它是一段必须通过它是一段必须通过CALLCALL指令调指令调用才能执行的程序段用才能执行的程序段,执行完后通过一条执行完后通过一条RETRET指令返回原指令返回原调用处调用处。过程需先定义才能调用过程需先定义才能调用。过程体中必须至少包含一过程体中必须至少包含一条条RETRET指令,这是过程的出口。指令,这是过程的出口。但也允许过程有多条但也允许过程有多条RETRET指令,指令,即过程有多个出口。即过程有多个出口。1.1.过程定义伪指令过程定义伪指令3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令宏定义格式:宏定义格式:宏名宏名MACRO MACRO 形式参数表形式参数表 ;宏体;宏体ENDMENDM说明:说明:宏定义的宏名必须唯一,称为宏指令。宏指令宏定义的宏名必须唯一,称为宏指令。宏指令一经定义就可以在源程序的任何地方调用。相当于由用户一经定义就可以在源程序的任何地方调用。相当于由用户给汇编程序提供了一个新的操作码。给汇编程序提供了一个新的操作码。宏调用格式:宏调用格式:宏名宏名 实际参数表实际参数表 3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令宏的概念与过程很相似,也是用一个宏的概念与过程很相似,也是用一个宏名字宏名字来代替源来代替源程序中经常要用到的一个程序模块。程序中经常要用到的一个程序模块。2.2.宏定义伪指令宏定义伪指令3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令使用宏定义和宏调用时要注意使用宏定义和宏调用时要注意两个问题两个问题:对带参数的宏指令,宏调用时实际参数与形对带参数的宏指令,宏调用时实际参数与形式参数的类型要一致,以免产生无效调用式参数的类型要一致,以免产生无效调用。宏调用是用宏体中定义的指令序列替换宏指宏调用是用宏体中定义的指令序列替换宏指令,所以令,所以宏体内的标号要用宏体内的标号要用LOCALLOCAL伪指令说明为伪指令说明为局部标号局部标号,以免多次调用宏时,发生标号重复,以免多次调用宏时,发生标号重复定义错误。定义错误。LOCALLOCAL伪指令格式:伪指令格式:LOCAL LOCAL 标号标号11,标号,标号2 2,解:解:宏定义如下:宏定义如下:MOVE MACRO MOVE MACRO SARYSARY,DARYDARYLOCAL LPLOCAL LPMOV SIMOV SI,0 0MOV CXMOV CX,100100LPLP:MOV ALMOV AL,SARYSISARYSIMOV DARYSIMOV DARYSI,ALALINC SIINC SILOOP LPLOOP LPENDMENDM例例3.73.7 定义宏定义宏MOVEMOVE,其功能是将一个有其功能是将一个有100100个字节个字节元素的数组搬移到另一个数据区。元素的数组搬移到另一个数据区。进行宏调用:进行宏调用:MOVE FIRSTMOVE FIRST,SECONDSECOND宏展开如下:宏展开如下:MOV SIMOV SI,0 0MOV CXMOV CX,100100?0000:MOV AL?0000:MOV AL,FIRSTSIFIRSTSIMOV SECONDSIMOV SECONDSI,ALALINC SIINC SILOOP?0000LOOP?00003.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令3.3.宏和过程的比较宏和过程的比较宏和过程都可简化源程序的书写宏和过程都可简化源程序的书写,因而也减少了程序因而也减少了程序出错的可能性出错的可能性。但两者使用上也有区别但两者使用上也有区别:3.2.4 3.2.4 过程与宏定义伪指令过程与宏定义伪指令(1 1)宏操作可以直接传递和接收参数宏操作可以直接传递和接收参数,而过程不能直而过程不能直接带参数接带参数。当过程之间需要传递参数时当过程之间需要传递参数时,必须通过堆栈必须通过堆栈、寄存器或存储器来进行寄存器或存储器来进行,编程比宏要复杂编程比宏要复杂。所以所以,宏汇编适合于代码较短宏汇编适合于代码较短,传送参数较多的子功能段使传送参数较多的子功能段使用用,子程序适合于代码较长子程序适合于代码较长,调用比较频繁的子功能段使用调用比较频繁的子功能段使用。(3 3)引入宏操作并不会在执行目标代码时增加额外的引入宏操作并不会在执行目标代码时增加额外的时间开销时间开销,但过程调用由于要保护和恢复现场及断点但过程调用由于要保护和恢复现场及断点,因因此会延长目标程序的执行时间此会延长目标程序的执行时间。(2 2)子程序不管被调用多少次它都只被汇编一次子程序不管被调用多少次它都只被汇编一次,即即有唯一的一段目标代码有唯一的一段目标代码;而宏指令则调用多少次就汇编多少而宏指令则调用多少次就汇编多少次次,每次调用都要在程序中展开并保留宏体中的每一行每次调用都要在程序中展开并保留宏体中的每一行。3.2.5 3.2.5 结构定义伪指令结构定义伪指令在一些应用中,常需要将一些不同类型的数据组在一些应用中,常需要将一些不同类型的数据组合成一个有机整体。这时就要用到汇编语言的结构化合成一个有机整体。这时就要用到汇编语言的结构化数据数据结构结构。与前述的字节与前述的字节、字类型数据不同字类型数据不同,一个结构必一个结构必须先经定义后才可以说明属于这种结构类型的变量须先经定义后才可以说明属于这种结构类型的变量,这是因为结构的组成是千变万化的这是因为结构的组成是千变万化的。所以围绕结构所以围绕结构定义定义,有两种伪指令语句有两种伪指令语句:2.2.结构变量说明与赋初值语句结构变量说明与赋初值语句1.1.结构类型说明语句结构类型说明语句(STRUC/ENDS)STRUC/ENDS)3.2.5 3.2.5 结构定义伪指令结构定义伪指令语句格式:语句格式:结构名结构名STRUCSTRUC;结构体结构体,由数据定义语句构成,由数据定义语句构成结构名结构名ENDSENDSDATE STRUCDATE STRUCMONTH DB MONTH DB?DAY DB DAY DB?YEAR DW YEAR DW?DATE ENDSDATE ENDS结构结构DATEDATE的存储形式的存储形式MONTHMONTH(1 1字节)字节)DAYDAY(1 1字节)字节)YEARYEAR(2 2字节)字节)结构的定义明确地描述了该结构的组织形式,它告诉结构的定义明确地描述了该结构的组织形式,它告诉汇编程序属于这种组织形式的变量使用内存的模式。例如汇编程序属于这种组织形式的变量使用内存的模式。例如:1.1.结构类型说明语句结构类型说明语句(STRUC/ENDS)STRUC/ENDS)语句格式:语句格式:变量名变量名 结构名结构名 域值表域值表 例如:例如:VAR DATE 4VAR DATE 2004H结构变量结构变量VARVAR的存储形式的存储形式MONTHMONTH(1 1字节)字节)DAYDAY(1 1字节)字节)YEARYEAR(2 2字节)字节)0404H H0303H H0 04H4H2020H HVARVAR3.3.结构的引用结构的引用有两种方法:有两种方法:结构变量名结构变量名.域名域名 基址或变址寄存器基址或变址寄存器.域名域名MOV AXMOV AX,VAR.YEARVAR.YEARMOV CLMOV CL,VAR.DAYVAR.DAY上述引用也可用如下方法上述引用也可用如下方法:MOV BXMOV BX,OFFSET VAROFFSET VARMOV AXMOV AX,BX.YEARBX.YEARMOV

    注意事项

    本文(第3章 汇编语言及编程N.pdf)为本站会员(qwe****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开