汇编语言ch9.ppt

上传人:s****8 文档编号:68701204 上传时间:2022-12-29 格式:PPT 页数:32 大小:328KB
返回 下载 相关 举报
汇编语言ch9.ppt_第1页
第1页 / 共32页
汇编语言ch9.ppt_第2页
第2页 / 共32页
点击查看更多>>
资源描述

《汇编语言ch9.ppt》由会员分享,可在线阅读,更多相关《汇编语言ch9.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第九章第九章 高级宏汇编语言高级宏汇编语言9.1 结构结构 结构就是将逻辑上有一定关系的一组数据,以某种方式组结构就是将逻辑上有一定关系的一组数据,以某种方式组合在一起所形成的数据形式。合在一起所形成的数据形式。比如,将学生的学籍档案以结构的数据形式来表示。每个比如,将学生的学籍档案以结构的数据形式来表示。每个学生的各种数据,如姓名、学号、年龄和各科成绩等等,组成学生的各种数据,如姓名、学号、年龄和各科成绩等等,组成了一个结构型数据。了一个结构型数据。一、结构的定义一、结构的定义结构的定义使用结构伪指令,其格式为:结构的定义使用结构伪指令,其格式为:结构名结构名 STRUC 结构名结构名 EN

2、DS1 在一个源程序中结构名必须是唯一的。数据定义语句序在一个源程序中结构名必须是唯一的。数据定义语句序列是用列是用DB、DW或或DD定义的变量,作为结构中的各字段定义的变量,作为结构中的各字段(Fields),),所定义的各变量名称为所定义的各变量名称为结构字段名结构字段名。例如:例如:STUDENT STRUC CLASS DB 25060801 NUM DB?NAME DB 15 DUP(?)(?)SCORE DB?STUDENT ENDS注意:使用伪指令注意:使用伪指令STRUC/ENDS定义的结构不产生目标代定义的结构不产生目标代码,而定义的各个字段也不分配存储单元。码,而定义的各个

3、字段也不分配存储单元。2二、结构的预置与存储分配二、结构的预置与存储分配其中:结构名使用其中:结构名使用STRUC/ENDS定义的结构。定义的结构。结构变量名结构变量名是结构副本的标识符,与其它变量一样,它也有三是结构副本的标识符,与其它变量一样,它也有三个属性:段、偏移量和类型属性。类型属性表示结构的总字节个属性:段、偏移量和类型属性。类型属性表示结构的总字节数。数。结构预置结构预置:用定义的结构预置副本,设置结构变量,分配用定义的结构预置副本,设置结构变量,分配存储空间。存储空间。结构变量名结构变量名 结构名结构名 结构变量预置语句的格式为:结构变量预置语句的格式为:字段值表字段值表是为结

4、构副本中各字段的值进行预置,必须用一对尖是为结构副本中各字段的值进行预置,必须用一对尖括号括起来。括号括起来。3例如:例如:DATA SEGMENT STU1 STUDENT ;不改变结构定义时的初值定义不改变结构定义时的初值定义 STU2 STUDENT ;只改变第一个字段的值只改变第一个字段的值 STU3 STUDENT ;第一个字段不变第一个字段不变,其其余重置余重置 STU4 STUDENT 10H DUP();同时预置同时预置10H个副本个副本,每个副本只修改第一个字段初值。每个副本只修改第一个字段初值。DATA ENDS4三、对结构变量及其字段的操作三、对结构变量及其字段的操作 结

5、构变量的使用与一般变量一样,可以作为一条指令的结构变量的使用与一般变量一样,可以作为一条指令的操作数。操作数。需注意的是,需注意的是,TYPE运算符作用结构变量,其返回值为运算符作用结构变量,其返回值为该结构变量的总字节数。该结构变量的总字节数。MOV AX,TYPE STU1 ;AX=25MOV BH,LENGTH STU2 ;BH=1MOV BL,LENGTH STU4 ;BL=10HMOV CX,SIZE STU3 ;CX=25MOV DX,SIZE STU4 ;DX=16*25例如:例如:5结构变量字段的结构变量字段的使用与一般变量的使用完全相同。使用与一般变量的使用完全相同。MOV

6、SI,OFFSET STU1.CLASS ;SI=0MOV DI,OFFSET STU2.CLASS ;DI=25MOV AX,LENGTH STU1.NAME ;AX=15MOV BX,OFFSET STU2MOV BX.SCORE,80 ;将将STU2的的SCORE字段赋值字段赋值80 访问结构变量中的字段要使用结构字段运算符访问结构变量中的字段要使用结构字段运算符“.”结构变量名结构变量名.结构字段名结构字段名其使用格式为:其使用格式为:例如:例如:6四、程序举例四、程序举例BLOCK STRUCFB1 DB?FB2 DB?FB3 DW 10H DUP(?)BLOCK ENDSDATA

