欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    汇编语言课件第4章80X86汇编语言程序设计.ppt

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

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

    汇编语言课件第4章80X86汇编语言程序设计.ppt

    第4章 80X86汇编语言程序设计,本章主要内容:MASM宏汇编语句结构以及开发过程MASM汇编语言表达式、运算符程序段的定义和属性复杂数据结构宏汇编基本汇编语言程序设计子程序设计高级汇编语言程序设计,4.1 MASM宏汇编语句结构以及开发过程,1语句的类型硬指令语句(指令性语句)是指能产生目标代码,CPU可以执行的,能完成特定功能的语句,它主要由CPU指令组成。伪指令语句(指示性语句)是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。定义变量,定义过程,给变量分配存储单元,给数字或表达式命名等。所以伪指令语句是汇编程序在汇编时用的,不产生机器码。宏指令语句它是一个指令序列,汇编时凡有宏指令语句的地方都将用相应的指令序列的目标代码插入。,指令性语句是计算机可执行的,而伪指令不能执行,用来定义变量,分配存储单元,指示程序开始和结束等。这两种语句的差别:在形式上:带不带冒号,是否可转向它.在本质上:汇编时能否形成对应的机器码.,2语句的格式汇编语言源程序由语句序列构成。汇编语言源程序中的每条语句一般占一行,每行不超过132个字符(MASM 6.0开始可以是512个字符),执行性语句标号:硬指令助记符 操作数,操作数;注释说明性语句名字 伪指令助记符 参数,参数;注释,4.1.2 汇编语言的程序格式,在实地址模式和虚拟8086模式下,按照逻辑段组织程序,具有代码段、数据段、附加段和堆栈段。一个汇编语言源程序可以包含若干个代码段、数据段、堆栈段或附加段,段与段之间的顺序可随意排列。需独立运行的程序必须包含一个代码段,并指示程序执行的起始位置,一个程序只有一个起始位置。所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内,简化段定义的源程序格式MODELSMALL;定义程序的存储模式STACK;定义堆栈段DATA;定义数据段 STRING DB Hello,Everybody!,0DH,0AH,$;在数据段定义要显示的字符串CODE;定义代码段STARTUP;说明程序起始位置,并建立DS、SS内容 MOVDX,OFFSET STRING;指定字符串在数据段的偏移地址 MOVAH,9 INT21H;利用DOS功能调用显示信息EXIT 0;程序结束点,返回DOS END;汇编结束,完整段定义的源程序格式 DATA SEGMENT;定义数据段DATA STRINGDB Hello,Everybody!,0DH,0AH,$DATA ENDS;数据段结束 CODE SEGMENT;定义代码段CODE ASSUME CS:CODE,DS:DATA;确定CS、DS、SS指向的逻辑段 START:MOV AX,DATA;设置数据段的段地址DS MOV DS,AX MOV DX,OFFSET STRING;利用功能调用显示信息 MOV AH,9 INT 21H MOV AH,4CH;利用系统功能调用返回DOS INT 21H CODEENDS;代码段结束 ENDSTART;汇编结束,4.1.3 汇编语言程序的开发过程,ML.EXE 汇编程序ML.ERR 汇编错误信息文件DOSXNT.EXE MS-DOS扩展文件LINK.EXE 连接程序LIB.EXE 子程序库管理文件MASM5.1以下:MASM.EXE,4.2 MASM汇编语言表达式、运算符,包括常量、变量、标号及表达式1.常量(1)数字常量 二进制常量,以B(或b)结尾;十进制常量,以D(或d)结尾或省略;十六进制常量,以H(或h)结尾,如0A8C6H。,MASM提供基数控制,.RADIX伪指令可以改变默认进制。伪指令格式:.RADIX n要求:n为216范围内任何数值。功能:把n表示的数值作为默认基数。例如指令“.RADIX 16”,将缺省基数改为16,(2)字符串常量用单引号引起来的字符或字符串也代表常数。例:A,BCDE,汇编时被翻译成对应的ASCII码41H和42H,43H,44H,45H。字符串最大长度为255个字符,(3)符号常量利用一个标识符表达的一个数值。常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。MASM提供等价机制,用来为常量定义符号名,符号定义伪指令有“EQU”和“”,2.变量变量是内存中的数据区,在程序中作为存储器操作数来使用。变量有三种属性:段 值变量定义所在段的段地址偏移量变量单元地址与段起始地址之 间的位移量。类 型有字节、字和双字等。,3.标号标号是某条指令所存放单元的符号地址,可作为转移指令或CALL指令的转移地址。标号也有三种属性:段值总是在CS段寄存器中,偏移量概念与变量同,类型分NEAR和FAR两种。NEAR表示标号所在语句与转移指令或调用指令在同一码段内,只需改变IP即可。FAR标号所在语句与转移指令或调用指令不在同一代码段内。若没有对类型进行说明,默认为NEAR。,标号?变量?,请仔细阅读网络课程问题专讲汇编语言的符号、标号和变量符号一文!,4.表达式 表达式是常量、寄存器、标号、变量与一些运算符组合的序列,分数值表达式和地址表达式两种。汇编时按一定的优先规则对表达式进行计算后可得到一个数值或一个地址。下面介绍几种运算符:算术运算符、逻辑运算符、关系运算符、移位运算符、高低运算符、分析(取属性)运算符、合成(指定属性)运算符、其它运算符,(1)算术运算符有+、-、*、/,以及MOD,其中MOD表示除法运算后得到的余数。例:19/7的商是2,19 MOD 7则为5(余数)算术运算符可以用于数字表达式例:MOV AL,2*7汇编后为B0,0E算术运算符也可以用于地址表达式注意:对地址运算的结果应有明确的物理意义,例两个地址的乘或除无意义,而加或减则可以。例:LEA SI,SUM+3 表示变量SUM的地址加上3得到的和作为新存储器地址。,表示相对于当前地址向高地址或向低地址方向偏移,(2)逻辑运算符逻辑运算符有AND、OR、XOR和NOT,它们只能用于数字表达式中。例:MOVAL,36H AND 0FH逻辑运算符也是8086/8088的指令助记符,它们的区别:前者在汇编时进行,而后者在指令执行时进行的。例:AND DX,PORT_VAR AND 0FEH,(3)关系运算符 共有6个,它们为:EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)关系运算符的两个操作数必须都是数字或者是同一段内的两个存储器地址。关系为真,结果为0FFFFH(或0FFH)关系为假,结果为0例:MOV BX,PORT_VAL GE 5 若PORT_VAL的值大于等于5,则汇编后为:MOV BX,0FFFFH 若PORT_VAL的值小于5,则汇编后为:MOV BX,0,(4)移位运算符SHL/SHR实现对数值的左移、右移的逻辑操作,移入低位或高位的是0。其格式为:SHL/SHR移位次数。例:MOV AL,0101BSHL(2*2)逻辑和移位运算符与指令助记符相同,并有类似的运算功能。,(5)高低分离符HIGH、LOW功能:取数值的高半部分或低半部分。HIGH、LOW从一个字数值或符号常量中得到高、低字节例:MOV AH,HIGH 8765H;(AH)=87HMASM 6.0引入的HIGHWORD,LOWWORD取一个符号常量(不能是一般的常数)的高字或低字部分例:DD_VALUE EQU 0FFFF1234H;定义一个符号常量 MOV AX,LOWWORD DD_VALUE;(AX)=1234H,(6)分析运算符它们可以把存储器一些特征作为数值送回。这些操作符有OFFSET,SEG,TYPE,SIZE及LENGTH。OFFSET运算符可以得到一个标号或变量的偏移地址例:MOV SI,OFFSET STRI1;代表将变量STRI1;处的地址偏移量取到SI中.注意与 MOV SI,STRI1的差别.但它与 LEA SI,STRI1类似.SEG运算符用来取存储单元的段值例:MOVAX,SEG STRI1;将变量STRI1所MOVDS,AX;在段值取到DS中,LEA指令可以取动态的地址,OFFSET只能取静态的地址,指令执行后SI的值是变量STRI1存储单元的内容。,TYPE运算符用来取存储器的单元类型,各单元类型对应值如下:存储器单元类型 对应值 DB(字节)1 DW(字)2 DD(双字)4 NEAR-1 FAR-2若BUFFER1存储区是用如下伪指令定义的:BUFFER1 DB100 DUP(?)则 TYPEBUFFER1等于1,TYPE运算符用来取存储器的单元类型,各单元类型对应值如下:存储器单元类型 对应值 DB(字节)1 DW(字)2 DD(双字)4 NEAR-1 FAR-2若BUFFER1存储区是用如下伪指令定义的:BUFFER1 DB100 DUP(?)则 TYPEBUFFER1等于1,LENGTH运算符用来计算一个存储区的单元(单元可以是字节,字或双字)的数目。注意:LENGTH返回的存储区必须用复制操作符DUP()来定义,否则返回值为1。例:A1 DW4,5,6 A2 DW 10 DUP(2)A3 DW 8 DUP(1,2),54H A4 DB 21,4 DUP(3)则LENGTH A1=1;LENGTH A2=10;LENGTH A3=8;LENGTH A4=1,有多个数据项的,以第一个数据项为准!,SIZE运算符用来计算一个存储区的字节总数。即 SIZE=LENGTHTYPE例:ARRAY DW 50 DUP(0)则 SIZE ARRAY=502=100注意:对字符串变量求其长度,使用SIZE不能达到目的.例:ST DB ABCDEFG 则 SIZE ST值为1而不是7欲求字符串长可用COUNT EQU$-ST,则COUNT值为7,其中$为定义ST一串字符后下一个可用的偏移地址.,(7)合成运算符用来建立或临时改变变量或标号的类型或存储器操作的存储单元类型。包括:PTR、THIS、SHORT。PTR运算符用来指定或修改存储器操作数的类型,通常和伪指令BYTE、WORD等连起来使用。例:INCBYTE PTRDI INCWORD PTRDI 而 INCDI;类型不定,例:STR DW?;定义为字类型 PPEQUBYTE PTR STR QQEQUBYTE PTR STR+1;把STR和STR+1又规定为字节类型下面指令:MOVSTR,AXMOVAL,STR,是合法的,是非法的,只能用:MOV AL,PP 或 MOV AL,BYTE PTR STR,THIS运算符功能:指定存储器操作数的类型。使用THIS运算符可以使标号或变量具有灵活性。例:AREAW EQU THIS WORD AREAB DB 100 DUP(?)SHORT运算符指定一个标号的类型为SHORT(短标号),即标号到引用该标号之间的距离在128127个字节范围内。短标号可以用于转移指令中,使用短标号的指令比使用近程标号的指令少一个字节。,知道LABLE伪指令吗?,(8)其它运算符1)方括号 指令中用方括号表示存储器操作数,方括号里的内容表示操作数的偏移地址。例:MOV AX,BX;将(BX)和(BX+1)指向;的存储器两个单元的内容送AX2)段超越运算符“:”跟在某个段寄存器名(DS、ES、SS或CS)之后表示段超越,用来指定一个存储器操作数的段属性,而不管其原来隐含的段是什么。例:M0V AX,ES:DI;把ES段中由DI指向的字操作数送(AX),运算符的优先级,例4.5 属性及其应用.MODELSMALL.STACK.DATA V_BYTE EQU THIS BYTE V_WORD DW 3332H,3735H TARGET DW 5 DUP(20H)CRLF DB 0DH,0AH,$FLAG DB 0 N_POINT DW OFFSET S_LABEL.CODE.STARTUP MOV AL,BYTE PTR V_WORD DEC AL MOV V_BYTE,ALN_LABEL:CMP FLAG,1 JZ S_LABEL INC FLAG JMP SHORT N_LABELS_ LABEL:CMPFLAG,2 JZNEXT INCFLAG JMPN_POINT,NEXT:MOVAX,TYPE V_WORD MOVCX,LENGTHOF TARGETMOVSI,OFFSET TARGETW_AGAIN:MOV SI,AX INC SI INC SI LOOP W_AGAIN MOV CX,SIZEOF TARGET MOV AL,?MOV DI,OFFSET TARGETB_AGAIN:MOV DI,AL INC DI LOOP B_AGAIN MOV DX,OFFSET V_WORD MOV AH,9 INT 21H.EXIT 0 END,4.3 伪指令语句,常用的伪指令有:数据定义伪指令符号定义伪指令段定义伪指令过程定义伪指令结束伪指令,变量定义(Define)伪指令可为变量申请固定长度的存储空间,并可以同时将相应的存储单元初始化。,4.3.1 变量定义伪指令,格式:变量名 伪指令 初值表,变量名是用户自定义的标识符,表示初值表中首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。,初值表是用逗号分隔的参数,主要由数值常数,表达式、字符串或?、DUP组成。,1.定义字节单元伪指令DB2.定义字单元伪指令DW 3.定义双字单元伪指令DD4其它数据定义伪指令定义3字伪指令DF定义4字伪指令DQ 定义10字节伪指令DT,变量定义伪指令包括:,1定义字节单元伪指令DB功能:定义变量的类型为BYTE,给变量分配字节 或字节串。要求:初值表中每个数据一定是字节量,可以是0-255的无符号数或是 128-+127带符号数,也可以是字符串常数。,例:XDBa,5 DB 2DUP(100),?YDBABC,2定义字单元伪指令DW功能:定义变量的类型为WORD,给变量分配一个或 多个字单元,并可以将它们初始化为指定值。要求:初值表中每个数据一定是字,一个字单元可用于存放任何16位数据,如一个段地址、一个偏移地址、两个字符、065535之间的无符号数或者是32768+32767之间的带符号数。,例:COUNT DW8000H,AB,3定义双字单元伪指令DD功能:定义变量的类型为DWORD,用于分配一个或多个双字单元,并将它们初始化为指定值。要求:初值表中每个数据是一个32位的双字(Double Word),可以是有符号或无符号的32位整数,也可以用来表达16位段地址(高位字)和16位的偏移地址(低位字)的远指针。例:VARDDDD0,?,12345678H FARPOINTDD00400078H,1.等价“EQU”伪指令伪指令格式:符号名 EQU 数值表达式 符号名 EQU 例:DOSWRITECHAREQU2 CALLDOSEQU 注:1、仅在汇编源程序时作为替代符号用,不产生任何目标代码,也不占用存储单元,因此符号名没有段、偏移量和类型这3种属性。2、EQU定义伪指令同一符号名不能重复定义,必须取消(用PURGE伪指令)后才能重复再定义。,4.3.2 符号定义伪指令,2.等号“”伪指令 格式:符号名数值表达式 功能:与EQU伪指令相同,但是可以重复定义符号名。例:X7;X EQU7是正确的 XX+5;X EQUX+5是错误的,3.LABLE伪指令格式:名字 LABLE 类型功能:LABLE可以使同一个数据区域兼有两种属性例:AREAW LABEL WORD;变量AREAW类型为WORD AREAB DB 100 DUP(?);变量AREAB类型为BYTE MOV AREAW,AX;AX送第1,第2字节中 MOV AREAB49,AL;AL送第50个字节中,变量的类型可以是BYTE、WORD、DWORD,标号的类型可以是NEAR或FAR.,例:画图说明下面数据区的分配及初始化的数据值DATA DB 100,0FFH;设DATA的逻辑地址为1000:0000HEXPR DB 2*3+7CHAR EQU 64HADR DB CHARSTR DB WELCOMEAB DB ABBA DW ABOFFAB DW ABADRS DW DATA,DATA+5TOTAL DD DATA,有点烦杂哦!,4.3.3 程序段的定义伪指令,简化段定义 完整段定义,4.3.3.1 完整段定义的格式,STACKSEGMENT STACK;定义堆栈段STACK;分配堆栈段的大小 STACKENDS;堆栈段结束 DATASEGMENT;定义数据段DATA;定义数据 DATA ENDS;数据段结束 CODE SEGMENTCODE;定义代码段CODEASSUME CS:CODE,DS:DATA,SS:STACK;确定CS/DS/SS指向;的逻辑段 START:MOVAX,DATA;设置数据段的段地址DS MOVDS,AX;程序代码 MOVAX,4C00H;返回DOS INT21HCODEENDS;代码段结束END START;汇编结束,程序起始位置为START,1完整段定义伪指令,完整段定义由SEGMENT和ENDS这一对伪指令实现。格式:段名 SEGMENT 定位类型 组合类型 类别;语句序列 段名 ENDS功能:SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束。,(1)段定位(Align)类型指定逻辑段在主存储器中的边界,该关键字可表示为:BYTE:段开始地址为字节地址(xxxx xxxxB),属性值为1;WORD:段开始地址为字地址(xxxx xxx0B),属性值为2;DWORD:段开始地址为4的倍数(xxxx xx00B),属性值为4PARA:段开始地址为16的倍数(xxxx 0000B),即节地址,属性值为16PAGE:表示段开始地址256的倍数(0000 0000B),即页地址,属性值为256,(2)段组合(Combine)类型指定多个逻辑段之间的关系。组合的关键字有:PRIVATE:PUBLIC:STACK:COMMON:AT,(3)段类别(Class)当连接程序组织段时,将所有的同类别段相邻分配。段类别可以是任意名称,但必须位于单引号中;大多数MASM程序使用CODE,DATA和STACK来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续。,2指定段寄存器伪指令,格式:ASSUME 段寄存器:段名,段寄存器名:段名,功能:ASSUME伪指令通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系。CODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA MOVAX,DATA MOVDS,AX MOVES,AX MOVAX,STACK MOVSS,AX CODE ENDS,3GROUP段组伪指令,格式:组名 GROUP 段名,段名,功能:伪指令GROUP把多个同类段合并为一个64KB物理段,并用一个组名统一存取它。例如:DATA1 SEGMENT WORD PUBLIC CONST;常量数据段 CONST1DW100 DATA1 ENDS DATA2 SEGMENT WORD PUBLIC VARS;变量数据段 VAR1 DW?DATA2ENDS DATAGROUP GROUPDATA1,DATA2;进行组合,4段顺序伪指令,段在主存中的实际顺序是可以设置的.(1).SEG段顺序伪指令 伪指令格式:.SEG 功能:按照源程序的各段顺序排序。(2).DOSSEG段顺序伪指令伪指令格式:.DOSSEG 功能:其它微软的程序设计语言按照标准DOS规定进行排序,即代码段、数据段、堆栈段。(3).ALPHA段顺序伪指令伪指令格式:.ALPHA 功能:按照段名的字母顺序排序。,5.定位伪指令,(1)ORG伪指令 ORG 100h;从100h处安排数据或程序 ORG$+10;使偏移地址加10,即跳过10个字节空间(2)EVEN伪指令EVEN伪指令使当前偏移地址指针指向偶数地址,即若原地址指针已指向偶地址,则不作调整;否则将地址指针加1,使地址指针偶数化。用途:EVEN可以对齐字数据。(3)ALIGN伪指令将当前偏移地址指针指向n(n是2的乘方)的整数倍的地址,即若原地址指针已指向n的整数倍地址,则不作调整;,4.3.3.2 简化段定义的格式,.MODEL SMALL;定义程序的存储模式;(一般采用SMALL).STACK;定义堆栈段.DATA;定义数据段;数据定义.CODE;定义代码段.STARTUP;程序起始点,并建立DS,SS内容;程序代码.EXIT 0;程序结束点,返回DOS;子程序代码 END;汇编结束,1.存储模式伪指令,格式:.MODEL 存储模式,语言类型,操作系统类型,堆栈选项MASM有7种不同的存储模式TINY(微型模式)SMALL(小型模式)COMPACT(紧凑模式)MEDIUM(中型模式)LARGE(大型模式)HUGE(巨型模式)FLAT(平展模式),2简化段定义伪指令,1.STACK堆栈段伪指令 2.DATA数据段伪指令 3.CODE 代码段伪指令,4程序开始伪指令.STARTUP 5程序终止伪指令.EXIT返回数码.EXIT 0 等效于 MOV AH,4CH INT21H 6汇编结束伪指令 END,4.4 复杂数据结构(自学),结构记录,4.4.1 结构1结构类型的说明,伪指令格式:结构名STRUCT;数据定义语句 结构名ENDS 例如:下述语句段说明了学生成绩结构。STUDENTSTRUCT SIDDW?SNAMEDBABCDEFGH MATH DB0 ENGLISH DB0 STUDENTENDS,2结构变量的定义,变量名 结构名 STU1STUDENT STU2STUDENT STUDENT100 DUP();预留100个结构变量空间,3结构变量及其字段的引用,结构变量名.结构字段名 MOVSTU1.MATH,95;执行指令后,将对MATH域;的值更新为95。,4.4.2 记录,1记录类型的说明 记录名RECORD位段,位段 记录中位段的格式定义如下:位段名:位数表达式 例如:PERSONRECORD YEAR:4,SEX:1=0,MARRIAGE:1=1,2记录变量的定义,记录变量定义的格式为:记录变量名 记录名 例如:ZHANGPERSON;该字节值为:00100010B=22H WANGPERSON;该字节值为:00100100B=24H,3记录变量的引用和记录操作符,记录变量通过它的变量名直接引用,表示它的字节或字值,4.5 过程定义伪指令,在MASM中,过程的含义和子程序是一样的,一个过程可以被其它程序所调用,这个过程的最后一条指令,一般是返回指令。过程定义伪指令的格式为:过程名PROCNEAR或过程名PROCFAR RET 过程名ENDP,过程定义的属性有两种,标有NEAR(或不标,默认为NEAR)表示在段内被调用,标有FAR属性可以被其它段调用。这两种调用的返回指令都是RET,但在汇编时产生的代码不同,对前者代码为C3,后者代码为CBH 调用一个过程的格式为:CALL 过程名,过程入口的符号地址,4.6 宏汇编,宏是具有宏名的一段汇编语句序列。经过定义的宏,只要写出宏名,就可以在源程序中调用它。,4.6.1 宏的定义和调用,1宏定义宏定义由一对宏汇编伪指令MACRO/ENDM来完成。格式:宏名 MACRO形参表 宏定义体 ENDM例:MAINBEGINMACROMOV AX,DATA MOV DS,AXENDM,;定义名为MAINBEGIN的宏,无参数,;宏定义体,;宏定义结束,2宏调用宏调用遵循先定义后调用的原则。格式:宏名实参表(1)宏定义允许嵌套,即宏定义中可以有宏调用,只要遵循先定义后调用的原则。例:DOSINT21MACRO FUNCTION;宏定义 MOVAH,FUNCTION INT21H ENDM DISPMSGMACRO MESSAGE;含有宏调用的宏定义 MOVDX,OFFSET MESSAGE DOSINT21 9;宏调用 ENDM,上述宏定义汇编后的列表文件如下。DISPMSGMSG;宏调用 MOVDX,OFFSET MSG;宏展开(第一层)DOSINT219 MOVAH,9;宏展开(第二层)INT21H(2)宏定义内也允许递归调用,这种情况需要用到后面将介绍的条件汇编指令给出递归出口条件。,4.6.2 宏的参数,例4.13 具有多个参数的宏定义。使用8086的移位指令有时感到不便,因为当移位次数大于1时,必须利用CL寄存器。现在用宏指令SHLEXT扩展逻辑左移SHL的功能。SHLEXT MACROSHLOPRAND,SHLNUM PUSHCX MOVCL,SHLNUM;SHLNUM表示移位次数 SHLSHLOPRAND,CL;SHLOPRAND表示被;移位的操作数 POPCX ENDM,当我们要将AX左移6位时,可以采用如下宏指令:SHLEXTAX,6 汇编后,宏展开为:PUSHCX MOVCL,06 SHLAX,CX POPCX,这是宏的参数,宏操作符:&替换操作符,用于将参数与其它字符分开。字符串传递操作符。用于括起字符串。!转义操作符。用于指示其后的一个字符作为一般字符,而不含特殊意义。表达式操作符。用在宏调用中,表示将随后 的一个表达式的值作为实参,而不是将表达式本身作为参数。;宏注释符。用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现。另外,宏定义中还可以用“:REQ”说明设定不可缺参数,用“:默认值”设定参数默认值。,例4.15:用于字符串的宏定义参数DSTRINGMACRO STRING DB&STRING&,0DH,0AH,$ENDM1、要定义字符串THIS IS A EXAMPLE,宏调用如下。DSTRING 它产生的宏展开为:DB THIS IS A EXAMPLE,0DH,0AH,$2、宏调用为DSTRING(1024 1)则宏展开为 DB 1023,0DH,0AH,$,4.6.3 与宏有关的伪指令,1局部标号伪指令LOCAL问题提出:宏定义可被多次调用,当宏定义中使用了标号,同一源程序对它的多次调用就会造成标号的重复定义,汇编将出现语法错误。解决:如果宏定义体采用了标号,可以使用局部标号伪指令LOCAL加以说明。格式:LOCAL标号列表功能:每次宏展开时汇编程序将对其中的标号自动产生一个唯一的标识符(其形式为“?0000”到“?FFFF”),避免宏展开后的标号重复 注意:LOCAL伪指令只能在宏定义体内使用,而且是宏定义MACRO语句之后的第一条语句,两者间也不允许有注释和分号。,ABSOL MACRO OPRD LOCALNEXT CMP OPRD,0 JGENEXT NEG OPRDNEXT:ENDM;这个伪指;令要独占一行,采用例4.15宏定义的宏调用形式为:ABSOLWORD PTR BX ABSOLBX 上述宏调用下的宏展开为:CMPWORD PTR BX,0 JGE?0000 NEGWORD PTR BX?0000:CMPBX,0 JGE?0001 NEGBX?0001:,2宏定义删除伪指令PURGE当我们不需要某个宏定义时,可以把它删除 格式:PURGE宏名表允许宏名与其它指令包括伪指令同名,此时宏名优先级最高。当不再使用这个宏定义时,及时用PURGE删除即恢复原指令功能。3宏定义退出伪指令EXITM 格式:EXITM它可用于宏定义体、重复汇编的重复块以及条件汇编的分支代码序列中,汇编程序执行EXITM指令后立即停止它后面部分的宏展开。,4.6.4 宏与子程序,共同点都可以把一段程序用一个名字定义,简化源程序的结构和设计。区别:宏调用在汇编时进行程序语句的展开,不需要返回;子程序调用在执行时由CALL指令转向子程序体,需要执行RET指令返回;宏调用仅是源程序级的简化,并不减小目标程序,子程序还是目标程序级的简化,形成的目标代码较短,宏调用简单、直接,不需要返回;子程序需要利用堆栈保存和恢复转移地址、寄存器等,要占用一定的时空开销;宏调用的参数通过形参、实参结合实现传递,子程序需要利用寄存器、存储单元或堆栈等传递参数。对宏调用来说,参数传递错误通常是语法错误,会由汇编程序发现;而对子程序来说,参数传递错误通常反映为逻辑或运行错误,不易排除。当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序。,4.7 基本汇编语言程序设计,汇编语言源程序主体(代码段)可以有顺序、分支、循环、子程序和宏等结构。早期版本的汇编程序不直接支持结构化程序设计,可以用微处理器指令系统中的转移指令、循环指令、子程序调用及返回指令,实现程序的各种结构形式。,4.7.1 顺序程序设计,例4.18 求两个数的平均值。这两个数分别放在X单元和Y单元中,而平均值放在Z单元中。根据题意,所设计的程序如下:.MODELSMALL.STACK.DATA XDB8CH Y DB64H ZDB?,.CODE.STARTUP MOVAL,X;AL8CHADDAL,Y;AL8CH+64H MOVAH,00H;AH00HADCAH,00H;进位送AHMOVBL,2;除数2BLDIVBL;AX除以BL的内容,;商AL,余数AHMOVZ,AL;结果送入Z单元.EXIT 0END,4.7.2 分支程序设计,单分支IFTHEN双分支IFTHENELSE实现程序的分支结构的指令:JMP指令仅实现了转移到指定位置,Jcc指令则可根据条件转移到指定位置或不转移而顺序执行后续指令序列。,1单分支结构,例4.20 计算AX中符号数绝对值的程序段。请选择分支条件为AX0 CMPAX,0 JGENONNEG NEGAX;条件不满足,负数,;执行分支体进行求补NONNEG:MOV RESULT,AX;条件满足,;为正数,保存结果,请选择分支条件为AX 0编写程序段 CMPAX,0 JLYESNEG JMP NONENG;条件不满足,正数,;转向保存结果YESNEG:NEG AX;条件满足,为负数,;需要求补NONNEG:MOV RESULT,AX;保存结果选择分支条件不当,不仅多了一个JMP指令,而且也容易出错。,2双分支结构,对于双分支程序,顺序执行的分支语句体1不会自动跳过分支语句体2,所以分支语句体1最后一定要有一条JMP指令跳过分支体2,即分支汇点处;否则将进入顺序分支语句体2而出现错误。,例4.21 显示BX最高位的程序段。SHLBX,1;BX最高位移入CF标志 JCONE MOVDL,0;CF0,即最高位为0;DL0 JMPTWO;一定要跳过另一个分支体ONE:MOVDL,1;DL1TWO:MOVAH,2 INT21H;显示,请选择条件转移指令JNC试试看该程序也可以修改成为单分支程序结构。提示:事先假设一种情况,假设BX最高位为0,则只要BX最高位为1才需要执行分支语句。MOVDL,0;DL0 SHLBX,1;BX最高位移入CF标志 JNCTWO;CF0,即最高位为0,转移 MOVDL,1;CF1,即最高位为1,DL1 TWO:MOVAH,2 INT21H;显示,由此可见,编写分支程序,我们必须留心分支的开始点和结束点,当出现多分支时更是如此。这正是汇编语言编写程序的繁杂体现之一,也是我们学习上的一个难点。,3分支程序设计,例4.22 判断方程AX2+BXC0是否有实根,若有实根则将字节变量TAG置1,否则置0。假设A、B、C均为字节变量,数据范围为128+127。分析:二元一次方程有根的条件是:B24AC0。依据题意,首先计算出B2和4AC,然后比较两者大小,根据比较结果分别给TAG赋不同的值。,.CODE.STARTUP MOV AL,_B IMUL AL MOV BX,AX;BX中为B2 MOV AL,_A IMUL _C MOV CX,4 IMUL CX;AX中为4AC,按照题目设DX不含有效数值 CMP BX,AX;比较二者大小 JGE YES;条件满足?MOV TAG,0;第一分支体:条件不满足,TAG0 JMP DONE;跳过第二个分支体YES:MOV TAG,1;第二分支体:条件满足,TAG1DONE:.EXIT 0 END,.MODELSMALL.STACK.DATA _A DB?_B DB?_C DB?TAG DB?,实际上,程序中利用这两种基本分支结构可以形成许多分支形式。,DOS功能调用利用AH指定各个子功能,我们就可以采用如下程序段,实现多分支:ORAH,AH;等效于CMP AH,0 JZFUNCTION0;AH0,转向FUNCTION0 DECAH;等效于CMPAH,1 JZFUNCTIONL;AH1,转向FUNCTIONL DECAH;等效于CMP AH,2 JZFUNCTION2;AH2,转向FUNCTION2,如果分支较多,上述方法显得有些繁琐。我们可以构造一个入口地址表,下面通过一个简单的示例说明。,自己和自己“或”值不变,知道中断向量表的工作原理吗?,例4.23 设计根据键盘输入的18数字转向8个不同的处理程序段的程序。分析:在数据段定义一个存储区,顺序存放8个处理程序段的起始地址。即构造处理程序的入口地址表。方法:假设所有程序都在一个代码段,所以,用字定义伪指令DW存入处理程序的偏移地址。另外,为了具有良好的交互性,程序首先提示输入数字,然后判断是否为18。不是有效数字,则重新提示;若是有效数字,则形成表中的正确偏移,并按地址表跳转。,如果不在同一个代码段怎么办?,还记得下面的例子吗?A1 DB 1,2OFFSETA1 DW A1ADDRESSA1 DD A1,.MODELSMALL.STACK.DATAMSGDBInput number(18):,0dh,0ah,$MSG1DBChapter 1:,0dh,0ah,$MSG2DBChapter 2:,0dh,0ah,$MSG3DB Chapter 3:,0dh,0ah,$MSG4DB Chapter 4:,0dh,0ah,$MSG5DB Chapter5:,0dh,0ah,$MSG6DBChapter 6:,0dh,0ah,$MSG7DBChapter 7:,0dh,0ah,$MSG8DBChapter 8:,0dh,0ah,$TABLE DW DISP1,DISP2,DISP3,DISP4,DISP5 DW DISP6,DISP7,DISP8;各个标号的偏移地址.CODE.STARTUP,START1:MOVDX,OFFSET MSG;提示输入数字 MOVAH,9 INT21H MOVAH,1;等待按键 INT21H CMPAL,1;数字8?JA START1 ANDAX,0FH;将ASCII码转换成数字 DECAX SHLAX,1;等效于ADD AX,AX MOVBX,AX JMPTABLEBX;IPTABLE+BXSTART2:MOVAH,9 INT21H.EXIT 0,注:偏移地址从0开始,地址表定义的类型是字,DISP1:MOVDX,OFFSET MSG1;处理程序1 JMP START2DISP2:MOVDX,OFFSET MSG2;处理程序2 JMP START2DISP3:MOV DX,OFFSET MSG3;处理程序3 JMP START2 DISP8:MOVDX,OFFSET MSG8;处理程序8 JMP START2 END,4.7.3 循环程序设计,1循环结构循环初始部分:开始循环准备必要的条件,如循环次数、循环体需要的初始值等。循环体部分:是循环工作的主要部分,是为完成某种特定功能而设计的重复执行的程序段。修改部分:对循环条件、相关信息(如计数器的值、操作数地址等)进行修改的程序段。循环控制部分:判断循环条件是否成立,决定是否继续循环,,2循环程序设计例4.24 计算1100数字之和,并将结果存入字变量SUM中 分析:程序要求SUM1+2+3+99+100,这是一个典型的记数循环,完成100次简单加法。编写一个100次的计数循环结构;

    注意事项

    本文(汇编语言课件第4章80X86汇编语言程序设计.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开