您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 06徐洁第4章汇编语言程序设计知识
第四章汇编语言程序设计及知识§4.1汇编语句格式§4.2伪指令§4.3汇编程序设计举例§4.1汇编语句格式用89C51汇编语言编写的源程序行(一条语句)包括四个部分,也叫四个字段:〔标号:〕〔操作码〕〔操作数〕;〔注释〕每个字段之间要用分隔符分隔,而每个字段内部不能使用分隔符。可以用作分隔符的符号:空格“”、冒号“:”、、逗号“,”、分号“;”等。例:LOOP:MOVA,#00H;立即数00H→A标号标号是用户定义的符号地址。一条指令的标号是该条指令的符号名字,标号的值是汇编这条指令时指令的地址。标号由以英文字母开始的1~8个字母或数字组成,以冒号“:”结尾。标号可以由赋值伪指令赋值,如果没有赋值,汇编程序把存放该指令目标码第一字节的存储单元的地址赋给该标号,所以,标号又叫指令标号。操作码操作码是必不可少的。它用一组字母符号表示指令的操作码。在89C51中,由89C51的指令助记符组成。操作数汇编语言指令可能要求或不要求操作数,所以这一字段可能有也可能没有。若有两个操作数,操作数之间用逗号“,”分开。操作数包括的内容有:(1)工作寄存器:由PSW.3和PSW.4规定的当前工作寄存器区中的R0~R7。(2)特殊功能寄存器:21个SFR的名字。(3)标号名:赋值标号—由汇编指令EQU等赋值的标号;指令标号—指令标号指示的指令的第一字节地址是该标号的值。(4)常数:可用二进制(B)、十进制、十六进制(H),若常数以字符开头,前面加0。(5)$:用来表示程序计数器的当前值。例如:“JNBTF0,$”(6)表达式:汇编时,计算出表达式的值填入目标码。注释注释部分不是汇编语言的功能部分,只是用语增加程序的可读性。良好的注释是汇编语言程序编写中的重要组成部分。§4.2伪指令伪指令不是真正的指令,无对应的机器码,在汇编时不产生目标程序,只是用来对汇编过程进行某种控制。ORG汇编起始命令格式:ORG16位地址功能:规定该伪指令后面程序的汇编地址,即汇编后生成目标程序存放的起始地址。例如:ORG2000HSTART:MOVA,#64H┇规定了START的地址是2000H,又规定了汇编后的第一条指令码从2000H开始存放。END汇编结束指令格式:END功能:通知汇编程序结束汇编。在END之后所有的汇编指令均不予以处理。EQU赋值命令格式:字符名称EQU项(数或汇编符号)功能:把“项”赋给“字符名称”。注意:字符名称不等于标号(其后没有冒号);其中的项,可以是数,也可以是汇编符号。EQU赋值过的符号名可以用作数据、代码地址、位地址或一个立即数。可以是8位的,也可以是16位的。例如:EQU赋值命令例1:AAEQUR1MOVA,AA;AA代表工作寄存器R1例2:A10EQU10DELYEQU07EBHMOVA,A10;A10作为片内的一个直接地址LCALLDELY;DELY作为一个16位子程序的入口地址DATA数据地址赋值命令格式:字符名称DATA表达式功能:与EQU类似,但有以下差别:1、EQU定义的字符名必须先定义后使用,而DATA定义的字符名可以后定义先使用。2、用EQU伪指令可以把一个汇编符号赋给一个名字,而DATA只能把数据赋给字符名。3、DATA语句可以把一个表达式的值赋给字符名称,其中的表达式应是可求值的。DATA伪指令在程序中用来定义数据地址例如:FIRSTDATA30HSECONDATA31H:MOVA,FIRSTMOVR0,SECONDB定义字节命令格式:DB(项或项表)功能:通知汇编程序从当前ROM地址开始,保留一个字或字节串的存储单元,并存入DB后的数据。注意:项或项表可以是一个字节,用逗号隔开的字节串或括在单引号中的ASCII字符串。例如:DB定义字节命令ORG2000HDB0A3HLIST:DB26H,03HSTR:DB‘ABC’┇经汇编后(2000H)=A3H,(2001H)=26H,(2002H)=03H,(2003H)=41H,(2004H)=42H,(2005H)=43H,(41H,42H,43H分别为A,B,C的ASCII码)DW定义字命令格式:DW16位数据项或项表功能:把DW后的16位数据项或项表从当前地址连续存放。每项数值为16位二进制数,高8位先放,低8位后存放。DW用于定义一个地址表。例如:DW定义字命令ORG1500HTABLE:DW7234H,8AH,10H┇经汇编后(1500H)=72H,(1501H)=34H,(1502H)=00H,(1503H)=8AH,(1504H)=00H,(1505H)=10H,DS定义存储空间命令格式:DS表达式功能:在汇编时,从指定地址开始保留DS之后表达式的值所规定的存储单元以备后用。例如:ORG1000HDS08HDB30H,8AH汇编后,从1000H保留8个单元,然后从1008H按DB命令给内存赋值,即(1008H)=30H(1009H)=8AHBIT位地址符号命令格式:字符名BIT位地址功能:把BIT后的位地址值赋给字符名。其中字符名不是标号,其后没有冒号,但字符名是必须的。例如:A1BITP1.0A2BIT02H汇编后,P1口第0位的位地址90H就赋给了A1,而A2的值则为02H。§4.3汇编程序设计举例一简单程序设计举例二分支程序三循环程序四子程序设计举例五代码转换程序设计举例六运算类程序设计举例一简单程序设计举例例1:拆字。将片内RAM20H单元的内容拆成两段,每段四位。并将它们分别存入21H与22H单元中。程序如下:ORG2000HSTART:MOVR0,#21H;21H(R0)MOVA,20H;(20H)AANLA,#0FH;(A)#0FHAMOV@R0,A;(A)(R0)INCR0;(R0)+1R0MOVA,20H;(20H)ASWAPA,;(A03)(A47)ANLA,#0FH;(A)#0FHAMOV@R0,A;(A)(R0)例2:16位数求补。设16位二进制数在R1R0中,求补结果存于R3R2中。MOVA,R0CPLAADDA,#01HMOVR2,AMOVA,R1CPLAADDCA,#00HMOVR3,A二分支程序例1:片内RAMONE和TWO两个单元中存有两个无符号数,将两个数中的小者存入30H单元。程序如下:MOVA,ONECJNZA,TWO,BIGSJMPSTOREBIG:JCSTOREMOVA,TWOSTORE:MOV30H,A三循环程序例1:统计字节串长度。内存从STRING开始有一字节串,该字节串以$结束,试统计该字节串长度,结果存于NUM单元中。程序如下:NUMDATA20HSTRINGDATA21HCLRAMOVR0,#STRINGLOOP:CJNE@R0,#24H,NEXTSJMPCOMPNEXT:INCAINCR0SJMPLOOPCOMP:MOVNUM,A内存从STRING开始有一字节串,该字节串以$结束,试统计该字节串长度,结果存于NUM单元中。四子程序设计举例例1:用查表法编一子程序,将40H单元中“09”的BCD码转换成ASCII码。入口:待转换数在(40H)出口:转换后的数(40H)ORG1000HTABDB30H31H32H33H34HDB35H36H37H38H39HSUB1:MOVA,40HMOVDPTR,#TABMOVCA,@A+DPTRMOV40H,ARET若将30H单元BCD码转换成ASCII码,利用SUB1子程序。ORG0300HMOV40H,30HLCALLSUB1MOV30H,40H五代码转换程序设计举例例1:R1中存有一个BCD码,编一子程序将其转换为ASCII码,存入片外RAM1000H单元中去。ORG0100HBTOA:MOVA,R1ADDA,30HMOVDPTR,#1000HMOVX@DPTR,ARET六运算类程序设计举例例1:片内RAM30H单元开始有10个字节的二进制数。编一子程序,求它们的和。(和256)将和存入20H单元中。1ORG1000HSUM:MOVR0,#30HCLRAMOVR7,#10CLRCLOOP:ADDCA,@R0INCR0DJNZR7,LOOPMOV20H,ARET2ORG1000HSUM:MOVR0,#30HMOVA,@R0MOVR7,#09CLRCLOOP:INCR0ADDCA,@R0DJNZR7,LOOPMOV20H,ARET例2:编写将30H,31H单元中的两字节二进制数乘以2的程序(积小于65536)MU1:CLRCMOVA,30HRLCAMOV30H,AMOVA,31HRLCAMOV31H,ARET
本文标题:06徐洁第4章汇编语言程序设计知识
链接地址:https://www.777doc.com/doc-3794010 .html