7、SEGMENTSTRU_VAR BLOCK 20 DUP()DATA ENDS要求在要求在20个结构变量的个结构变量的FB1字段中依次存入字母字段中依次存入字母A、B、C、D.,在在FB2字段中依次存入字母字段中依次存入字母Z、Y、X、W、V、.。例例1 现有结构定义和预置如下:现有结构定义和预置如下:7 MOV DI,OFFSET STRU_VAR ;取结构变量首址取结构变量首址 MOV AL,A ;取初始化字段内容取初始化字段内容 MOV AH,Z MOV CX,LENGTH STRU_VAR ;取结构变量个数取结构变量个数LOP:MOV DI.FB1,AL ;依次向字段送字母依次向字段送

8、字母 MOV DI.FB2,AH INC AL ;修改字段内容修改字段内容 DEC AH ADD DI,TYPE STRU_VAR;修改指针修改指针 LOOP LOP主要程序段编制如下:主要程序段编制如下:8例例2 设学生学籍结构为设学生学籍结构为SC1SC7是是7个连续字段,分别记载个连续字段,分别记载每个学生的每个学生的7门课程的成绩;门课程的成绩;AVERAGE字段是该学生的平均字段是该学生的平均成绩。在数据段预置了成绩。在数据段预置了30位学生的结构副本。另有程序已完位学生的结构副本。另有程序已完成成30位学生的成绩录入。要求编制一子程序计算位学生的成绩录入。要求编制一子程序计算30位

9、学生位学生7门门课程的平均成绩并送入相应的课程的平均成绩并送入相应的AVERAGE字段中。字段中。结构定义和数据段中结构预置如下:结构定义和数据段中结构预置如下:STUD_SCOR STRUC:SC1 DB 0SC2 DB 0SC3 DB 0SC4 DB 0SC5 DB 0SC6 DB 0SC7 DB 0AVERAGE DB 0STUD_SCOR ENDS:CLA_SCOR STUD_SCOR 30 DUP()9SCORE PROC LEA BX,CLA_SCOR;取第一个结构副本首址送取第一个结构副本首址送BX MOV CX,30 ;计算平均成绩的总人数计算平均成绩的总人数LOP1:XOR

10、AX,AX PUSH CX LEA SI,BX.SC1;SI88时,汇时,汇编程序自动将记录定义为字(编程序自动将记录定义为字(1616位),否则定义为字节(位),否则定义为字节(8 8位)。位)。11根据字段定义的顺序,先定义的在高位,最后定义的字段在最根据字段定义的顺序,先定义的在高位,最后定义的字段在最低位。如果各字段之和低位。如果各字段之和8或或16,则未定义的高位以,则未定义的高位以“0”填充。填充。REC1 RECORD F1:4,F2:2,F3:6,F4:4REC2 RECORD FE1:2,FE2:4,FE3:1,FE4:1REC3 RECORD FF1:3,FF2:4,FF3

11、:3,FF4:3 REC4 RECORD FD1:3=100B,FD2:=2,FD3:1=1例如:例如:上述定义的各记录的字段分配如下图所示。上述定义的各记录的字段分配如下图所示。15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0REC1F1F2F3F4 7 6 5 4 3 2 1 0REC2FE1FE2FE3FE412 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0REC3未用未用 FF1 FF2 FF3 FF4 7 6 5 4 3 2 1 0REC4未用未用 FD1 FD2 FD3记录定义时不进行存储分配,只有当预置了记录时,才分记录定义

