您好,欢迎访问三一刀客
当前位置:首页 > 电子/通信 > 综合/其它 > 《汇编语言程序设计》-相伟-电子教案第2章
21世纪高等院校规划教材汇编语言程序设计相伟主编徐小平李珍香副主编中国水利水电出版社第二章程序设计基础本章学习目标通过本章学习,读者应该掌握以下内容:汇编语言源程序结构及基本概念各种寻址方式常用伪指令的格式、功能常用I/O功能调用的用法2.1汇编语言源程序结构2.1.1汇编语言源程序结构及分析初学程序设计最有效的方法是阅读源程序并上机调试。通过阅读程序可以掌握程序的一般结构,学习实现程序功能的经典算法。通过对程序进行上机调试,逐渐掌握指令的语法格式、功能,避免编写源程序时出现常见的语法错误,同时训练调试技巧。例2-1显示信息“Howdoyoudo?”DATASEGMENTSTRDB“Howdoyoudo?$”DATAENDSSTACKSEGMENTSTACKDB200DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXLEADX,STRMOVAH,9INT21HMOVAH,4CHINT21HCODEENDSENDSTART例2-2将内存缓冲区中以BUFA开始的一组字数据传送到BUFB开始的内存区。DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDWCOUNTDUP(?DATAENDSSTACKSEGMENTSTACKDB200DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXLEASI,BUFALEADI,BUFBMOVCX,COUNTLOP:MOVAX,[SI]MOV[DI],AXINCSIINCSIINCDIINCDIDECCXJNZLOPMOVAH,4CHINT21HCODEENDSENDSTART2.1.2机器指令简介8086/8088指令系统提供的机器指令从功能上可分为7种类型:数据传送指令算术运算指令位运算指令程序控制指令串操作指令处理器控制指令输入/输出指令所有机器指令从格式上看,有3种指令格式:①无操作数指令格式:助记符例如:STCCLCCMC②单操作数指令格式:助记符操作数例如:PUSHAXPOPBX③双操作数指令格式:助记符目的操作数,源操作数例如:MOVCX,DX2.1.3常量、变量、标号及表达式1.常量常量是指汇编语言源程序中以数值常数、字符串常数和符号常数的形式存在的量。注意:当数值常量的值是十六进制形式,并且第一个字符是大写字母A~F或小写字母a~f时,需要在数值前面加一个0,如:0A64DH。例如:在下面的汇编源程序中,带下画线的量就是常量DATASEGMENTSTRDB“Howdoyoudo?$”DATAENDSSTACKSEGMENTSTACKDB200DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXLEADX,STRMOVAH,9INT21HMOVAH,4CHINT21HCODEENDSENDSTART例如:在下面的数据段中,带下画线的是一个符号常数,它是使用EQU伪指令定义的。DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDWCOUNTDUP(?)DATAENDS定义符号常数使用EQU伪指令、“=”伪指令。2.变量变量是指数据存储单元地址的符号表示,变量的值在程序运行过程中可以改变。(1)变量的定义定义变量使用伪指令DB、DW、DD、DQ、DT。DB用来定义字节变量,字节变量占1个存储单元,可存储一个字节数据。DW用来定义字变量,字变量占2个存储单元,可存储一个字数据。DD用来定义双字变量,双字变量占4个存储单元,可存储一个双字数据。DQ用来定义四字类型变量,四字类型变量占8个存储单元,可存储8字节数据。DT用来定义十字节类型变量,十字节类型变量占10个存储单元,可存储10字节数据。例如:在数据段DATA中定义字节变量STR。DATASEGMENTSTRDB“Howdoyoudo?$”DATAENDS例如:在数据段DATA中定义了字变量BUFA和BUFB。DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDWCOUNTDUP(?)DATAENDS(2)变量的属性变量有三个属性,即段属性、偏移地址属性、类型属性。段属性:指变量所在段的段地址。偏移地址属性:指变量所定义的单元到变量所在段的开始位置之间的字节距离。类型属性:由定义变量使用的伪指令确定。DB定义的变量的类型属性为字节类型(BYTE),DW定义的变量的类型属性为字类型(WORD),DD定义的变量的类型属性为双字类型(DWORD),DT定义的变量的类型属性为四字类型,DQ定义的变量的类型属性为十字节类型。3.标号标号是指机器指令存储单元地址的符号表示。(1)标号的定义LOP:MOVAX,[SI]MOV[DI],AXINCSIINCSIINCDIINCDIDECCXJNZLOP(2)标号的属性标号与变量一样,也具有三个属性,即段属性、偏移地址属性、类型属性。段属性:指标号所在段的段地址。偏移地址属性:指标号所定义的单元到标号所在段的开始位置之间的字节距离。类型属性:标号的类型属性分为近类型NEAR和远类型FAR。NEAR类型的标号称为近标号,近标号只能用于段内转移。FAR类型的标号称为远标号,远标号既可用于段内转移,也可用于段间转移。4.表达式由常量、变量、标号、运算符和括号组成的有意义的式子称为表达式。其中运算符又可分为算术运算符、逻辑运算符、关系运算符及其他运算符。表达式的计算结果是一个常数,该常数可以作为指令的操作数使用。(1)算术运算符表2-1算术运算符算术运算符功能+加-减*乘/除MOD取余例如:算术表达式的计算219/7=3186.4/2.6=33219MOD7的结果为2(2)关系运算符表2-2关系运算符关系运算符功能EQ相等NE不相等LT小于GT大于LE小于等于GE大于等于例如:假设NUM的值为60H。则:NUMGT80HNUMEQ60H⑶逻辑运算符表2-3逻辑运算符逻辑运算符功能AND与OR或XOR异或NOT非SHR逻辑右移SHL逻辑左移例如:假设NUM的值为6BH则:NUMAND87H;表达式的值是03HNUMOR87H;表达式的值是0EFHNUMXOR87H;表达式的值是0ECHNOT87H;表达式的值是78HNUMSHR2;表达式的值是1AHNUMSHL2;表达式的值是0ACH⑷其他运算符属性分离运算符(SEG、OFFSET、TYPE、LENGTH、SIZE)属性定义运算符(PTR、THIS、SHORT、HIGH、LOW、“:”)以及()、[]、、·、MASK、WIDTH。①SEGSEG返回其后变量或标号所在段的段地址。②OFFSETOFFSET返回其后变量或标号的偏移地址。DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDWCOUNTDUP(?)DATAENDSMOVAX,SEGBUFAMOVDS,AXMOVSI,OFFSETBUFAMOVDI,OFFSETBUFB③TYPE返回其后变量或标号的类型。表2-4TYPE返回值类型返回值变量DB1DW2DD4DQ8标号NEAR-1或0FFHFAR-2或0FEH例如:在下面的数据段中。DATASEGMENTADB87H,45H,92HBDW34D6H,0F67HCDD?DATAENDS若在代码段中有如下指令:MOVAH,TYPEAMOVAL,TYPEBMOVCH,TYPEC则将被汇编成:MOVAH,1MOVAL,2MOVCH,4④LENGTH例如:在下面的数据段中。DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDWCOUNTDUP(?)DATAENDS若在代码段中有如下两条指令MOVCX,LENGTHBUFAMOVDX,LENGTHBUFB则将被汇编成:MOVCX,1MOVDX,6⑤SIZE例如:在下面的数据段中。DATASEGMENTBUFADW367BH,2845H,0A78H,9DE3H,0F6BH,6532HCOUNTEQU($-BUFA)/2BUFBDWCOUNTDUP(?)DATAENDS若在代码段中有如下两条指令MOVCX,SIZEBUFAMOVDX,SIZEBUFB则将被汇编成:MOVCX,2MOVDX,12⑥PTR和THISPTR用来指明某个变量、标号或地址的类型属性,使它临时具有与原定义所不同的类型属性,但保持他们原来的段属性和偏移属性不变。PTR的使用格式为:类型PTR表达式其中,表达式的类型可以是BYTE、WORD、DWORD、NEAR、FAR等。例如DATASEGMENTADB87H,45H,92HBDW34D6H,0F67HCDD?DATAENDSMOVAX,WORDPTRAMOVBL,BYTEPTRB例如:MOV[SI],30H若将上述指令的操作数改为字操作数,则指令为:MOVWORDPTR[SI],30H或者:MOV[SI],WORDPTR30H若将上述指令的操作数改为字节操作数,则指令为:MOVBYTEPTR[SI],30H或者:MOV[SI],BYTEPTR30H⑦SHORTSHORT表示转移指令的目标地址属性是短转移,即目标地址与本指令之间的字节距离在-128~+127之间。例如:JMPSHORTLOP2⑧HIGH和LOWHIGH选取表达式计算结果的高8位。LOW选取表达式计算结果的低8位。例如:HIGH0F25AH的值是0F2HLOW0F25AH的值是5AH⑨段前缀运算符:运算符“:”用于临时给变量、标号或地址指定一个段属性,且只在所出现的语句中有效,“:”并不改变地址的偏移地址属性和类型属性。例如:MOV[SI],AX指令的功能是将AX寄存器的值存放到数据段DS中偏移地址为(SI)的字单元中,假如需要将将AX寄存器的值存放到附加数据段ES中偏移地址为(SI)的字单元中,则要在[SI]的前面加段前缀ES。指令改为:MOVES:[SI],AX运算符的优先级如表2-5所示。表2-5运算符的优先级优先级运算符1LENGTH、SIZE、WTDTH、MASK、·、()、、[]、2PTR、OFFSET、SEG、TYPE、THIS、段前缀运算符(:)3HIGH、LOW4*、/、MOD、SHL、SHR5+、-6EQ、NE、LT、LE、GT、GE7NOT8AND9OR、XOR10SHORT2.2寻址方式在指令中,指定操作数或操作数地址的方法称为寻址方式。操作数的各种寻址方式是汇编语言进行程序设计的基础,必须熟练掌握。2.2.1立即寻址立即寻址是指操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,立即数紧跟在操作码之后,与操作码一起存放在代码段中。如果立即数为16位,则立即数的存放规则是高字节存放在高地址,低字节存放在低地址。立即数寻址方式通常用于给寄存器或内存单元赋初值。例如:阅读以下各条指令,掌握立即寻址方式的用法。MOVAL,80HMOVBX,0A683HMOVX,20H;X是字节变量MOVY,3456H;Y是字变量实际上,在汇编语言程序设计中,还经常使用符号常数作为立即操作数。比如,假设COUNT是在程序中定义的一个符号常数,它代表一组数据的个数,则将该组数据的个数送入CX寄存器的指令如下:MOVAX,COUNT上述指令中的源操作数COUNT是立即寻址
本文标题:《汇编语言程序设计》-相伟-电子教案第2章
链接地址:https://www.111doc.com/doc-63851 .html