12、时不进行存储分配,只有当预置了记录时,才分配存储空间。配存储空间。13二、记录的预置与存储分配二、记录的预置与存储分配其中记录变量名是可选项,如果选用,它就是记录副本的标其中记录变量名是可选项,如果选用,它就是记录副本的标识符。识符。记录变量预置语句的格式:记录变量预置语句的格式:记录变量名记录变量名 记录名记录名 字段值表字段值表 在字段值表中未指定初值的字段,用逗号表示,它将使用定在字段值表中未指定初值的字段,用逗号表示,它将使用定义的初值,若定义时未指定值,则用义的初值,若定义时未指定值,则用0填入。填入。14例如:例如:DA1 REC1 DA2 REC2 DA3 REC3 5 DUP(

13、)DA4 REC4 DA5 REC4 DA6 REC4 10H DUP()上述各记录预置后,按字节或字分配存储单元。例上述各记录预置后,按字节或字分配存储单元。例如对记录变量如对记录变量DA3分配存储单元如下:分配存储单元如下:未用未用 FF1 FF2 FF3 FF4 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0111111110000000015三、记录运算符三、记录运算符在宏汇编中有几个运算符是专门用于对记录进行操作。在宏汇编中有几个运算符是专门用于对记录进行操作。1、记录宽度运算符(、记录宽度运算符(WIDTH)WIDTH运算可作用于记录名或记录字段名。其运

14、算结果运算可作用于记录名或记录字段名。其运算结果是返回该记录或记录字段的宽度(二进制数的位数)。是返回该记录或记录字段的宽度(二进制数的位数)。NF1 EQU WIDTH REC1 ;NF1=10HNF2 EQU WIDTH F3 ;NF2=06HNF3 EQU WIDTH F4 ;NF3=04H MOV AH,WIDTH REC2;(AH)=08H MOV AL,WIDTH FE1;(AL)=02H MOV BH,WIDTH REC3;(BH)=0DH MOV BL,WIDTH FF2;(BL)=04H例如:例如:162.移位值运算移位值运算MOV BL,F1 ;(;(BL)=0CHMOV

15、BH,F2 ;(BH)=0AHMOV CL,F3 ;(CL)=04HMOV CH,F4 ;(CH)=00H在语句中如果直接将记录字段名作为一个操作数引用,则表在语句中如果直接将记录字段名作为一个操作数引用,则表示取该字段的最低位移到所在记录的最低位所需的移位次数。示取该字段的最低位移到所在记录的最低位所需的移位次数。例如:例如:3、记录屏蔽运算符、记录屏蔽运算符 在记录字段名前加上在记录字段名前加上MASK运算符,将返回该记录字段运算符,将返回该记录字段在记录中的屏蔽码。所谓屏蔽码是指该字段的各位为在记录中的屏蔽码。所谓屏蔽码是指该字段的各位为1其余各其余各字段全为字段全为0,所构成的编码。,

16、所构成的编码。例如:例如:MOV AX,MASK F1 ;(AX)=0F000HMOV BL,MASK FE2 ;(BL)=3CHMOV CX,MASK FF3 ;(CX)=38HMOV BH,MASK FD1 ;(BH)=38H17四、对记录及其字段的操作四、对记录及其字段的操作1、对记录变量的操作、对记录变量的操作MOV AX,DA1 ;取出取出DA1记录变量的值记录变量的值0AE56H送送AXMOV BL,DA2 ;BL=61HMOV DA3+4,CX;将将CX内容送内容送DA3的第三个记录变量的第三个记录变量对预置的记录变量,就可以象普通变量一样进行存取。对预置的记录变量,就可以象普通

17、变量一样进行存取。例如:例如:2、对记录操作数的操作、对记录操作数的操作 在程序中,可以直接将已经定义的记录名作操作数使用,在程序中,可以直接将已经定义的记录名作操作数使用,它被作为一个常数使用,即寻址方式为立即数寻址。它被作为一个常数使用,即寻址方式为立即数寻址。使用时,记录名后必须有一对尖括号。如果括号中无内使用时,记录名后必须有一对尖括号。如果括号中无内容,表示使用记录定义时的初值。也可以为各字段重新指定容,表示使用记录定义时的初值。也可以为各字段重新指定值。值。18MOV AX,REC1;对记录对记录REC1的各字段赋值后的各字段赋值后,其值其值0BBA7H送送AXMOV BL,REC

18、4 ;将记录将记录REC4的的FD2和和FD3字段清零后,其值字段清零后,其值20H送送BLMOV BH,REC4 ;将记录将记录REC4的原来值送的原来值送BH,注意未定义的位用注意未定义的位用0填充填充MOV CL,REC4+REC4;将将20H+25H的值的值45H送送CL3、对记录字段的操作、对记录字段的操作 由于一个记录字段是一个字节或一个字中的某几位,在处由于一个记录字段是一个字节或一个字中的某几位,在处理时,需要将记录变量作为一个整体进行操作。理时,需要将记录变量作为一个整体进行操作。MOV AX,DA1 ;取记录变量取记录变量AND AX,MASK F2;用屏蔽码分离出用屏蔽码

19、分离出F2字段字段MOV CL,F2 ;取取F2的移位值送的移位值送CLSHR AX,CL 如果要修改记录变量的字段,可先取出,修改后再存回记如果要修改记录变量的字段,可先取出,修改后再存回记录变量中。录变量中。例如:例如:例如下面的程序段是将记录变量例如下面的程序段是将记录变量DA1的的F2字段取出,并将其移字段取出,并将其移位到最右边。位到最右边。199.3 宏指令宏指令 在汇编源程序设计中,如果要多次重复使用某一个程序在汇编源程序设计中,如果要多次重复使用某一个程序段,这些程序段虽然出现位置不同,但功能完全相同,或者段,这些程序段虽然出现位置不同,但功能完全相同,或者只是修改某些操作数字

20、段。这时可使用宏指令来实现。只是修改某些操作数字段。这时可使用宏指令来实现。一、宏功能的使用过程一、宏功能的使用过程宏功能的使用过程包括:宏定义,宏调用和宏展开宏功能的使用过程包括:宏定义,宏调用和宏展开使用宏指令可以使源程序更加清晰,易于阅读,简化重复使用宏指令可以使源程序更加清晰,易于阅读,简化重复程序的编写。程序的编写。1、宏定义、宏定义 宏定义使用一对伪指令宏定义使用一对伪指令MACRO和和ENDM。宏定义格宏定义格式有两种。式有两种。20(1)不带参数的宏定义)不带参数的宏定义(2)带参数的宏定义)带参数的宏定义宏名宏名 MACRO :ENDM宏宏体体宏名宏名 MACRO 形参形参1

21、,形参,形参2,.:ENDM宏宏体体注意:宏定义本身不生成任何目标代码。注意:宏定义本身不生成任何目标代码。212、宏调用、宏调用宏调用就在源程序的任意位置直接引用已经定义的宏名。宏调用就在源程序的任意位置直接引用已经定义的宏名。所构成的语句称为宏指令语句。所构成的语句称为宏指令语句。*无参数宏调用:无参数宏调用:宏名宏名*带参数宏调用:带参数宏调用:宏名宏名 实参实参1,实参,实参2,.宏调用分为无参数调用和带参数调用,其格式分别为:宏调用分为无参数调用和带参数调用,其格式分别为:22INPUT MACRO ;定义宏定义宏INPUT MOV AH,01H INT 21H AND AL,0FH

22、 ENDMEXCHANGE MACRO BY1,BY2 ;定义宏定义宏EXCHANGE PUSH AX MOV AL,BY1 XCHG AL,BY2 MOV BY1,AL POP AX ENDM :INPUT ;调用宏调用宏INPUT :EXCHANGE DA_BY1,DA_BY2;调用宏调用宏EXCHANGE :例如:例如:带参数宏调用时,实参与形参的排列顺序应一致。如果实参的个数比带参数宏调用时,实参与形参的排列顺序应一致。如果实参的个数比形参多,则多余的实参将被略去。如果实参的个数比形参少,则未指定的形参多,则多余的实参将被略去。如果实参的个数比形参少,则未指定的形参将用形参将用“空白串

23、空白串”替代。替代。233、宏展开、宏展开 宏展开是指汇编程序在汇编源程序过程中,当扫描到宏指宏展开是指汇编程序在汇编源程序过程中,当扫描到宏指令语句时,将用宏定义中的宏体的程序段目标代码替代宏指令令语句时,将用宏定义中的宏体的程序段目标代码替代宏指令语句。对于带参数的宏调用,将同时用相应的实参替代宏体中语句。对于带参数的宏调用,将同时用相应的实参替代宏体中对应的形参。对应的形参。24SHIFT MACRO VAR,REG,SHF,NUM,DEST MOV REG,VAR MOV CL,NUM S&SHF REG,CL ;SHF为形参为形参 MOV DEST,REG ENDM :SHIFT D

24、A_WORD,AX,AR,CONT+1,例如:例如:上述宏展开后为:上述宏展开后为:MOV AX,DA_WORDMOV CL,CONU+1SAR AX,CLMOV WORD PTR DEST1+2,AX二、连接符二、连接符&和带空格或逗号的实参和带空格或逗号的实参 在宏定义时,可以将形参作为一个字符串中的一部分,这在宏定义时,可以将形参作为一个字符串中的一部分,这时需要使用连接符时需要使用连接符&。在宏调用时,可以在实参中包含空格和逗号字符,这时需在宏调用时,可以在实参中包含空格和逗号字符,这时需要用要用“”将实参括起来。将实参括起来。25三、局部符号伪指令三、局部符号伪指令LOCAL为此,需

25、要在宏定义的宏体中用为此,需要在宏定义的宏体中用LOCAL伪指令对标识符进行说明。在宏展伪指令对标识符进行说明。在宏展开时,将这些标识符转换为开时,将这些标识符转换为?XXXX。其中,其中,XXXX为四位十六进制数,根为四位十六进制数,根据宏调用的顺序依次为据宏调用的顺序依次为0000,0001,.FFFF。;用连加实现无符号数相乘用连加实现无符号数相乘MULTIP MACRO MULT1,MULT2,MULT3 LOCAL LOP,EXIT0 MOV DX,MULT1 MOV CX,MULT2 XOR AX,AX JCXZ EXIT0LOP:ADD AX,DX LOOP LOPEXIT0:M

26、OV MULT3,AX ENDM 当一个宏定义中包含有变量或标号定义时,如果在一个源程序当一个宏定义中包含有变量或标号定义时,如果在一个源程序中被多次宏调用,则将在程序中产生多个同名的标识符。这显中被多次宏调用,则将在程序中产生多个同名的标识符。这显然将出现语法错误。然将出现语法错误。例如:例如:26 :MULTIP DA1,DA2,DA3+MOV DX,DA1+MOV CX,DA2+XOR AX,AX+JCXZ?0001+?0000:ADD AX,DX+LOOP?0000+?0001:MOV DA3,AX MULTIP DA1+1,DA2+1,DA3+1+MOV DX,DA1+1+MOV C

27、X,DA2+1+XOR AX,AX+JCXZ?0003+?0002:ADD AX,DX+LOOP?0002+?0003:MOV DA3+1,AX :279.4 重复汇编重复汇编 使用重复汇编伪指令可以让汇编程序对某些语句序列进行使用重复汇编伪指令可以让汇编程序对某些语句序列进行重复汇编。重复汇编指令可以有以下三种。重复汇编。重复汇编指令可以有以下三种。1、定重复、定重复REPT 表达式表达式 :ENDM重复语句序列重复语句序列M=0NUM=5 REPT 5 M=M+1 DB NUM*M ENDM 例如:例如:上述语句经汇编后等效下面的语句:上述语句经汇编后等效下面的语句:DB 5,0AH,0F

28、H,14H,19H 表达式的值为表达式的值为REPT与与ENDM之间的语句序列重复汇编的次数之间的语句序列重复汇编的次数282、不定重复、不定重复格式:格式:IRP 形参形参,:ENDM 重复语句序列重复语句序列IRP与与ENDM之间语句序列的重复汇编次数由实参的个数所之间语句序列的重复汇编次数由实参的个数所确定,每次重复汇编时,依次用实参表中的实参替代形参。确定,每次重复汇编时,依次用实参表中的实参替代形参。如上例用不定重复:如上例用不定重复:NUM=5 IRP M,DB NUM*M ENDM;将将AX、BX、CX、DX压栈压栈IRP REG,PUSH REGENDM等效为:等效为:PUSH

29、 AXPUSH BXPUSH CXPUSH DX又如:又如:293、不定重复字符、不定重复字符格式:格式:IRPC 形参形参,字符串字符串:ENDM重复语句序列重复语句序列 IRPC与与ENDM之间的语句序列的重复次数由字符串中之间的语句序列的重复次数由字符串中字符的个数来确定。每次汇编重复语句序列时,依次用字字符的个数来确定。每次汇编重复语句序列时,依次用字符串中一个字符替代形参。符串中一个字符替代形参。IRPC CHR,ABCDEFGH DB&CHR&ENDM例如:例如:等效于:等效于:DBABCDEFGH309.5 条件汇编条件汇编 使用条件汇编,可以使宏汇编语言源程序中某些部分,使用条

30、件汇编,可以使宏汇编语言源程序中某些部分,在汇编期间按照给定条件产生目标代码或不产生目标代码。在汇编期间按照给定条件产生目标代码或不产生目标代码。基本格式:基本格式:IF XX 表达式表达式 :ELSE :ENDIF条件块条件块1条件块条件块2 其中:其中:XX为指定的条件,如果在汇编时,指定的条件成为指定的条件,如果在汇编时,指定的条件成立,则将条件块立,则将条件块1的语句序列汇编成相应的目标代码,否则汇的语句序列汇编成相应的目标代码,否则汇编条件块编条件块2。ELSE及相应的条件块及相应的条件块2为可选项。为可选项。31 除了上述基本的条件汇编伪指令外,除了上述基本的条件汇编伪指令外,MASM还提供还提供其他的条件汇编伪指令。如下表所示。其他的条件汇编伪指令。如下表所示。32

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

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

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